在Java中,修饰符分为四种:
- public
- protected
- default
- private
关于四种修饰符的访问权限:
修饰符 | 内部类 | 同包 | 子类 | 外部包 |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | |
default | Y | Y | ||
private | Y |
这种权限关系表适用于类的所有成员属性,当然也有例外,比如内部类:
public class A {
private B b;
private void t(){
String value = b.value;
}
private class B{
private String value;
}
}
这里只讨论修饰符的访问权限,可以看到对于B类的私有属性value在该类的外部访问了,即打破了private属性只能在类内部访问的规则。
为什么外部类能够访问内部类的私有属性?
这是因为编译器会生成一个package scope的access方法,该方法是一个get方法并且该方法是一个synthetic性质的方法。
所以外部类对内部类的私有属性的访问就相当于调用了一个get方法,大概情形如下:
public class A {
private B b;
private void t(){
String value = b.getValue();
}
private class B{
private String value;
public String getValue(){
return value;
}
}
}
所以看起来外部类访问内部类的私有属性打破了private的访问权限规则,其实并非如此,而是由编译器提供了一个可以由外部类访问的get方法。外部类通过这个方法访问内部类的私有属性。
网友评论