java - 直接调用子类对象时的静态和私有(private)方法行为听起来像重写?

标签 java static private overriding access-specifier

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/

相关文章:

java - 插入到实现泛型的二叉搜索树中

java - 为什么 Hibernate 在使用 GenerationType.IDENTITY 策略时尝试访问 hibernate_sequence?

java - Spring MVC 表单标签 : Is there a standard way to add "No selection" item?

c++ - 定义需要在运行时设置的 const static

java - 静态方法和静态变量,糟糕的设计实践?

javascript - 设置与函数参数同名的 Javascript 私有(private)变量?

java - 从集合中有效地获取字符串子集 "startingWith"

c++ - 函数作用域静态非 Pod 对象初始化

C++ 访问说明符

c# - 为什么要在属性访问器中使用私有(private)变量?