JAVA中访问权限控制
本篇主要记录关于JAVA中访问权限的学习。
实际上网上关于JAVA中四种访问权限的博文已十分详细了,但在实际编程中还是会存在一些疑问,主要是区别 protected 和 default 的问题,且实际在编程中对于对应修饰符修饰的方法或属性的调用依然是有一定讲究的。
以下是正文:
一、访问权限
JAVA中共有四种访问权限的控制,对应的权限从高到底为:public>protected>default(可不写)>private,具体的控制域见下表格。
访问权限 | 同类 | 同包 | 非同包子类 | 非同包非子类 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
public:无访问权限控制,所修饰的变量、方法,同包或非同包都是可以访问。
- protected:同包都可以访问,非同包的子类可以访问。
- default:包访问权限,非同包不可访问。
- private:私有权限,只对本类中的方法可见。
这里主要区分protected和default的权限控制,当对于某个属性或方法:
- 只需对包内的类可见,即使用default;
- 考虑对子类可见,不管是否在同一个包中,即使用protected;
二、访问权限实例
对于不同访问权限的调用主要就区分四种了:
- 同类
- 同包
- 非同包子类
- 非同包非子类
这里为了简便,只用了修饰符修饰属性,方法的访问权限实际相同。
1、同类中所有修饰符修饰均可见。
package access.packagea;
/*
chengzhichao
2021/4/18
关于JAVA中访问权限的学习:同包中所有修饰符修饰的都可见
*/
public class ClassA {
private String a="a";
String c="b";
protected String b="c";
public String d="d";
public static void main(String[] args){
ClassA classA=new ClassA();
System.out.println(classA.a+classA.b+classA.c+classA.d);
}
}
2、同包(不管是否是子类)private不可见,default、protected、public可见。
package access.packagea;
/*
chengzhichao
2021/4/18
关于JAVA中访问权限的学习:同包中除private不可见,其他均可见。
*/
public class ClassB {
public static void main(String[] args){
ClassA classA=new ClassA();
System.out.println(classA.b+classA.c+classA.d);
}
}
3、不同包子类,private、default不可见,protected和public可见。
package access.packageb;
/*
chengzhichao
2021/4/18
关于JAVA中访问权限的学习:不同包子类,private、default不可见,protected和public可见
*/
import access.packagea.ClassA;
class ClassC extends ClassA {
public static void main(String[] args) {
ClassA classA=new ClassA();
//System.out.println(classA.c);
System.out.println(classA.d);
ClassC classC=new ClassC();
System.out.println(classC.c+classC.d);
}
}
4、不同包且非子类,private、default、protected不可见,public可见。
package access.packageb;
/*
chengzhichao
2021/4/18
关于JAVA中访问权限的学习:不同包且非子类,private、default、protected不可见,public可见。
*/
import access.packagea.ClassA;
public class ClassD {
public static void main(String[] args){
ClassA classA=new ClassA();
System.out.println(classA.d);
}
}
好了,以上是关于访问权限的,下面写一些在实际的使用中容易出现出错的。
三、对于不同访问权限的一些总结
可以看到上述的的第三个代码,protected修饰属性在非同包的子类中可见,但在实际调用时,只能通过子类实例进行调用,无法在子类中通过父类的实例进行调用。
总结:
- 子类可以通过继承获得父类的protected权限的属性和方法。
- 子类中不可以通过父类的对象访问父类protected权限的属性和方法。
- 子类中可以通过子类的对象访问父类protected权限的属性和方法。
- 子类中不能通过其他子类的对象访问父类的proected权限的属性和方法。
- 子类同包的其他类不能通过子类的对象访问父类的protected权限的属性和方法。
其中第二点标红的需要注意,是调用时容易出错地方。
通过推理可得,继承子类的类,同时具备了子类及子类的父类中protected权限的属性和方法。
其实从以上我们大致可以归纳出来,JAVA中对于不同包,protected允许子类权限的传递性,但不允许与子类同一层级的类通过子类获取父类属性或方法。
吾生也有涯,而知也无涯。