private、default、protected、public是Java中的访问限定修饰符,用于限制java类、方法和成员变量可见范围。
1. public 的可见范围最广
被public修饰的类、变量和方法可以被所有的类访问。适用于一些对外提供的方法和类。
2、defalut 默认访问访问
如果一个类没有使用任何访问范围修饰符,相当于使用了default修饰符,这个类只能被同一包下的类访问。
适用于一些供本包访问设计的类和方法。
3、protected 受保护的访问范围
protected是用来保护子类的,子类可以访问用它修饰的成员,相当于传递给子类的一种继承的东西。另外,同包下的其他类也可以访问它修饰的变量。
4、private 可见范围最小
体现的是封装的思想,被private修饰的对象只能在同一类个中访问,因此,一些需要受保护的成员变量使用private做封装。
类内部 | 同一包中 | 子类 | 外部包 | |
public | √ | √ | √ | √ |
default | √ | √ | × | × |
protectded | √ | √ | √ | × |
private | √ | × | × | × |
来个例子验证一下
写一个User.class,验证四种使用不同的修饰符下callName方法的访问范围
public class User { private String name; public User(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void callName1(String name) { System.out.println("我的名字是:"+name); } void callName2(String name) { System.out.println("我的名字是:"+name); } protected void callName3(String name) { System.out.println("我的名字是:"+name); } private void callName4(String name) { System.out.println("我的名字是:"+name); } }
如下图,通过在User.class中的main访问User的callNam方法,通过idea的提示可以看到 四种不同访问控制修饰符修饰的callName方法都有权访问。
在相同包下创建Access.class访问User的callName方法,如图所示,通过idea提示看到只有3个callName方法有权限访问,分别对应于public、default和protected修饰的callName方法。
如图,另一个包中创建Access.clss,访问User的CallName方法,只能访问public修饰的callName1方法,其他修饰符修饰的方法在不同包中都没有访问权限。
最后,在看看User的子类有哪些callName方法。
创建一个VipUser.class类,这个类继承于User,在VipUser内部访问时有两个callName方法,分别对应于public、protected修饰的方法,而在VipUser外部访问的时候不能访问protected修饰的方法。