之前一直没对这块深究,觉得看看就可以了,现在在去看看时,居然被卡在了protected这个控制符上了。
public:这个比较好理解,是完全对外开放的。
private:外类无法访问,只能在类的内部使用。关于这个字符修饰的字段和方法有以下两种说法
1、类对象拥有父类对象的完整拷贝. 实例化一个类是从最顶级的超类开始实例化的, 是一层一层的包裹结构. private限制访问方式只能在类的内部, 这仅仅是一个访问控制, 实际上子类对象拥有父类对象的一切.。
2、从所有的文档来看,几乎都指明private是不能被子类继承的。但是由于JAAS的存在,可以突破private的控制来访问其中的private对象,在这种情况下,发现private是已经被子类继承了。
这两个问题我也不太清楚吗,深究还是无果。
default(friendly):只能在同一包中被访问,如果子类和父类在同一包中,子类也能访问。
protected:这个权限属于default的超集了吧,允许其他包子类继承,但是不允许外部直接对子类的相关成员直接访问,只能在子类中访问。这也是我开始奇怪的地方。
下面是我开始的代码:
package Study;
public class Parent {
private int i;
int j;
protected int m;
public int n;
}
package Study.Study;
import Study.*;
class Child3 extends Parent{}
public class Child2 extends Parent{
public static void main(String[] args) {
Child3 x=new Child3();
x.m=1;
Child2 y=new Child2();
y.m=2;
}
}
以上代码会在x.m=1处报错,而y.m 能顺利编译,因为main方法所在的类child2是parent的子类,所以可以访问Parent的protected成员,与包无关。
x.m不可访问,是因为x是Child3的实例,main所在的类不是Child3或它的子类,所以不能访问成员m。