访问控制权限表
描述
- 权限大小:public > protected > default > private
- public:如果一个类的属性或方法使用public访问控制符修饰,那么这个该属性或方法就可以被项目中的所有类访问
- protected:如果一个类的属性或方法使用protected访问控制符修饰,那么该属性或方法既可以被同一个包中的其他类访问,也可以被不同包中的子类访问
- 如果该属性或方法不是静态的,那么需要实例化子类来调用
- 如果该属性或方法是静态的,那么既可以用父类类名来调用,也可以用子类类名来调用
- default:如果一个类的属性或方法不使用任何访问控制修饰,则它为default访问控制权限。default访问控制权限的属性或方法可以被相同包下的其他类访问,不同包的类无论有没有继承该类,都不能访问该类的default访问控制权限的属性或方法
- private:如果一个类的属性或方法使用private访问控制符修饰,则这个属性或方法只能在当前类的内部被访问
实例
简单起见,以下实例只设置了属性来观察
- 同类中的访问:
运行结果:package com.pack.test1; public class ADemo { private String a = "private"; String b = "default"; protected String c = "protected"; public String d = "public"; public static void main(String[] args) { //可以访问本类所有权限类别的属性和方法 ADemo ad = new ADemo(); System.out.println(ad.a); System.out.println(ad.b); System.out.println(ad.c); System.out.println(ad.d); } }
private default protected public
- 同包不同类的访问:
运行结果:package com.pack.test1; public class BDmo { public static void main(String[] args) { ADemo ad = new ADemo(); //无法访问同包不同类的private属性 //System.out.println(ADemo.a); //可以访问同包不同类的default属性 System.out.println(ad.b); //可以访问同包不同类的protected属性 System.out.println(ad.c); //可以访问同包不同类的public属性 System.out.println(ad.d); } }
default protected public
- 不同包非子类的访问:
运行结果:package com.pack.test2; import com.pack.test1.ADemo; public class CDem { public static void main(String[] args) { ADemo ad = new ADemo(); //无法访问不同包无继承关系的类的private属性 //System.out.println(ad.a); //无法访问不同包无继承关系的类的default属性 //System.out.println(ad.b); //无法访问不同包无继承关系的类的protected属性 //System.out.println(ad.c); //可以访问不同包无继承关系的类的public属性 System.out.println(ad.d); } }
public
- 不同包子类的访问:
运行结果:package com.pack.test2; import com.pack.test1.ADemo; public class DDemo extends ADemo { public static void main(String[] args) { ADemo ad = new ADemo(); //无法访问不同包有继承关系的类的private属性 //System.out.println(ad.a); //无法访问不同包有继承关系的类的default属性 //System.out.println(ad.b); //这种方式不能访问ADemo类的protect属性 //System.out.println(ad.c); //正确访问ADemo类的protect属性的方式如下: System.out.println(new DDemo().c); //可以访问不同包有继承关系的类的public属性 System.out.println(ad.d); } }
protected public