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中).
请注意,可访问性是一个静态属性,可以在编译时确定; 它仅取决于类型和声明修饰符.
也就是说,编译器不关心你的变量引用命名实例的运行时类型是什么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,因此生成的实例可以访问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)
| 归档时间: |
|
| 查看次数: |
465 次 |
| 最近记录: |