Java方法与字段:重载、重写及调用模式解析
立即解锁
发布时间: 2025-08-18 02:21:27 阅读量: 2 订阅数: 12 

### Java 方法与字段:重载、重写及调用模式解析
#### 1. 方法重载与二进制兼容性
在 Java 编程中,方法重载是一个常见的特性。当添加新的重载方法时,并不会破坏与现有二进制文件的兼容性。这是因为在编译现有二进制文件时,每个方法调用所使用的方法签名就已经确定了。所以,即使新添加的方法签名既适用又比最初选择的方法签名更具体,这些新方法也不会被使用。
例如,假设我们有以下代码:
```java
class Example {
public void print(int num) {
System.out.println("Printing integer: " + num);
}
}
```
如果我们添加一个新的重载方法:
```java
class Example {
public void print(int num) {
System.out.println("Printing integer: " + num);
}
public void print(double num) {
System.out.println("Printing double: " + num);
}
}
```
之前编译的使用 `print(int)` 方法的二进制文件仍然会调用原来的方法,而不会使用新添加的 `print(double)` 方法。
需要注意的是,删除公共方法是一个错误的做法,因为这会破坏二进制兼容性,无论该方法是否被重载。
#### 2. 方法重写与动态方法查找
##### 2.1 方法重写规则
当一个可访问的超类实例方法未被声明为 `final` 时,具有相同签名的子类实例方法会重写该超类方法。然而,声明为 `private`、`static` 或 `final` 的方法不能被重写,原因如下:
- **私有方法**:不可访问的方法(包括所有私有方法)不会被继承,因此不能被重写。子类可以自由声明与不可访问的超类实例方法具有相同名称或方法签名的方法,并且子类程序员不受编译器强制执行的方法契约的约束。
- **类方法**:类方法是隐藏的,而不是重写的。
- **`final` 方法**:`final` 方法修饰符的明确目的是防止子类重写超类实例方法(或隐藏超类类方法)。注意,`final` 类中的所有方法都隐式为 `final`,因为该类不能被扩展。
例如:
```java
class Superclass {
private void privateMethod() {
System.out.println("Superclass private method");
}
public static void staticMethod() {
System.out.println("Superclass static method");
}
public final void finalMethod() {
System.out.println("Superclass final method");
}
public void instanceMethod() {
System.out.println("Superclass instance method");
}
}
class Subclass extends Superclass {
// 可以声明同名的私有方法
private void privateMethod() {
System.out.println("Subclass private method");
}
// 隐藏超类的静态方法
public static void staticMethod() {
System.out.println("Subclass static method");
}
// 不能重写 final 方法
// public void finalMethod() { } // 编译错误
// 重写超类的实例方法
@Override
public void instanceMethod() {
System.out.println("Subclass instance method");
}
}
```
##### 2.2 多态与方法调用
在 Java 中,只有调用非私有实例方法的方法调用表达式才是多态的。字段访问表达式永远不是多态的。当调用实例方法时,`primaryExpression.methodName` 这种通用形式是多态的,因为主表达式会进行引用类型的扩展转换。
例如:
```java
class Test {
publ
```
0
0
复制全文
相关推荐









