-1

我有以下代码

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 行的情况下,代码无法编译,因为我试图从基类(不同的包)访问类protected的成员(不同的包)。super为什么在可访问的情况supera

4

2 回答 2

2

那是

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

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

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

于 2014-01-14T06:57:48.437 回答
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 a具有protected访问修饰符,class B因此您无法从不同的包访问它,并且您正在尝试访问int a来自不同包b的实例class B

就是这么简单。

参考 Javadoc:

  1. 使用关键字 super
  2. 控制对类成员的访问
于 2013-11-11T12:10:47.510 回答