Java面向对象编程:构造函数、this关键字、初始化器与静态成员详解
立即解锁
发布时间: 2025-08-18 00:27:48 阅读量: 1 订阅数: 19 

### Java面向对象编程:构造函数、this关键字、初始化器与静态成员详解
#### 1. 构造函数调用
在Java中,一个类的构造函数可以调用同一个类的其他构造函数,这可以通过使用特殊关键字`this`作为方法调用来实现。这种技术常用于有多个相互依赖的构造函数的情况。
例如,有如下`Actor`类:
```java
public class Actor
{
private String lastName;
private String firstName;
private boolean goodActor;
public Actor(String last, String first)
{
lastName = last;
firstName = first;
}
public Actor(String last, String first, boolean good)
{
this(last, first);
goodActor = good;
}
}
```
在上述代码中,第二个构造函数调用了第一个构造函数来设置`lastName`和`firstName`字段,然后再设置`goodActor`字段。
不过,使用`this`关键字调用构造函数有一些限制:
- **必须在构造函数的第一行调用**:例如,以下代码将无法编译:
```java
public Actor(String last, String first, boolean good)
{
goodActor = good;
this(last, first); // error: won't compile
}
```
如果尝试编译包含此构造函数的类,会得到“call to this must be first statement in constructor”的错误信息。
- **每个构造函数只能调用一个其他构造函数,但可以链式调用**:如果一个类有三个构造函数,第一个构造函数可以调用第二个,第二个再调用第三个。
- **不能形成构造函数相互调用的循环**:例如,以下`CrazyClass`类将无法编译:
```java
class CrazyClass
{
private String firstString;
private String secondString;
public CrazyClass(String first, String second)
{
this(first);
secondString = second;
}
public CrazyClass(String first)
{
this(first, "DEFAULT"); // error: won't compile
}
}
```
第一个构造函数调用第二个构造函数,而第二个又调用第一个,编译器会报错“recursive constructor invocation”,并拒绝编译该类。
如果在构造函数的第一行没有显式调用构造函数,Java会自动插入代码调用基类的默认构造函数。
#### 2. `this`关键字的更多用途
`this`关键字不仅可以在构造函数中调用同一个类的其他构造函数,还可以在类的构造函数或方法体中引用当前对象,即调用该构造函数或方法的类实例。
`this`关键字通常用于限定对当前对象实例变量的引用。例如:
```java
public Actor(String last, String first)
{
this.lastName = last;
this.firstName = first;
}
```
在这个例子中,`this`并不是必需的,因为编译器可以识别`lastName`和`firstName`是类变量。但如果构造函数的参数名与实例变量名相同,`this`关键字就必须使用,以区分参数和实例变量:
```java
public Actor(String lastName, String firstName)
{
this.lastName = lastName;
this.firstName = firstName;
}
```
`this`也可以在方法体中使用。例如:
```java
public String getFullName()
{
return this.firstName + " " + this.lastName;
}
```
虽然这个例子中没有歧义,`this`不是必需的,但许多程序员即使在不必要的情况下也喜欢使用`this`,因为它能明确表示引用的是实例变量。
有时,还可以单独使用`this`关键字将当前对象的引用作为方法参数传递。例如,可以使用以下语句将当前对象打印到控制台:
```java
System.out.println(this);
```
`println`方法会调用对象的`toString`方法获取对象的字符串表示形式,然后将其打印到控制台。默认情况下,`toString`方法会打印对象所属类的名称和对象的哈希码。如果希望`println`方法打印更有意义的内容,可以为类提供自己的`toString`方法。
#### 3. 初始化器的使用
初始化器(有时称为初始化块)是一段独立的代码块,位于任何方法、构造函数或其他代码块之外。无论使用哪个构造函数创建类的实例,初始化器都会在创建实例时执行。
初始化块类似于用于初始化变量的变量初始化器,但不同的是,初始化块可以包含多条语句。例如,以下`PrimeClass`类在初始化时从用户那里获取类字段的值:
```java
class PrimeClass
{
private Scanner sc = new Scanner(System.in);
public int x;
{
System.out.print(
"Enter the starting value for x: ");
x = sc.nextInt();
}
}
```
通常,也可以使用其他更直接的编码技术来实现相同的效果。例如,可以在构造函数中提示用户输入值,或者在字段初始化器中调用方法:
```java
class PrimeClass
{
private Scanner sc = new Scanner(System.in);
public int x = getX();
private int getX()
{
System.out.print("Enter the starting value "
+ "for x: ");
return sc.nextInt();
}
}
```
两种方式的效果相同。
关于初始化器,还有以下几点信息:
- **多个初始化器按顺序执行**:如果一个类包含多个初始化器,它们将按在程序中出现的顺序执行。
- **初始化器在构造函数之前执行**:初始化器会在任何类构造函数执行之前执行。
- **静态初始化器可初始化静态字段**:一种特殊的初始化块称为静态初始化器,可用于初始化静态字段。
- **初始化器有时用于匿名类**:初始化器有时会与匿名类一起使用。
#### 4. 静态成员的理解
在Java中,静态方法是不与类的实例关联的方法,它属于类本身。因此,可以在不创建类实例的情况下调用静态方法。静态字段和方法有许多常见用途,以下是一些例子:
|用途|示例|
| ---- | ---- |
|提供与类实例无关的常量或其他值|`Billing`类可能有一个名为`SALES_TAX_RATE`的
0
0
复制全文
相关推荐










