使用超级访问受保护

时间:2013-11-11 11:12:31

标签: java protected super access-modifiers

我有以下代码

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成员(不同的包)来自基类(不同的包)。 为什么super可以访问a

2 个答案:

答案 0 :(得分:2)

那是

当且仅当此类由另一个包中的某个其他类继承时,才能在另一个包中访问

protected一个类的一个包的成员。

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

2但是我们无法通过在另一个包中创建base来直接访问protected类“{1}}成员。因为它们可以在同一个包 中访问,直到我们不能访问在另一个包中继承该类

答案 1 :(得分: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. Using the Keyword super
  2. Controlling Access to Members of a Class