public class B extends A{
public static void main(String[] args) {
new B().privateMethod();//no error -output B-privateMethod.Sounds like overriding
new B().staticMethod(); //no error -output B-StaticMethod.Sounds like overriding
}
private void privateMethod() {
System.out.println("B-privateMethod.");
}
static void staticMethod() {
System.out.println("B-StaticMethod.");
}
}
class A{
private void privateMethod() {
System.out.println("A-privateMethod.");
}
static void staticMethod() {
System.out.println("A-StaticMethod.");
}
}
在 R&D 中,我发现了 privateMethod() 的情况——因为这个方法在子类的对象上不可用,所以子类和父类的 privateMethod() 是单独的方法,它们没有关系,所以这不是覆盖。 但是在 staticMethod() 的情况下 - 父类的方法在子类的对象上可用,当我们在子类中定义它时,子类的对象开始指向子类的方法。这看起来像方法覆盖但不是,因为静态方法不会覆盖。
java开发包如何处理静态方法?
最佳答案
new B().privateMethod();
这不是覆盖,因为 B 没有看到 A 的 privateMethod()。
new B().staticMethod();
这不是覆盖,允许通过实例调用静态方法,尽管它可能会造成混淆。它与通过类名调用它完全相同 - B.staticMethod()
。如果 B
的父类(super class) A
有一个从 B
可见的静态方法,您可以从 B
调用该方法(无论您编写 B.staticMethod()
还是 A.staticMethod()
还是 new B().staticMethod()
都没有关系>.
如果稍后您在B
中定义了一个同名的静态方法,该方法将隐藏A
中的同名方法,因此调用B。 staticMethod()
或 new B().staticMethod()
现在调用 B
的静态方法。但是,调用 A.staticMethod()
仍会调用 A
的静态方法。
关于java - 直接调用子类对象时的静态和私有(private)方法行为听起来像重写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29740512/