107. Java 继承 - 总结:方法重写与隐藏
在 Java 中,定义与超类中的方法具有相同签名的方法时,不同类型的方法之间会有不同的行为。以下是一个总结表,帮助您更清晰地理解子类实例方法和静态方法与超类方法的关系:
| 子类方法类型 | 超类实例方法 | 超类静态方法 |
|---|---|---|
| 子类实例方法 | 重写(Overrides) | 生成编译时错误 |
| 子类静态方法 | 生成编译时错误 | 隐藏(Hides) |
详细解释:
-
子类实例方法与超类实例方法
- 当子类中定义的方法与超类的实例方法具有相同的签名(方法名、参数类型和数量、返回类型),子类会重写(override)超类的方法。此时,调用子类的实例方法会使用子类的方法实现,而不再使用超类的方法。
示例:
class Animal { public void sound() { System.out.println("Animal sound"); } } class Dog extends Animal { @Override public void sound() { System.out.println("Bark"); } }在这个例子中,
Dog类重写了Animal类的sound()方法。调用Dog的sound()方法将输出 "Bark"。 -
子类实例方法与超类静态方法
- 编译时错误:如果子类定义了一个与超类静态方法具有相同签名的方法,将会产生编译时错误。因为静态方法与实例方法不同,静态方法是根据类来调用的,而实例方法是根据对象来调用的。
示例:
class Animal { public static void test() { System.out.println("Static method in Animal"); } } class Dog extends Animal { // 编译时错误:不能重写静态方法 public void test() { System.out.println("Static method in Dog"); } } -
子类静态方法与超类实例方法
- 编译时错误:如果子类定义了一个与超类实例方法具有相同签名的静态方法,会产生编译时错误。静态方法不能访问实例方法,因此不能与实例方法同名。
-
子类静态方法与超类静态方法
- 隐藏(Hides):当子类中定义的静态方法与超类中的静态方法具有相同签名时,子类的方法将隐藏超类的静态方法。此时,如果从子类调用该方法,将调用子类中的静态方法,而不再调用超类中的静态方法。
示例:
class Animal { public static void test() { System.out.println("Static method in Animal"); } } class Dog extends Animal { public static void test() { System.out.println("Static method in Dog"); } } public class Main { public static void main(String[] args) { Animal.test(); // 输出: Static method in Animal Dog.test(); // 输出: Static method in Dog } }在这个例子中,
Dog类隐藏了Animal类的test()静态方法,因此调用Dog.test()会输出 "Static method in Dog",而调用Animal.test()会输出 "Static method in Animal"。
方法重载
值得注意的是,在子类中,方法重载与方法重写是不同的。重载是指在同一个类中,定义多个方法名称相同但参数不同(包括类型、数量或顺序)的多个方法。重载的的方法既不隐藏也不覆盖超类的实例方法,而是视为新方法,对子类来说是唯一的。
示例:
class Animal {
public void speak() {
System.out.println("Animal speaks");
}
}
class Dog extends Animal {
// 重载方法,不是覆盖
public void speak(int times) {
System.out.println("Dog barks " + times + " times");
}
}
在这个例子中,Dog 类中的 speak(int times) 方法是重载的方法,不会覆盖超类中的 speak() 方法。Dog 类仍然保有父类的 speak() 方法,并且可以定义自己的重载方法。
总结
- 实例方法重写:子类可以重写超类的实例方法,覆盖父类的实现。
- 静态方法隐藏:子类可以隐藏超类的静态方法,调用哪个版本的方法取决于对象的引用类型。
- 方法重载:子类可以重载超类的方法,重载的方法是新的,与超类实例方法无关。
通过理解这些基本规则,学员可以清晰地掌握方法重写与静态方法隐藏的概念,避免在多态和继承中出现常见的错误。