Java 来自相同和不同包的受保护方法调用之间的差异

Java 来自相同和不同包的受保护方法调用之间的差异,java,Java,根据我的理解,受保护的方法可以被同一个包中的任何类访问,但是只有这个类的子类可以从其他包访问 package Parent; public class Parent { protected void display() { //Code here } } 此处this.display()成功,因为子类负责实现。但是p1.display()不起作用,因为p1不属于Child类。 如果从同一个包中的类访问受保护的方法,我们如何证明这种行为的合理性 p1.display(

根据我的理解,受保护的方法可以被同一个包中的任何类访问,但是只有这个类的子类可以从其他包访问

package Parent;

public class Parent {
    protected void display() {
    //Code here
    }

}
此处
this.display()
成功,因为子类负责实现。但是
p1.display()
不起作用,因为
p1
不属于
Child
类。 如果从同一个包中的类访问受保护的方法,我们如何证明这种行为的合理性

p1.display();
具有运行在任何包中实现的方法的潜力,具体取决于您接收到的
父类
子类。这显然违反了
protected
背后的意图,即专门允许为扩展而设计的类向其子类提供封装方法

如果该调用被允许,流氓类将很容易从一个与它完全无关的类访问封装的方法。

p1.display();
具有运行在任何包中实现的方法的潜力,具体取决于您接收到的
父类
子类。这显然违反了
protected
背后的意图,即专门允许为扩展而设计的类向其子类提供封装方法


如果该调用被允许,流氓类将很容易从一个与它完全无关的类访问封装的方法。

如果您使用
super.display()
它将起作用。原因是父类中受保护的方法总是对子类可见,无论它们是否在同一个包中。当您只说
p1.display()
时,它希望该方法是公共的,因为这两个类位于不同的包中

请阅读以下内容,以获得更多的了解


如果使用
super.display()
它会工作。原因是父类中受保护的方法总是对子类可见,无论它们是否在同一个包中。当您只说
p1.display()
时,它希望该方法是公共的,因为这两个类位于不同的包中

请阅读以下内容,以获得更多的了解


您提供的示例是使用传递给子对象的
父对象的实例调用该方法。规范规定,当作用域受到保护时,必须从子类访问字段或实例方法。请注意规范中规定的部分,
当且仅当表达式Q的类型为S或S的子类时才允许访问。在您的示例中,ExpressionName是p1,它是
父类
的实例,使其类型不是
子类
子类
,因此不允许访问

设C为声明受保护成员的类。访问权限是 仅允许在C的子类S的主体内使用

此外,如果Id表示实例字段或实例方法,则:

如果访问是通过限定名称Q.Id进行的,其中Q是ExpressionName,则当且仅当类型为 表达式Q的子类是S或S的子类

如果通过字段访问表达式E.Id(其中E是主表达式)或方法调用表达式E.Id(…)进行访问, 其中E是主表达式,则如果且 仅当E的类型是S或S的子类时

我想我明白你想表达的意思了,因为
Child
Parent
的一个子类,当我们将
Parent
的一个实例传递到
Child
上的一个方法中时,我们应该能够调用它的受保护方法。规范中的规则禁止这样做


您提供的示例是使用传递给子对象的
父对象的实例调用该方法。规范规定,当作用域受到保护时,必须从子类访问字段或实例方法。请注意规范中规定的部分,
当且仅当表达式Q的类型为S或S的子类时才允许访问。在您的示例中,ExpressionName是p1,它是
父类
的实例,使其类型不是
子类
子类
,因此不允许访问

设C为声明受保护成员的类。访问权限是 仅允许在C的子类S的主体内使用

此外,如果Id表示实例字段或实例方法,则:

如果访问是通过限定名称Q.Id进行的,其中Q是ExpressionName,则当且仅当类型为 表达式Q的子类是S或S的子类

如果通过字段访问表达式E.Id(其中E是主表达式)或方法调用表达式E.Id(…)进行访问, 其中E是主表达式,则如果且 仅当E的类型是S或S的子类时

我想我明白你想表达的意思了,因为
Child
Parent
的一个子类,当我们将
Parent
的一个实例传递到
Child
上的一个方法中时,我们应该能够调用它的受保护方法。规范中的规则禁止这样做


受保护的方法可以由类的子类访问。不清楚您的意思。您是否对这种行为感到惊讶,或者您是否理解规范中所说的,并且您正试图确定其背后的原因?受保护的方法可以由类的子类访问。您不清楚您的意思。您是否对这种行为感到惊讶,或者您是否理解规范中所说的,并且您正在试图确定其背后的原因?