【问题标题】:Can anyone please explain me whats happening here : "protected" modifier in java谁能解释一下这里发生了什么:java中的“protected”修饰符
【发布时间】:2015-02-17 15:52:06
【问题描述】:

我学到的一件事是 private 在 java 中的含义与在 C++ 中的含义不同。 java 中的private 是基于类的,而不是基于对象的。 即我可以使用“对象点表示法”直接访问另一个对象的私有成员只要我在该对象的类中这样做。

但是,protected 不是很清楚。 我们将不得不在这里考虑两个包:pack1pack2
我们在 pack1 包中声明类 AlphaBeta
并声明 AlphaSub 扩展自 pack1AlphaGamma 也扩展自 pack2 包中的 Alpha 。 !

这是课程代码,我在这里只包含了与问题相关的课程:AlphaAlphaSubGamma

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 都从 Alpha 继承 alphaProtected() ,也不能调用 Gamma 从 AlphaSub 继承的 alphaProtected() .. 如果是这种情况,一个类的受保护方法只能从该类中调用,那么从另一个类调用clone [由Object 类的每个类继承] 是不可能的吗??

有人可以澄清一下吗?

【问题讨论】:

标签: java inheritance protected


【解决方案1】:

JLS 6.6.2.1. 涵盖了您所经历的:

6.6.2.1。访问受保护的成员

令 C 为声明受保护成员的类。访问是 只允许在 C 的子类 S 的主体内。

另外,如果Id表示一个实例字段或实例方法,那么:

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

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

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

你是对的,如果你用new Gamma().clone();替换new Gamma().alphaProtected();,你会得到同样的编译错误。

【讨论】:

  • 但是我们应该能够从Gamma 类的主体外部调用new Gamma().clone,不是吗?否则clone 方法将用于 Gamma 类有什么重要用途?我认为clone 方法必须在Gamma 中重新定义才能从Gamma 外部调用,不是吗??请澄清\
  • 哦,是的,确实如此。只需覆盖 Gamma 中的受保护方法即可!有趣的是,除了教程文档中简单说明的内容之外,还有更多内容
猜你喜欢
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
相关资源
最近更新 更多