Java类与对象的深入探索
立即解锁
发布时间: 2025-08-19 00:11:23 阅读量: 12 订阅数: 31 


Java编程基础与Android开发入门
### Java 类与对象的深入探索
在 Java 编程中,类和对象是核心概念,它们为构建复杂的软件系统提供了强大的支持。下面将详细介绍 Java 中类和对象的相关知识,包括类字段的声明与访问、只读字段的声明、方法的声明与调用等内容。
#### 1. 类字段的声明与访问
在很多情况下,实例字段就能满足需求,但有时需要一个无论创建多少对象都只有一份副本的字段。例如,想要跟踪创建的 `Car` 对象的数量,引入一个计数器实例字段(初始化为 0),并在类的构造函数中每次创建对象时将计数器的值加 1。然而,由于每个对象都有自己的计数器实例字段副本,该字段的值永远不会超过 1。
为了解决这个问题,可以使用 `static` 关键字将计数器声明为类字段。以下是示例代码:
```java
public class Car {
String make;
String model;
int numDoors;
static int counter;
Car(String make, String model) {
this(make, model, 4);
}
Car(String make, String model, int numDoors) {
this.make = make;
this.model = model;
this.numDoors = numDoors;
counter++; // This code is unsafe because counter can be accessed directly.
}
public static void main(String[] args) {
Car myCar = new Car("Toyota", "Camry");
Car yourCar = new Car("Mazda", "RX-8", 2);
System.out.println(Car.counter);
}
}
```
上述代码中,`static` 前缀表示 `counter` 字段只有一份副本,而不是每个对象都有一份。当类被加载到内存中时,类字段会被初始化为默认的零值,例如 `counter` 会被初始化为 0。每次创建对象时,由于 `Car` 构造函数中的 `counter++` 表达式,`counter` 的值会增加 1。
与实例字段不同,类字段通常通过成员访问运算符直接访问。虽然可以通过对象引用访问类字段(如 `myCar.counter`),但按照惯例,使用类名访问类字段(如 `Car.counter`)更合适,也更容易识别代码正在访问类字段。
如果在 `Car` 类的 `main()` 方法中,可以直接访问 `counter`,如 `System.out.println(counter);`。但在其他类的 `main()` 方法中访问 `counter`,则需要指定 `Car.counter`。运行上述代码,输出结果为 2,因为创建了两个 `Car` 对象。
#### 2. 只读实例和类字段的声明
之前声明的字段既可以写入也可以读取,但有时需要声明只读字段,例如表示常量值的字段,如圆周率 `pi`(3.14159…)。Java 提供了保留字 `final` 来实现这一需求。
每个对象都会有自己的只读实例字段副本。该字段必须在字段声明时或类的构造函数中进行初始化。在构造函数中初始化时,只读实例字段被称为空白 `final`,因为在构造函数中赋值之前它没有值。由于构造函数可能为每个对象的空白 `final` 分配不同的值,这些只读变量并非真正的常量。
如果需要一个真正的常量,即所有对象都可用的单个只读值,则需要创建只读类字段。可以通过在字段声明中同时包含保留字 `static` 和 `final` 来实现。以下是示例代码:
```java
class Employee {
final static int RETIREMENT_AGE = 65;
}
```
上述代码中,`RETIREMENT_AGE` 声明是编译时常量的一个示例。由于 `static` 关键字,其值只有一份副本,并且由于 `final` 关键字,该值永远不会改变,编译器可以通过将常量值插入到所有使用它的计算中来优化编译代码,从而使代码运行更快,因为无需访问只读类字段。
#### 3. 字段访问规则回顾
之前的字段访问示例可能会让人感到困惑,因为有时可以直接指定字段名,而有时则需要在字段名前加上对象引用或类名以及成员访问运算符。以下规则可以帮助你在不同上下文中访问字段:
- **类字段**:
- 在类字段声明所在的同一类中,可以直接指定类字段的名称,例如 `counter`。
- 在类外部,需要指定类字段的类名,后跟成员访问运算符,再跟类字段的名称,例如 `Car.counter`。
- **实例字段**:
- 在实例字段声明所在的同一类的任何实例方法、构造函数或实例初始化器中,可以直接指定实例字段的名称,例如 `numDoors`。
- 在实例字段声明所在的同一类的任何类方法或类初始化器中,或者在类外部,需要指定对象引用,后跟成员访问运算符,再跟实例字段的名称,例如 `Car car = new Car(); car.numDoors = 2;`。
需要注意的是,最后一条规则并不意味着可以从类上下文访问实例字段,实际上是从对象上下文访问字段。
此外,还有两种字段访问场景需要考虑:声明与实例字段或类字段同名的局部变量(甚至参数)。在这两种情况下,局部变量/参数会遮蔽(隐藏或掩盖)字段。如果发现声明的局部变量或参数遮蔽了字段,可以重命名局部变量/参数,或者使用成员访问运算符和保留字 `this`(实例字段)或类名(类字段)来明确标识字段。例如,在 `Car` 类的构造函数中,可以使用 `this.make = make;` 来区分实例字段和同名参数。
#### 4. 通过方法表示行为
Java 允许通过方法表示行为,方法是在类体中声明的命名代码块。实体行为通过实例方法描述,同时 Java 也支持与类相关而不是与对象相关的行为,为此提供了类方法来描述这些类行为。
##### 4.1 声明和调用实例方法
可以通过指定返回类型名称、方法标识符、参数列表和花括号分隔的方法体来声明实例方法。以下是一个 `Car` 类中声明 `printDetails()` 实例方法的示例:
```java
public class Car {
String make;
String model;
int numDoors;
Car(String make, String model) {
this(make, model, 4);
}
Car(String make, String model, int numDoors) {
this.make = make;
this.model = model;
this.numDoors = numDoors;
}
void printDetails() {
System.out.println("Make = " + make);
System.out.println("Model = " + model);
System.out.println("Number of doors = " + numDoors);
System.out.println();
}
public static void main(String[] args) {
Car myCar = new Car("Toyota", "Camry");
myCar.printDetails();
Car yourCar = new Car("Mazda", "RX-8", 2);
yourCar.printDetails();
}
}
```
上述代码中,`printDetails()` 是一个实例方法。按照惯例
0
0
复制全文
相关推荐










