我有以下代码
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
?
答案 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
。
:
int a
protected
中有class B
访问修饰符,因此您无法从其他包中访问它,并且您尝试通过int a
访问b
这是一个实例来自不同包裹的class B
。
简单就是这样。
参考Javadoc: