0

有人可以解释一下原因和好处,例如隐藏方法和方法,特别是复制超类成员有什么好处?这难道不是与旨在进一步定义一个类并对其进行改进的继承相违背的吗?

4

2 回答 2

1

在 Java 中,当在通过继承相关的类中定义具有相同签名的静态方法时,就会发生方法隐藏。实例方法不会发生这种情况,在这种情况下会产生覆盖。

Java 语言设计者需要为其分配两种可能的语义之一——选择是隐藏还是覆盖静态方法。

我认为他们选择隐藏的原因是它更容易理解和实施。它还具有提高性能的强大潜力,因为静态方法的调度可以在编译时完成。

总的来说,这没什么大不了的,因为您也可以访问隐藏的方法,只要您指定定义隐藏静态方法的类名即可。

于 2014-02-22T02:23:50.267 回答
1

我强烈反对。由于元素只能在静态时隐藏,因此如果您使用通过声明类而不是通过其子类或实例调用静态元素的良好做法,则不会有任何区别。

作为取自Java 教程页面的示例

public class Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Animal");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Animal");
    }
}

public class Cat extends Animal {
    public static void testClassMethod() {
        System.out.println("The static method in Cat");
    }
    public void testInstanceMethod() {
        System.out.println("The instance method in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = myCat;
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}

将输出

The static method in Animal
The instance method in Cat

如您所见,即使使用同名实现的另一个静态方法,Animal 中声明的方法并没有真正隐藏,除非您调用Cat.testClassMethod();并期望相同的结果。

这里只是抽象继承概念的问题,因为静态元素并不是真正继承的,只是子类可以访问。

于 2014-02-22T02:34:13.507 回答