java的protected访问修饰符理解

时间:2022-10-03 21:06:14

对于protected修饰的成员来说,即使子类位于不同的包中,该子类也能访问它(通过继承)。

其实在某个类中定义的protected 方法和属性和默认权限方法和属性是一样的。

比如,某类的protected 方法和属性在包外是不能通过该类对象进行访问的(你能在包外访问一个类的默认权限的方法和属性吗?当然不能),这就是为什么在某对象所在的包的以外的任何地方,你不可以通过该类的对象引用来调用它的protected 方法和属性,哪怕是在该类的子类中也不可以这样做。在该类包外的子类中能“看到“的只是子类自己继承来的protected 方法和属性,它是不能“看到“它的父类对象的protected方法和属性的。

所以在使用protected时,需要注意几点:

1.包外子类有权访问超类成员,它指子类继承该成员,然而,这并不意味着包外子类能够使用超类实例的引用访问该成员。如下例所示:

父类:Parent,位于certification包

java的protected访问修饰符理解

子类Child,位于Other包

java的protected访问修饰符理解

但是如果子类和父类位于同一个包下,则可以使用超类实例的引用访问该成员。如下:

java的protected访问修饰符理解


2.超类中的protected修饰的成员,被子类继承后,该成员对这一子类外的任何代码来说都变成私有的。例如:

有个Neighbor类和Child类位于同一个包other中,Neighbor类也不能访问Child 的继承(受保护的)变量x。

java的protected访问修饰符理解



总之:当一个包外子类继承保护成员时,该成员在这个子类内实际上变为私有,因此,只有这个子类及其子类能够访问它。