gpt4 book ai didi

java - 对java中 protected 成员的行为感到困惑

转载 作者:行者123 更新时间:2023-12-02 04:07:55 24 4
gpt4 key购买 nike

我目前正在阅读 SCJP 学习指南。在第 #1 章第 #36 页中,提到的是:

Once the subclass-outside-the-package inherits the protected member, that member (as inherited by the subclass) becomes private to any code outside the subclass, with the exception of subclasses of the subclass. So if class Neighbor instantiates a Child object, then even if class Neighbor is in the same package as class Child, class Neighbor won't have access to the Child's inherited (but protected) variable x.

但是每当我尝试通过以下代码进行检查时:

    //parent class in pkg#1:
package com.main.parentPkg;
public class ParentInSamePkg {
protected void methodInParent(){
System.out.println("Inside ParentInSamePkg-->methodInParent");
}
}

// First child class in pkg#2
package com.main.childPkg;
import com.main.parentPkg.ParentInSamePkg;
public class ChildInOtherPkg extends ParentInSamePkg{
void mthd(){
System.out.println("inside ChildInOtherPkg:mthd");
methodInParent();
}
}

//Child class of child class inside pkg#3
package com.main.grandChildPkg;
import com.main.childPkg.ChildInOtherPkg;
class GrandChild extends ChildInOtherPkg{
void mthd(){
System.out.println("inside GrandChild:mthd");
methodInParent();
}
public static void main(String[] args) {
GrandChild g=new GrandChild();
g.mthd();
}
}

每当我执行上面的代码并运行 GrandChild 类的 main 方法时,它都会将输出打印为:

inside GrandChild:mthdInside ParentInSamePkg-->methodInParent

正因为如此,我很困惑。根据概念, protected 成员在子类继承后变为私有(private),任何扩展该子类的类都无法访问该成员。但在上面的代码中,它是可以访问的。

请帮我理解。

最佳答案

下表清楚地描述了所有类型的访问修饰符的行为。 enter image description here

在 protected 情况下,它只能被不同包中存在的非子类访问。我们可以说, protected 行为类似于私有(private),当且仅当它们被存在于不同包中的非子类访问时不同的包。

关于java - 对java中 protected 成员的行为感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34081756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com