java.lang.Object 的受保护方法如何免受子类的影响?

2023-11-25

关键词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.Objects 成员)与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(使用前将#替换为@)

java.lang.Object 的受保护方法如何免受子类的影响? 的相关文章

随机推荐