关键词protected
授予对同一包中的类和子类的访问权限(http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html).
现在,每个班级都有java.lang.Object
作为超类(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html).
因此我得出结论,每个班级都可以访问java.lang.Object
的方法,即使它们是protected
.
看一下下面的例子:
public class Testclass {
public Object getOne() throws CloneNotSupportedException {
return this.clone();
}
public Object getTwo() throws CloneNotSupportedException {
return ((Object) this).clone();
}
}
While getOne()
编译得很好,getTwo()
gives
Testclass.java:6: clone() has protected access in java.lang.Object
return ((Object) this).clone();
我也不明白为什么getTwo()
不编译也没有什么区别(关于访问java.lang.Object
s 成员)与getOne()
.
如果您引用的表达式的编译时类型是您自己的类或子类,则您只能访问不同包中类型的受保护成员。 (其中“您的”类是包含代码的类。)您自己的类也必须是最初声明该方法的类型的子类。
这是一个例子;假使,假设Base
与所有其他类位于不同的包中:
package first;
public class Base
{
protected void Foo() {}
}
// Yes, each class is really in its own file normally - but treat
// all the classes below as being in package "second"
package second;
public class Child extends Base
{
public void OtherMethod(Object x)
{
((Base) x).Foo(); // Invalid: Base is not Child or subclass
((Child) x).Foo(); // Valid: Child is Child
((GrandChild) x).Foo(); // Valid: GrandChild is subclass of Child
((OtherChild) x).Foo(); // Invalid: OtherChild is not Child or subclass
}
}
public class GrandChild extends Child {}
public class OtherChild extends Base {}
换句话说,它让您可以访问“与您相似的对象”的受保护成员。
详细信息在Java 语言规范第 6.6.2 节:
A protected
的成员或构造函数
可以从外部访问对象
声明它的包
仅由负责的代码
该对象的实现。
6.6.2.1 访问受保护成员
Let C是一个类,其中
受保护成员m被宣布。使用权
只允许在一个体内
子类S of C。另外,如果 ID
表示实例字段或实例
方法,则:如果访问是通过
合格名称Q.Id, where Q是一个表达式名称,那么访问是
允许当且仅当类型
表达方式Q is S或一个子类S。如果访问是通过字段访问
表达E.Id, where E is a Primary表达式,或通过方法调用
表达E.Id(...), where E is a
Primary表达式,则访问为
允许当且仅当类型E
is S或一个子类S.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)