为什么我无法调用a.getHello()?

时间:2018-01-24 16:02:34

标签: java

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()?

3 个答案:

答案 0 :(得分:1)

对于类getHello

A方法私有,您只能从此类中调用它。

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

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

这是Java documentation

答案 1 :(得分:1)

声明它是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的实例调用它。

答案 2 :(得分:1)

作为Java语言规范(https://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6)声明:

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

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