Java中的私人访问修饰符?
这个问题在这里已经有了答案:
第一个答案基本上是正确的 - protected
成员可以被访问
但是,有一个小技巧:
6.6.2受保护访问的详细信息
对象的受保护成员或构造函数可以从仅在负责实现该对象的代码声明的包中进行访问。
这意味着来自其他包的子类不能访问其超类的任意实例的protected
成员,它们只能在它们自己类型的实例(其中type是编译时类型的表达式,因为它是编译时检查)中访问它们。
例如(假设这个代码在Cat
):
Dog dog = new Dog();
Animal cat = new Cat();
dog.testInstanceMethod(); // Not allowed, because Cat should not be able to access protected members of Dog
cat.testInstanceMethod(); // Not allowed, because compiler doesn't know that runtime type of cat is Cat
((Cat) cat).testInstanceMethod(); // Allowed
这是有道理的,因为访问protected
的成员Dog
的Cat
可能会破坏不变量Dog
,而Cat
可以访问它自己的protected
安全成员,因为它知道如何保证自己的不变量。
细则:
6.6.2.1访问受保护的成员
设C是声明保护成员m的类。 只有在C的子类S的主体内才允许访问。另外,如果Id表示实例字段或实例方法,则:
6.6.2.2有资格访问受保护的构造函数
设C是声明受保护的构造函数的类,并让S为声明中使用受保护的构造函数的最内层类。 然后:
也可以看看:
在受保护的访问中,成员可以在同一个包中访问,并且也可以访问另一个包中的继承类成员。
在包访问中,可以访问同一包中类的成员。 其他包中的类成员不能通过包访问进行访问。
您已创建一个Cat实例并将其转换为其超类类型,即Animal类型。 按照Animal类型,它的testInstanceMethod在相同的包或任何子类型中都可见。 如果你没有投入动物类型的代码将编译。
希望有所帮助
./Arun
链接地址: http://www.djcxy.com/p/4119.html