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
上的一个方法中时,我们应该能够调用它的受保护方法。规范中的规则禁止这样做
受保护的方法可以由类的子类访问。不清楚您的意思。您是否对这种行为感到惊讶,或者您是否理解规范中所说的,并且您正试图确定其背后的原因?受保护的方法可以由类的子类访问。您不清楚您的意思。您是否对这种行为感到惊讶,或者您是否理解规范中所说的,并且您正在试图确定其背后的原因?