107. Java 继承 - 总结:方法重写与隐藏

44 阅读3分钟

107. Java 继承 - 总结:方法重写与隐藏

在 Java 中,定义与超类中的方法具有相同签名的方法时,不同类型的方法之间会有不同的行为。以下是一个总结表,帮助您更清晰地理解子类实例方法和静态方法与超类方法的关系:

子类方法类型超类实例方法超类静态方法
子类实例方法重写(Overrides)生成编译时错误
子类静态方法生成编译时错误隐藏(Hides)
详细解释:
  1. 子类实例方法与超类实例方法

    • 当子类中定义的方法与超类的实例方法具有相同的签名(方法名、参数类型和数量、返回类型),子类会重写(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() 方法。调用 Dogsound() 方法将输出 "Bark"。

  2. 子类实例方法与超类静态方法

    • 编译时错误:如果子类定义了一个与超类静态方法具有相同签名的方法,将会产生编译时错误。因为静态方法与实例方法不同,静态方法是根据类来调用的,而实例方法是根据对象来调用的。

    示例:

    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");
        }
    }
    
  3. 子类静态方法与超类实例方法

    • 编译时错误:如果子类定义了一个与超类实例方法具有相同签名的静态方法,会产生编译时错误。静态方法不能访问实例方法,因此不能与实例方法同名。
  4. 子类静态方法与超类静态方法

    • 隐藏(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() 方法,并且可以定义自己的重载方法。


总结

  • 实例方法重写:子类可以重写超类的实例方法,覆盖父类的实现。
  • 静态方法隐藏:子类可以隐藏超类的静态方法,调用哪个版本的方法取决于对象的引用类型。
  • 方法重载:子类可以重载超类的方法,重载的方法是新的,与超类实例方法无关。

通过理解这些基本规则,学员可以清晰地掌握方法重写与静态方法隐藏的概念,避免在多态和继承中出现常见的错误。