谁能告诉我这里发生了什么事;“受保护”;java中的修饰符 我学到的一点是java中的代码>私下的,其实并不意味着C++中的代码。java中的代码>私有是基于类的,而不是基于对象的。 i、 e我可以使用“对象点表示法”直接访问另一个对象私有成员,前提是我在该对象的类中这样做

谁能告诉我这里发生了什么事;“受保护”;java中的修饰符 我学到的一点是java中的代码>私下的,其实并不意味着C++中的代码。java中的代码>私有是基于类的,而不是基于对象的。 i、 e我可以使用“对象点表示法”直接访问另一个对象私有成员,前提是我在该对象的类中这样做,java,inheritance,protected,Java,Inheritance,Protected,然而,受保护的并不那么清楚。 我们将在这里考虑两个包: PAC1和 PAC2 BR> 我们在pack1package 并在pack2包中声明从pack1扩展而来的Alpha,以及从Alpha扩展而来的Gamma。 ! 这是课程代码,我只在这里包括了与问题相关的课程:Alpha、AlphaSub和Gamma package pack1; public class Alpha{ private int alphaPrivate; public int alphaPublic; pro

然而,
受保护的
并不那么清楚。 我们将在这里考虑两个包:<代码> PAC1和 PAC2 BR> 我们在
pack1
package
并在
pack2
包中声明从
pack1
扩展而来的
Alpha
,以及从
Alpha
扩展而来的
Gamma
。 !

这是课程代码,我只在这里包括了与问题相关的课程:
Alpha
AlphaSub
Gamma

package pack1;

public class Alpha{
  private int alphaPrivate;
  public int alphaPublic;
  protected int alphaProtected;
  int alphaPP;

  protected int alphaProtected(){
    return 1;
  }
  private int alphaPrivate(){
    return 1;
  }
}

package pack2;

import pack1.Alpha;
public class AlphaSub extends Alpha{
    int alphasubPP;
    private int alphasubPrivate;
    protected int alphasubProtected;
    public int alphasubPublic;

    public void meth() throws CloneNotSupportedException{
        new AlphaSub().alphaProtected(); //OK
        new Gamma().alphaProtected(); /*COMPILE ERROR. */

    }
}
因此,显然,即使AlphaSub和Gamma都从AlphaSub继承了
alphaProtected()
,也不能从AlphaSub调用Gamma继承的
alphaProtected()
。。 如果一个类的受保护方法只能从该类内部调用,那么从另一个类调用
clone
[由每个类从
对象继承的
类]难道不可能吗


有人能澄清一下吗

您的经历包括在:

6.6.2.1。访问受保护的成员

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

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

  • 如果通过限定名Q.Id或方法引用表达式Q::Id(§15.13)进行访问,其中Q是表达式名,则 当且仅当表达式Q的类型为S时才允许访问 或S的一个子类

  • 如果访问是通过字段访问表达式E.Id、方法调用表达式E.Id(…)或方法引用表达式E:: Id,其中E是主表达式(§15.8),则访问 当且仅当E的类型为S或S的子类时才允许

  • 如果访问是通过方法引用表达式T::Id进行的,其中T是ReferenceType,那么当且仅当 类型T是S或S的一个子类


如果您替换
newgamma().alphaProtected(),那么您是正确的带有
新Gamma().clone(),您将得到相同的编译错误。

的可能重复项,但我们应该能够调用
new Gamma()。从类的主体外部克隆
Gamma
,不是吗?否则,
克隆
方法对Gamma类有什么重要作用?我认为
clone
方法必须在
Gamma
中重新定义,才能从外部调用
Gamma
,否??请澄清\哦,是的,确实如此。只需在Gamma中重写受保护的方法,它就可以工作!有趣的是,比起教程文档中简单的陈述,还有很多东西