修饰符用来定义类、方法或者变量,通常放在语句的最前端。Java中有访问修饰符和非访问修饰符。其中访问修饰符有 public、protected 、default 、 private 四个。下面依照同包同类、同包不同类、同胞继承类、不同包继承类、不同包不继承类几个关系来验证修饰符权限。
public
同包同类
package package01;
/**
* 被测试类
*/
public class Person {
public int age = 10;
public int getAge() {
return age;
}
public Person() {
}
public static void main(String[] args){
Person person = new Person();
System.out.print(person.age);
}
}
//运行结果:10
同包不同类且无继承关系
package package01;
/**
* 同包不同类
*/
public class Student {
public static void main(String[] args){
Person person = new Person();
System.out.print(person.age);
}
}
//运行结果:10
同包子类
package package01;
/**
* 同包继承类
*/
public class Child extends Person {
public static void main(String[] args){
Person person = new Person();
System.out.print(person.age);
}
}
//运行结果:10
不同包不同类且无继承关系
package package02;
/**
* 不同包不同类 - 此时要导入被测类 import package01.Person;
*/
import package01.Person;
public class Man {
public static void main(String[] args){
Person per = new Person();
System.out.print(per.age);
}
}
//运行结果:10
不同包子类
package package02;
/**
* 不同包不同类 - 此时要导入被测类 import package01.Person;
*/
import package01.Person;
public class Woman extends Person {
public static void main(String[] args){
Person per = new Person();
System.out.print(per.age);
}
}
//运行结果:10
protected
同包同类
//运行结果:10
同包不同类且无继承关系
//运行结果:10
同包子类
//运行结果:10
不同包不同类且无继承关系
//运行结果:报错,无法访问。
//注:但是可以通过public修饰的getAge()方法获得age。
不同包子类
//运行结果:10
default
同包同类
//运行结果:10
同包不同类且无继承关系
//运行结果:10
同包子类
//运行结果:10
不同包不同类且无继承关系
//运行结果:报错,无法访问。
不同包子类
//运行结果:报错,无法访问。
注:不能写default,它也不是关键字,只是用default来标识不写访问修饰符的状态。
private
同包同类
//运行结果:10
同包不同类且无继承关系
//运行结果:报错,无法访问。
同包子类
//运行结果:报错,无法访问。
不同包不同类且无继承关系
//运行结果:报错,无法访问。
不同包子类
//运行结果:报错,无法访问。
总结
public | protected | default | private | |
---|---|---|---|---|
类内 | √ | √ | √ | √ |
同包子类 | √ | √ | √ | |
同包不同类 | √ | √ | √ | |
不同包子类 | √ | √ | ||
不同包不同类 | √ |
-
public没什么权限限制,跨包访问时记得导入即可。
-
protected 拥有同包或者继承关系即可访问。
-
default 在同一个包内即可访问,跨包即使有继承关系也没用。
-
private 只有在类内可以访问,同胞子类想访问也没辙。