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

受保护的成员从Java中的其他程序包进行访问-好奇心

穆阳炎
2023-03-14
问题内容

package packageOne;
public class Base
{
protected void display(){
System.out.println(“in Base”);
}
}

package packageTwo;
public class Derived extends packageOne.Base {
    public void show(){
        new Base().display(); //this is not working throws compilation error that display() from the type Base is not visible
        new Derived().display(); //is working
        display(); //is working
    }
}

这两个软件包位于两个不同的文件中。但是为什么这种行为呢?


问题答案:

http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.6

class C
    protected member;

// in a different package

class S extends C

    obj.member; // only allowed if type of obj is S or subclass of S

动机可能如下。如果objS,则类S具有足够的内部知识,则它有权操作其成员,并且可以安全地进行此操作。

如果obj不是S,它可能是另一个子类S2C,其中S有没有想法。写作S2时可能甚至还没有出生S。为了S操纵S2受保护的内部结构是非常危险的。如果允许,从S2的角度来看,它不知道谁会篡改其受保护的内部以及如何进行篡改,这使S2工作很难就其自身状态进行推理。

现在,如果objD,并且D extends SS访问危险obj.member吗?并不是的。如何S使用member是一个共享knowlege
S及其所有子类,包括DS因为超类具有定义行为的权利,而D子类具有接受和遵循行为的义务。

为了更容易理解,应将规则真正简化为要求其obj(静态)类型准确S。毕竟,子类D出现在中是非常不寻常且不合适的S。即使发生这种情况,静态类型objD,我们的简化规则也可以通过向上转换轻松地处理它:((S)obj).member



 类似资料:
  • 我正在阅读这本Java SCJP的书,我偶然发现了以下内容: 但是我得到了这个错误: 那么,出什么问题了?

  • 问题内容: 我想了解以下示例中的情况(通过包从子类外部访问受保护的成员)。 我知道对于包外部的类,子类只能通过继承才能看到受保护的成员。 有两个包:和。 : : : 可以理解,中的方法可以访问,因为受保护的成员只能通过继承来访问。 我的问题是,为什么是方法,通过在基准访问时,工作正常的方法 ,但 将无法正常工作 通过访问时的参考? 问题答案: 该类中的代码被允许通过type的引用访问受保护的成员。

  • 问题内容: 我遇到了一个奇怪的问题,我无法弄清楚在尝试插入程序时弹出的问题。另一个问题是我无法创建一个简单的测试用例,因为每次尝试都可以。我一定缺少一些并发症。但我会尽力清楚地描述这种情况,以防任何人熟悉。 我有一个称为Seed的基类,它是主应用程序的一部分,并由系统类加载器加载。我有一个包含Road类的插件,该类是Seed的子类。它是在运行时从单独的jar文件加载的。Road类引用字段Seed.

  • 我有几个Azure Functions,我想使用Azure AD对其应用身份验证。在用户模拟身份验证方面,我已经成功做到了这一点。但不幸的是,我无法从尝试访问Azure Functions的守护程序应用程序中获得同样的工作。 我的守护程序应用程序在Azure AD中注册,并公开应用程序范围。基本上,我有其他构建为应用程序服务的API,可以从守护程序应用程序成功地进行身份验证。我为Azure功能应用

  • 问题内容: 我想对此进行一些讨论,但无法推断出我的情况的答案。仍然需要帮助。 这是我的代码: 在上面的示例中,下面的一些定义似乎令人困惑: 问题: 为什么我不能从子类实例(对象)访问受保护的成员()? 问题答案: 作为声明类的子类的其他包中的类只能访问其自己的继承成员。 …但不是其他对象的继承成员。

  • 问题内容: 我为SCJP做准备,我也知道受保护成员的作用域在包中以及在其他包中(在某些情况下,例如只有继承才可能)。 例如:我有三个类作为Parentclass Childclass Friendclass 这背后的原因是什么,在Friendclass中,成员x将不接受为其分配值,而对于Childclass而言,它充当私有成员。 问题答案: 您甚至无法访问,因为具有默认可见性(不受保护)。参见ht