Java编程:引用类型、语句表达与运算符详解
立即解锁
发布时间: 2025-08-21 00:56:16 阅读量: 2 订阅数: 12 


Java编程艺术:从初学者到大师的进阶指南
# Java编程:引用类型、语句表达与运算符详解
## 1. 引用类型的工作原理
### 1.1 引用类型与基本类型的区别
在Java编程里,引用数据类型和基本数据类型的表现有所不同。使用基本数据类型变量时,只需声明变量并直接赋值。但对于引用数据类型,还需要使用`new`运算符来分配内存、创建对象,并将对象的内存位置值赋给引用标识符。
### 1.2 引用变量和对象的定义
- **引用变量**:在程序运行时,引用变量是一个标识符,可被赋予对象的内存位置值。一旦对象的内存位置值被赋给引用,就可以通过它访问对象的功能。
- **对象**:对象是一块内存区域,包含与类的特定实例相关的数据。使用`new`运算符为对象动态分配系统内存时,就创建了对象,这个过程称为实例化。
### 1.3 使用`new`运算符创建对象
下面的示例展示了如何使用`new`运算符实例化对象,并将其内存位置值赋给引用变量:
```java
public class TestClassTwo {
public static void main(String[] args){
Object object_reference = new Object();
System.out.println(object_reference.toString());
}
}
```
在这个例子中,第3行声明了一个名为`object_reference`的引用变量,同时使用`new`运算符在内存中创建了一个`java.lang.Object`类型的对象,并将其位置值赋给`object_reference`。`new`运算符后面跟着要创建对象的类名,类名后有一对括号,这被称为构造函数调用。构造函数是一种特殊的方法,用于在内存中正确设置或构造对象的实例。
对象创建后,可以通过引用变量访问其功能,如第4行调用`toString()`方法,该方法返回对象的字符串表示,包含对象名和代表对象哈希码的十六进制值。
### 1.4 垃圾回收机制
当想创建新对象并将其内存位置赋给现有引用变量时,只需再次使用`new`运算符。Java虚拟机通过垃圾回收器管理内存,会定期检查堆中的对象,确保它们有有效的引用指向。若没有,这些对象会被标记为待回收,其占用的内存空间将被释放,供其他对象使用。示例如下:
```java
public class TestClassTwo {
public static void main(String[] args){
Object object_reference = new Object();
System.out.println(object_reference.toString());
object_reference = new Object();
System.out.println(object_reference.toString());
}
}
```
第5行使用`new`运算符在堆上创建另一个`Object`类对象,新对象的内存位置值会覆盖`object_reference`中存储的旧值,使其指向新对象。此时,旧对象不再有引用指向,可被垃圾回收。
## 2. 从`main()`方法访问类成员
### 2.1 `main()`方法的特性
`main()`方法是静态方法,这意味着它只能直接访问被声明为静态的类变量或常量。
### 2.2 类变量/常量和实例变量/常量的定义
- **类变量/常量**:在类定义主体中,在任何方法之外声明为静态的变量或常量,称为类变量或常量,其值可供该类类型的所有动态创建的对象使用。
- **实例变量/常量**:在类定义主体中,在任何方法之外声明为非静态的变量或常量,称为实例变量或常量,每个动态创建的对象都有这些变量或常量的副本。要从静态方法访问实例变量或常量,需要对象的引用。
### 2.3 访问示例
以下是一个包含静态变量和实例变量声明的类示例:
```java
public class TestClassThree {
public static int static_int_variable; // main() can access this variable
private static int static_int_variable_2; // and this one too...
public int instance_int_variable; // But it needs a reference to an object
private int instance_int_variable_2; // to access these instance variables...
public static void main(String[] args){
System.out.println(static_int_variable);
System.out.println(static_int_variable_2);
System.out.println(TestClassThree.static_int_variable);
System.out.println(TestClassThree.static_int_variable_2);
TestClassThree tc3 = new TestClassThree();
System.out.println(tc3.instance_int_variable);
System.out.println(tc3.instance_int_variable_2);
}
}
```
从代码可知,`main()`方法可直接访问静态变量(第9、10行),也可使用全类名限定的方式访问(第11、12行)。要访问实例变量,`main()`方法需要一个`TestClassThree`对象的引用(第14行),通过引用变量`tc3`访问实例变量(第16、17行)。运行该程序,所有变量的值默认都为0。
## 3. 语句和表达式
### 3.1 语句的基本规则
Java程序由一系列语句和表达式构成,大部分语句以分号结尾。空语句就是一个单独的分号,两条语句可以在同一行,如`;;`。表达式语句如`int variable_name = 3;`。一系列语句可以包含在一个代码块中,代码块用一对花括号括起来。
### 3.2 示例分析
以下示例展示了不同类型的语句:
```java
public class StatementTest {
public static void main(String[] args){
;
;;
enclosed_block_1: {
int variable_name = 3;
System.out.println(variable_name);
}
enclosed_block_2: {
int variable_name = 5;
System.out.println(variable_name);
}
}
}
```
`StatementTest`类的`main()`方法包含多种语句。第4行有一个空语句,第5行有两个空语句。第6行是一个带标签的语句块`enclosed_block_1`,其中声明和使用的变量是该代码块的局部变量。第11行开始另一个带标签的语句块`enclosed_block_2`,其中也声明了一个同名变量`variable_name`。
## 4. 运算符
### 4.1 运算符概述
Java语句和表达式通常包含各种运算符,如赋值运算符`=`、加法运算符`+`和`new`运算符等。以下是Java运算符的详细列表:
| 运算符 | 优先级 | 结合性 | 操作数 | 描述 |
| --- | --- | --- | --- | --- |
| ++ | 15 | 从左到右 | 变量 | 后缀递增运算符 |
| -- | 15 | 从左到右 | 变量 | 后缀递减运算符 |
| (args) | 15 | 从左到右 | 方法,参数列表 | 方法调用 |
| [] | 15 | 从左到右 | 数组,整数 | 数组元素访问 |
| . | 15 | 从左到右 | 对象,成员 | 对象成员访问 |
| ! | 14 | 从右到左 | 布尔值 | 布尔非运算符 |
| ~ | 14 | 从右到左 | 整数 | 按位取反 |
| + | 14 | 从右到左 | 数字 | 一元加运算符 |
| - | 14 | 从右到左 | 数字 | 一元减运算符 |
| ++ | 14 | 从右到左 | 变量 | 前缀递增运算符 |
| -- | 14 | 从右到左 | 变量 | 前缀递减运算符 |
| (type) | 13 | 从右到左 | 类型,任意 | 类型转换(强制类型转换)运算符 |
| new | 13 | 从右到左 | 类,参数列表 | 对象创建运算符 |
| * | 12 | 从左到右 | 数字,数字 | 乘法运算符 |
| / | 12 | 从左到右 | 数字,数字 | 除法运算符 |
| % | 12 | 从左到右 | 整数,整数 | 整数取余(模)运算符 |
| + | 11 | 从左到右 | 数字,数字 | 加法运算符 |
| - | 11 | 从左到右 | 数字,数字 | 减法运算符 |
| + | 11 | 从左到右 | 字符串,任意 | 字符串连接运算符 |
| << | 10 | 从左到右 | 整数,整数 | 左移运算符 |
| >> | 10 | 从左到右 | 整数,整数 | 带符号扩展的右移运算符 |
| >>> | 10 | 从左到右 | 整数,整数 | 带零扩展的右移运算符 |
| instanceof | 9 | 从左到右 | 引用,类型 | 类型比较运算符 |
| < | 9 | 从左到右 | 数字,数字 | 小于运算符 |
| <= | 9 | 从左到右 | 数字,数字 | 小于或等于运算符 |
| > | 9 | 从左到右 | 数字,数字 | 大于运算符 |
| >= | 9 | 从左到右 | 数字,数字 | 大于或等于运算符 |
| != | 8 | 从左到右 | 引用,引用 | 不相等(不同对象)运算符 |
| == | 8 | 从左到右 | 引用,引用 | 相等(相同对象)运算符 |
| != | 8 | 从左到右 | 基本类型,基本类型 | 不相等(不同值)运算符 |
| == | 8 | 从左到右 | 基本类型,基本类型 | 相等(相同值)运算符 |
| & | 7 | 从左到右 | 布尔值,布尔值 | 布尔与运算符 |
| & | 7 | 从左到右 | 整数,整数 | 按位与运算符 |
| ^ | 6 | 从左到右 | 布尔值,布尔值 | 布尔异或运算符 |
| ^ | 6 | 从左到右 | 整数,整数 | 按位异或运算符 |
| \| | 5 | 从左到右 | 布尔值,布尔值 | 布尔或运算符 |
| \| | 5 | 从左到右 | 整数,整数 | 按位或运算符 |
| && | 4 | 从左到右 | 布尔,布尔 | 条件与运算符 |
| \|\| | 3 | 从左到右 | 布尔,布尔 | 条件或运算符 |
| ?: | 2 | 从右到左 | 布尔,任意,任意 | 三元条件运算符 |
| *=, /=, %=, +=, -=, <<=, >>=, >>>=, &=, \|=, ^= | 1 | 从右到左 | 变量,任意 | 组合赋值运算符 |
| = | 1 | 从右到左 | 变量,任意 | 赋值运算符 |
### 4.2 运算符表的阅读方法
运算符按优先级降序排列,优先级数字越高,运算符与操作数的绑定越紧密。有些运算符从左到右结合,有些从右到左结合。操作数列指定了运算符期望的操作数类型,部分运算符可对不同类型的操作数执行类似操作。
### 4.3 使用括号明确运算符优先级
在某些情况下,表达式中运算符的应用、结合和计算方式可能不清晰。例如:
```java
some_variable = 7 * 8 / 3 + 22 - 38;
```
严格按照运算符优先级计算会得到一个结果,而使用括号可以改变计算顺序,如:
```java
some_variable = 7 * (8 / (3 + (22 - 38)));
```
使用括号明确运算符的结合性,能使代码更易读,减少表达式出错的可能性。
### 4.4 常见运算符详细介绍
#### 4.4.1 算术运算符`+`、`-`、`*`、`/`
算术运算符用于执行加、减、乘、除运算,操作数为所有数值基本数据类型,包括`byte`、`short`、`int`、`long`、`float`和`double`。使用时要注意,操作的是数字的机器表示,每种基本数值数据类型都有授权值范围,若超出范围,程序可能出现意外行为。乘法`*`和除法`/`运算符优先级高于加法`+`和减法`-`,建议使用括号明确期望的计算顺序。当运算符应用于不同数据类型时,将较大数
0
0
复制全文
相关推荐










