java四种访问权限
java有四种访问权限,它们各⾃的范围如下图所⽰
当下列访问修饰符修饰字段和⽅法时:
private
任意位置的⼦类不可以访问从⽗类继承的private字段和⽅法。这⾥所说的访问包括通过super关键字访问。
任意位置的对象不能通过“.”访问对象的字段和⽅法。
public
任意位置的⼦类可以访问从⽗类继承的public字段和属性。
红螺任意位置的对象可以通过“.”访问字段和属性。
default
当⼦类与⽗类在同⼀包下时,⼦类可以访问从⽗类继承的default权限的字段和⽅法。
当创建该对象的类与该对象所属的类在同⼀包下时,可以通过“.”访问对象的字段和⽅法。
对于⽗类中的private、default权限的⼀些⽅法和字段,⼦类在⼀定程度上不能访问它们,通过super访问也不⾏。但⼦类对象初始化时,不仅⼦类中声明的成员变量分配了内存,⽗类的成员变量也都分配了内存,只是⽗类的成员不能被⼦类访问罢了。但是我们可以通过⼦类从⽗类继承的某些⽅法来操作这部分不能访问的变量。
protected
上⾯的三种访问权限都很好理解,protected的描述却不是那么清晰。
1)、当⼦类访问从⽗类继承的成员或⽅法时,不管是否在同⼀包都可以,在这个情况下同public权限。
测试: p2包下的C2继承p1包下的C1,C2在类中可以直接访问继承来的⽅法
package p1;
public class C1 {
protected void fun() {}
}
package p2;
import p1.C1;
public class C2 extends C1{
public void test() {
fun();
}
}
编译正确:
2)当访对象要⽤“.”访问对象的protected字段(⽅法)时,分两种情况讨论
i如果访问的这个⽅法(字段)是该对象的类⾃⼰定义的,且类型是protected。要求对象所在类与对象所属类在同⼀包下。
package p1;
public class C1 {
protected void fun() {}
}
package p2;
import p1.C1;
public class C2{
public void test() {
new C1().fun();lol英雄皮肤
}
}
编译报错:(因为对象所在类p2.C2与对象所属类p1.C1不在同⼀包下)
将C2放在包p1下后:
package p1;
public class C2{
public void test() {
new C1().fun();
}2022年新年祝福语简短
}
编译正确:
五一三倍工资有几天? ii如果对象访问的这个⽅法是该对象的类继承⽽来的。要求对象所在类与该⽅法(字段)被最初被定义的类在同⼀包下。其实 i 是 ii 的特殊情况。
测试: C2继承C1的protected⽅法fun(),C3调⽤C2继承的fun()⽅法,C3与C2在同⼀包下,编译报错。
package p1;
public class C1 {
protected void fun() {}
}
package p2;
import p1.C1;
public class C2 extends C1{
}
package p2;
public class C3{
public void test() {
C2 c2 = new C2();
c2.fun();
}
}
编译结果:
测试:将上⾯的⽰例改变⼀下,C3放到C1的包下,编译通过。
package p1;
import p2.C2;
public class C3{
public void test() {
C2 c2 = new C2();
c2.fun();
旅行社排名}
羊肉泡馍}
编译结果:
protected总结:当在⼦类内部访问从⽗类继承⽽来的protected字段(⽅法)时,没有包限制。当对象通过“.”访问字段(⽅法)时,被protected修饰的⽅法(字段)的可见范围是,该字段(⽅法)被定义的类所在的包。
本⽂个⼈编写,⽔平有限,如有错误,恳请指出,欢迎讨论分享。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论