当前位置: 首页 > 面试题库 >

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

胥良平
2023-03-14
问题内容

关键字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

看下面的例子:

公共课程Testclass {
  公共对象getOne()抛出CloneNotSupportedException {
    返回this.clone();
  }
  公共对象getTwo()抛出CloneNotSupportedException {
    return((Object this this).clone();
  }
}

getOne()编译良好的同时,getTwo()给出

Testclass.java:6:clone()在java.lang.Object中具有受保护的访问
        return((Object this this).clone();

我既不理解为什么getTwo()不编译,也不知道与的区别(关于java.lang.Objects成员的访问权限)getOne()


问题答案:

如果引用的表达式的编译时类型是您自己的类或子类,则只能访问其他包中某个类型的受保护成员。(“
your”类是包含代码的类。)您自己的类也必须是最初声明方法的类型的子类。

这是一个例子。假定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节中:

protected对象的成员或构造可以从它仅由代码中声明的封装,它负责该对象的执行外部访问。

6.6.2.1访问受保护的成员

C 为声明受保护成员 m 的类。访问仅在一个子类的主体允许 小号Ç
。此外,如果Id表示实例字段或实例方法,则:如果通过限定名称 Q.Id 进行访问,其中 QExpressionName
,则且仅当表达式 Q 的类型为 S时 ,才允许访问或 S 的子类 。如果通过字段访问表达式 E.Id进行 访问,其中 E
主要对象 表达,或通过一个方法调用表达式 (。)E.Id ,其中 Ë 是一个 主要 表达,则接入是允许的,当且仅当的类型 ë
小号 或的一个子类 小号



 类似资料:
  • 我有两个不同包的亲子班。我正在重写受保护类型的方法。我想访问子类中的超类保护方法。 考虑以下代码: 认为我是Java新手,并在main方法中提供替代comment的答案。

  • 问题内容: 出于好奇, 为什么将方法的访问修饰符设置为。为什么不能呢?有人可以向我解释这背后的任何具体原因吗? 另外,我知道该方法仅被调用一次。如果我在程序内部两次调用它,会发生什么情况?垃圾收集器会再次调用吗? 问题答案: 我用另一个问题回答您的问题: 为什么方法不应该受到保护? 通常,您应该尝试使事物尽可能私密。这就是封装的全部意义所在。否则,您 什么都 可以做。不能(因为派生类应该能够访问它

  • 我尝试模拟父类的受保护方法。因此,我使用&。我的家长班。

  • 问题内容: 定义为的受保护的具体原因是什么? 问题答案: 克隆受到保护的事实非常令人怀疑-事实是该clone方法未在Cloneable接口中声明。 它使该方法对于获取数据副本非常无用,因为你不能说: 我认为,Cloneable现在的设计在很大程度上被认为是一个错误(以下引用)。我通常希望能够实现接口的实现,Cloneable但不一定要实现接口Cloneable(类似于的使用Serializable

  • 6xx受保护 600 Series,Repliesregardingconfidentialityandintegrity 631 Integrityprotectedreply. 632 Confidentialityandintegrityprotectedreply. 633 Confidentialityprotectedreply.

  • 问题内容: 如何在受保护的python类中定义一个方法,只有子类才能看到它? 这是我的代码: 我只希望看到的方法的子类。 问题答案: Python不像C ++ / Java / C#支持访问保护。一切都是公开的。座右铭是:“我们都是成年人。” 记录下您的课程,并坚持要求您的合作者阅读并遵守文档。 Python的文化是,以下划线开头的名称意味着:“除非您真正知道应该使用这些名称,否则请不要使用它们。