Java语言提供了三种权限修饰符public、private以及protected,一共有四种权限。
public
我们先来看一下public。public的意思是公有的,从字面意思来看它应该是所有人可见的。通过代码来看一下:
public class Demo{
}
public class DemoTest{
public static void main(String args[]){
Demo demo = new Demo();
}
}
通过将Demo类和DemoTest类放在相同的包以及不同的包进行测试,我们可以发现无论DemoTest类是不是和Demo类同包都可以访问到Demo类。
不加修饰符
不加修饰符在Java中其实也是一种权限,从理论上来看,我们即没有对它进行大肆宣扬(public),也没有对它进行过分保护(private),所以应该是附近人可见。通过代码观察一下:
class Demo{
}
public class DemoTest{
public static void main(String args[]){
Demo demo = new Demo();
}
}
通过将Demo类和DemoTest类放在相同的包以及不同的包进行测试可以发现,只有当Demo类和DemoTest类处于同一包时,DemoTest类才可以访问到Demo类。
protected
由于Java中类(外部类)的声明不支持protected,所以我们定义一个test()方法用protected修饰。protected的语义是受保护的,那它保护的对象是谁呢?从Java的继承性来看,我们可以猜测它保护的应该就是子类。下面通过代码进行测试:
public class Demo{
protected void test(){
System.out.println("test");
}
}
public class DemoTest{
public static void main(String args[]){
Demo demo = new Demo();
demo.test();
}
}
先来测试一下非子类的情况。通过测试可以发现当Demo类和DemoTest类处于不同的包时demo无法访问到test()方法,当Demo类与DemoTest类处于同一包时可以正常访问到test()方法。
下面测试一下子类的情况:
public class Demo1 extends Demo{
public static void main(String args[]){
Demo demo = new Demo();
demo.test();
}
}
可以发现,无论Demo1和Demo在不在同一个包,Demo1都可以访问到test()方法。其实也不难理解,毕竟Demo1是继承Demo类的。
private
private语义是私有的,显然是只能用的。Java语言不支持private声明类,所以我们通过定义一个private修饰的test()方法来进行测试:
public class Demo{
private void test(){
System.out.println("test");
}
}
public class DemoTest{
public static void main(String args[]){
Demo demo = new Demo();
demo.test();
}
}
无论Demo和DemoTest在不在同一包,都无法访问到test()方法。
总结
修饰符 | 当前类 | 同包 | 子类(不同包) | 其它包 |
public | 可见 | 可见 | 可见 | 可见 |
protected | 可见 | 可见 | 可见 | 不可见 |
不加修饰符 | 可见 | 可见 | 不可见 | 不可见 |
private | 可见 | 不可见 | 不可见 | 不可见 |