如何解决超类的私有方法?

Pan*_*kaj 6 java

class A{ 
  private void sayA(){
     System.out.println("Private method of A");
  }
  public static void main(String args[]){
      A instanceA=new B();
      instanceA.sayA();
  }
}

class B extends A{
}
Run Code Online (Sandbox Code Playgroud)

我期望它抛出一个运行时异常,因为在编译时编译器检查是否sayA()可以在引用上调用A它,并且在运行时它将检查是否sayA()可以在B对象上调用它.但它反而印刷了" A的私人方法 ".

Sot*_*lis 14

可访问性是一个编译时概念(反映在Reflection API中).

来自Java语言规范

请注意,可访问性是一个静态属性,可以在编译时确定; 它仅取决于类型和声明修饰符.

也就是说,编译器不关心你的变量引用命名实例的运行时类型是什么instanceA将是

A instanceA = new B();
Run Code Online (Sandbox Code Playgroud)

它只关心你在静态类型的引用上调用了一个方法A.那个方法是private因为你在声明它的类的主体内,它是可见的,因此是可用的.

否则,成员或构造函数被声明为private,并且当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问.


对于评论中的蜘蛛侠,请考虑以下内容

class A {
    private void privateMethod () {
        System.out.println("private method");
    }
    public void publicMethod() {
        privateMethod();
    }
}

class B extends A {}

class Example {
    public static void main(String[] args) {
        new B().publicMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)


133*_*joe 12

private意味着只有声明该字段的类才能看到它.因为你instanceA.sayA();在类中调用A方法是可见的,代码都编译并运行.如果您尝试从类B或任何其他类中调用该方法,则会收到编译警告The method sayA() from the type A is not visible

  • `B扩展了A`,因此`B`的任何实例都是*也是'A`的实例.因此``A`声明的私有方法存在于`instanceA`中,但只有类'A`才能看到它. (7认同)

bla*_*her 5

这是因为您将B分配给A,因此生成的实例可以访问A的方法.

如果改为B instanceA=new B(),后续行将无法编译(我认为这是你的期望?).

class A{ 
  private void sayA(){
     System.out.println("Private method of A");
  }
  public static void main(String args[]){
      B instanceA=new B();
      instanceA.sayA(); # This line won't compile/run.
  }
}

class B extends A{
}
Run Code Online (Sandbox Code Playgroud)