java的四种访问权限_java四种访问权限

java有四种访问权限,它们各自的范围如下图所示

f14b5398c54e35b019ceb3306025080f.png

当下列访问修饰符修饰字段和方法时:

private

任意位置的子类不可以访问从父类继承的private字段和方法。这里所说的访问包括通过super关键字访问。

任意位置的对象不能通过“.”访问对象的字段和方法。

public

任意位置的子类可以访问从父类继承的public字段和属性。

任意位置的对象可以通过“.”访问字段和属性。

default

当子类与父类在同一包下时,子类可以访问从父类继承的default权限的字段和方法。

当创建该对象的类与该对象所属的类在同一包下时,可以通过“.”访问对象的字段和方法。

对于父类中的private、default权限的一些方法和字段,子类在一定程度上不能访问它们,通过super访问也不行。但子类对象初始化时,不仅子类中声明的成员变量分配了内存,父类的成员变量也都分配了内存,只是父类的成员不能被子类访问罢了。但是我们可以通过子类从父类继承的某些方法来操作这部分不能访问的变量。

protected

上面的三种访问权限都很好理解,protected的描述却不是那么清晰。

1)、当子类访问从父类继承的成员或方法时,不管是否在同一包都可以,在这个情况下同public权限。

测试: p2包下的C2继承p1包下的C1,C2在类中可以直接访问继承来的方法

packagep1;public classC1 {protected voidfun() {}

}

packagep2;importp1.C1;public class C2 extendsC1{public voidtest() {

fun();

}

}

编译正确:

5e95fd72cf2a6d53fcdfd69a5a5faf14.png

2)当访对象要用“.”访问对象的protected字段(方法)时,分两种情况讨论

i 如果访问的这个方法(字段)是该对象的类自己定义的,且类型是protected。要求对象所在类与对象所属类在同一包下。

packagep1;public classC1 {protected voidfun() {}

}

packagep2;importp1.C1;public classC2{public voidtest() {newC1().fun();

}

}

编译报错:(因为对象所在类p2.C2与对象所属类p1.C1不在同一包下)

c58d75bbebb14bbaf6c51e880c8b7d0d.png

将C2放在包p1下后:

packagep1;public classC2{public voidtest() {newC1().fun();

}

}

编译正确:

5f23db894d65b81f50c858159093d075.png

ii 如果对象访问的这个方法是该对象的类继承而来的。要求对象所在类与该方法(字段)被最初被定义的类在同一包下。其实 i 是 ii 的特殊情况。

测试: C2继承C1的protected方法fun(),C3调用C2继承的fun()方法,C3与C2在同一包下,编译报错。

packagep1;public classC1 {protected voidfun() {}

}

packagep2;importp1.C1;public class C2 extendsC1{

}

packagep2;public classC3{public voidtest() {

C2 c2= newC2();

c2.fun();

}

}

编译结果:

41348c9c98ba5cc1f3128d43829ce5ee.png

测试:将上面的示例改变一下,C3放到C1的包下,编译通过。

packagep1;importp2.C2;public classC3{public voidtest() {

C2 c2= newC2();

c2.fun();

}

}

编译结果:

2af1a99cd13c3dfa110067c7e3d09433.png

protected总结:当在子类内部访问从父类继承而来的protected字段(方法)时,没有包限制。当对象通过“.”访问字段(方法)时,被protected修饰的方法(字段)的可见范围是,该字段(方法)被定义的类所在的包。

本文个人编写,水平有限,如有错误,恳请指出,欢迎讨论分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值