提问者:小点点

为什么在 Java 中隐藏不好的做法


嗯,问题不是什么是方法或变量隐藏。问题是为什么不鼓励使用它。

如果有人清除了静态和动态绑定,一切似乎都是合乎逻辑的。我同意静态变量和方法应该按类名而不是对象引用来调用,以使代码易于理解,但为什么不鼓励这种隐藏的做法呢?

这仅仅是因为代码变得更容易阅读还是其他什么原因?


共2个答案

匿名用户

对静态方法进行重写没有多大意义,因为重写虽然是针对多态性的事情,但当您调用该方法时,您不是在操作对象,而是在操作类。所以它可能会让您以非静态方式执行它,并且您将受声明变量的类型而不是它的实例的约束。

匿名用户

我实际上对这里的文档非常满意(谢谢@baao):https://docs.oracle.com/javase/tutorial/java/IandI/override.html。

请注意隐藏和覆盖之间的区别: - 隐藏是指子类中的静态方法,其签名与超类中的静态方法相同,被认为是不好的做法 - 重写是允许子类修改继承行为的原因,并且不是坏做法。

我将再次使用文档中的示例:

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;
        myAnimal.testClassMethod();
        // "The static method in Animal"
        myAnimal.testInstanceMethod();
        // "The instance method in Cat"
    }
}

引用Java中隐藏的方法是什么?甚至JavaDoc的解释也令人困惑:“在实例而不是类上调用静态方法是一种非常糟糕的做法,永远不应该这样做。”