下面展示了使用访问修饰符(public、protected、默认、private)后各种类之间的访问权限:
| 修饰符 | 同类 | 同包 | 子类 | 不同包 |
|---|---|---|---|---|
| public | √ | √ | √ | √ |
| protected | √ | √ | √ | × |
| 默认 | √ | √ | × | × |
| private | √ | × | × | × |
1、同类 标识同一个类范围内的访问权限。
2、同包 标识同一个包范围内的访问权限。
3、子类 标识不同包的子类,而非同包内的子类的访问权限;不具名包(即未声明package)子类属于同包权限。
4、不同包 标识不同包间的非子类的访问权限。
注意:这四种修饰符可以修饰类的属性和方法,但对于类自身来说,只能用public和默认两种修饰符。
package package1;
import package2.FatherTwo;
public class FatherOne {
public String publicField;
protected String protectedField;
String defaultField;
private String privateField;
public void test() {
// 同一个类访问
System.out.println(this.publicField);
System.out.println(this.protectedField);
System.out.println(this.defaultField);
System.out.println(this.privateField);
// 不同包访问
System.out.println(new FatherTwo().publicField);
// System.out.println(new FatherTwo().protectedField); ERROR
// System.out.println(new FatherTwo().defaultField); ERROR
// System.out.println(new FatherTwo().privateField); ERROR
}
}
class SonOne extends FatherOne {
@Override
public void test() {
// 同包子类访问
System.out.println(super.publicField);
System.out.println(super.protectedField);
System.out.println(super.defaultField);
// System.out.println(super.privateField); ERROR
}
}
class SonTwo extends FatherTwo {
public void test() {
// 同一个包访问
System.out.println(new FatherOne().publicField);
System.out.println(new FatherOne().protectedField);
System.out.println(new FatherOne().defaultField);
// System.out.println(new FatherOne().privateField); ERROR
// 不同包子类访问
System.out.println(super.publicField);
System.out.println(super.protectedField);
// System.out.println(super.defaultField); ERROR
// System.out.println(super.privateField); ERROR
}
}
package package2;
public class FatherTwo {
public String publicField;
protected String protectedField;
String defaultField;
private String privateField;
}



