文章目录
- 107. Java 继承 - 总结:方法重写与隐藏
- **详细解释:**
- **方法重载**
- **总结**
107. Java 继承 - 总结:方法重写与隐藏
在 Java 中,定义与超类中的方法具有相同签名的方法时,不同类型的方法之间会有不同的行为。以下是一个总结表,帮助您更清晰地理解子类实例方法和静态方法与超类方法的关系:
子类方法类型 | 超类实例方法 | 超类静态方法 |
---|---|---|
子类实例方法 | 重写(Overrides) | 生成编译时错误 |
子类静态方法 | 生成编译时错误 | 隐藏(Hides) |
详细解释:
-
子类实例方法与超类实例方法
- 当子类中定义的方法与超类的实例方法具有相同的签名(方法名、参数类型和数量、返回类型),子类会重写(override)超类的方法。此时,调用子类的实例方法会使用子类的方法实现,而不再使用超类的方法。
示例:
class Animal {public void sound() {System.out.println("Animal sound");} }class Dog extends Animal {@Overridepublic 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 AnimalDog.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()
方法,并且可以定义自己的重载方法。
总结
- 实例方法重写:子类可以重写超类的实例方法,覆盖父类的实现。
- 静态方法隐藏:子类可以隐藏超类的静态方法,调用哪个版本的方法取决于对象的引用类型。
- 方法重载:子类可以重载超类的方法,重载的方法是新的,与超类实例方法无关。
通过理解这些基本规则,学员可以清晰地掌握方法重写与静态方法隐藏的概念,避免在多态和继承中出现常见的错误。