java有四种访问权限,它们各自的范围以下图所示java
当下列访问修饰符修饰字段和方法时:测试
privatespa
任意位置的子类不能够访问从父类继承的private字段和方法。这里所说的访问包括经过super关键字访问。code
任意位置的对象不能经过“.”访问对象的字段和方法。对象
publicblog
任意位置的子类能够访问从父类继承的public字段和属性。继承
任意位置的对象能够经过“.”访问字段和属性。内存
defaultio
当子类与父类在同一包下时,子类能够访问从父类继承的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(); } }
编译报错:(由于对象所在类p2.C2与对象所属类p1.C1不在同一包下)
将C2放在包p1下后:
package p1; public class C2{ public void test() { new C1().fun(); } }
编译正确:
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修饰的方法(字段)的可见范围是,该字段(方法)被定义的类所在的包。
本文我的编写,水平有限,若有错误,恳请指出,欢迎讨论分享。