static protected &private(高手进,java虚拟机,100分)

来源:百度知道 编辑:UC知道 时间:2024/05/16 13:33:25
1:protected权限的问题,为什么会这样:
package base;
public class Base {
protected void aa(){

}
protected static void staticBB(){

}
}
package sub;
import base.Base;

public class sub extends Base {
public void test(){
super.aa();
super.staticBB();
new Base().aa(); //为什么不可以??
new Base().staticBB();

this.aa();
this.staticBB();
new sub().aa();
new sub().staticBB();
}
}
2:子类是否继承了父类的private字段,是继承了,只是不可见,debug是可以看到子类继承的字段的,想知道java虚拟机是怎么实现的继承,也是加载了父类的字段吗,还是只是引用?

问题1:new Base().aa(); 为什么不可以?
答:因为aa是父类里受保护的方法。受保护的成员可调用范围只有三种1:本类体内 2:同包下 3:子类。你的new Base().aa(); 虽然写在子类里面了可是你要仔细看看,aa的调用者是谁,是你new出来的一个新对象,并不是Base的子类,并且这个新对象也不在base包里,所以当然不能这么调用了。new Base().staticBB(); 这个之所以能调用是因为它是静态方法,直接用类名就能调用它更何况你new了一个对象来调用它呢。也就是说static权限优先于protected

问题2:
答:是加载的,不是引用的。

才子_辉祝您愉快!

问题1:new Base().aa(); 为什么不可以?
因为父类中的aa()是protected的方法。不同包的类是不能访问的,包括子类。
2、应该是在运行的时候通过extends字段将父类加载到内存,然后给于不同的访问权限的成员以不同的标示,然后根据子类的引用判断是否有权限访问。如果没有父类则加载Object。

这个是static protected &private的访问权限问题,找本书好好查下吧。

你说的那个继承没错,子类继承了父类的private字段,是继承了,只是不可见,实现了继承就会加载父类的所有。

private只可本类内使用 继承也不可使用