【问题标题】:Why I am not able to call a.getHello()? [duplicate]为什么我不能调用 a.getHello()? [复制]
【发布时间】:2018-01-24 16:02:34
【问题描述】:
public class A {
    private void getHello(){
        System.out.println("Prints A");
    }
}
class B extends A {
    public void getHello(){
        System.out.println("Prints B");
    }
}
class Test{
    public static void main(String[] args) {
        A a = new B();
    }
}

我在 A 类中创建私有方法
通过扩展 A 类在 B 类中创建具有相同名称的公共方法
即使在使用 A 引用为 B 创建对象之后
为什么我无法调用 getHello()?

【问题讨论】:

  • 你得到的确切错误是什么?
  • 你有一个A的引用,它的getHello方法是私有的...

标签: java


【解决方案1】:

getHello 方法对于 A 类是 private 的,您只能从此类中调用它。

即使在其他类中创建类A 的实例,您也无法访问getHello() 方法。 这也是无效代码。

class Test {
    public static void main(String[] args) {
        A a = new A();
        a.getHello();
    }
}

这里是 Java documentation

【讨论】:

    【解决方案2】:

    将其声明为A 的类型,您将失去B 的实现细节,尽管仍然存在。

     A a = new B(); // a.getHello() is not accessible because it looks it up in A
     B b = new B(); // a.getHello() is accessible because it calls it in B
    

    即使getHello() 方法在A 中是公共的,它仍然会为B 的实例调用它。

    【讨论】:

      【解决方案3】:

      正如 Java 语言规范 (https://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6) 所述:

      私有类成员或构造函数只能在包含成员或构造函数声明的顶级类(第 7.6 节)的主体内访问。它不被子类继承。

      当您创建对A 类对象的引用时,在您的情况下,无法从此类外部访问此方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-24
        • 1970-01-01
        • 2014-08-19
        • 2015-07-22
        • 1970-01-01
        • 2019-12-02
        • 2010-12-30
        • 1970-01-01
        相关资源
        最近更新 更多