【问题标题】:Accessing protected using super [duplicate]使用超级访问受保护[重复]
【发布时间】:2013-11-23 04:05:36
【问题描述】:

我有以下代码

package com.kathy.accessmodifiers2;

public class base extends Object{
protected int a = 10;
}

package com.kathy.accessmodifiers;
import com.kathy.accessmodifiers2.*;

class derived extends base {
public void D() {
    System.out.println("D");
    base b = new base();
    System.out.println(super.a); //line 1
    //System.out.println(b.a); //line 2
    //Only this class can access the proctected member.
    System.out.println(this.a);
    System.out.println(a);
}
}

class derived2 extends derived {
public void D2() {
    System.out.println(a);
}
}

public class Protected {

public static void main(String str[]) {
    new derived2().D();
}
}

在第 1 行中,我使用 super.a,输出为 10。在第 2 行的情况下,代码无法编译,因为我试图从基类访问 super 类(不同包)的成员 protected (不同的包装)。 为什么在super 的情况下a 是可访问的?

【问题讨论】:

  • 您的Derived 类没有可见性修饰符,因此使用包私有。如果你声明它public Derived extends Base你应该没问题。
  • @isnot2bad 受保护的成员可以被继承的子类访问,而不是父类的实例。 b 是这里父类的实例。
  • @KishanSarsechaGajjar 你是对的!我没有注意到注释的第 2 行。我只是复制了源代码并编译了它。由于 javac 没有抱怨,我认为一切正常。我会删除我的评论!
  • @isnot2bad 没关系...你也可以参考我的回答...!!

标签: java protected super access-modifiers


【解决方案1】:
base b = new base();
System.out.println(super.a); //line 1
System.out.println(b.a); //line 2

在第 1 行: super.myMethod()super.variable 将调用被覆盖的方法或访问被覆盖的属性。 所以通过第 1 行,您正在访问子类中覆盖的 int a

在第 2 行: int aclass B 中具有protected 访问修饰符,因此您无法从不同的包访问它,并且您正试图通过b 访问int a,这是来自不同包的class B 的实例。

就是这么简单。

参考Javadoc:

  1. Using the Keyword super
  2. Controlling Access to Members of a Class

【讨论】:

    【解决方案2】:

    那是

    protected 一个包的一个类的成员可以在另一个包中访问当且仅当该类被另一个包中的某个其他类继承。

    1 即在上面的示例中,base 类由不同包中的derived 类扩展,因此其(base 类)受保护的成员可以通过super 关键字访问。

    2 但我们不能通过在另一个包中创建object 来直接访问base 类的protected 成员。因为它们可以在同一个包中访问直到我们不在另一个包中继承该类

    【讨论】:

      猜你喜欢
      • 2015-02-11
      • 2011-04-29
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 2019-10-27
      相关资源
      最近更新 更多