【发布时间】:2013-07-05 04:35:20
【问题描述】:
我正在尝试了解类中受保护成员的行为。我有一个类TopClass,其中包含受保护的整数pr。
类:
package com.test;
import com.test.anotherpackage.SubClass1;
import com.test.anotherpackage.SubClass2;
import com.test.anotherpackage.SubClass3;
public class TopClass {
protected int pr;
void action(TopClass t, SubClass1 s1, SubClass2 s2, SubClass3 s3) {
t.pr = 3;
s1.pr = 0;
s2.pr = 1;
s3.pr = 1;
}
}
还有另一个包com.test.anotherpackage,它有3个类SubClass1、SubClass2和SubClass3。继承层次如下:
SubClass1 extends TopClassSubClass2 extends SubClass1SubClass3 extends SubClass2
子类 1
package com.test.anotherpackage;
import com.test.TopClass;
public class SubClass1 extends TopClass {
void action(TopClass t, SubClass1 s1, SubClass2 s2, SubClass3 s3) {
t.pr = 0; // Error because not in same package.
s1.pr = 0; //(1)
s2.pr = 1; // Does not throw an Exception. Why? (2)
s3.pr = 1; // (3)
}
}
子类2
package com.test.anotherpackage;
import com.test.TopClass;
public class SubClass2 extends SubClass1 {
void action(TopClass t, SubClass1 s1, SubClass2 s2, SubClass3 s3) {
t.pr = 0; // Error because not in same package.
s1.pr = 0; // Throws Exception, why? (4)
s2.pr = 1; // (5)
s3.pr = 1; // Does not throw an Exception. Why?(6)
}
}
子类3
package com.test.anotherpackage;
import com.test.TopClass;
public class SubClass3 extends SubClass2 {
void action(TopClass t, SubClass1 s1, SubClass2 s2, SubClass3 s3) {
t.pr = 0;
s1.pr = 0; // Not Visible (7)
s2.pr = 1; // Not Visible (8)
s3.pr = 1; // (9)
}
}
在上面的代码中,(1)、(2)、(3)、(5)、(6) 和 (9) 可以完美运行,没有任何可见性问题。但是(4)、(7)、(8) 存在可见性问题。
根据JLS§6.6.2.1,
令 C 为声明受保护成员的类。访问是 只允许在 C 的子类 S 的主体内。
另外,如果Id表示一个实例字段或实例方法,那么:
如果通过限定名称 Q.Id 进行访问,其中 Q 是 ExpressionName,则当且仅当类型为 表达式 Q 是 S 或 S 的子类。
如果通过字段访问表达式 E.Id 进行访问,其中 E 是 主表达式,或通过方法调用表达式 E.Id(. . .), 其中 E 是主表达式,则允许访问,如果并且 仅当 E 的类型是 S 或 S 的子类时。
我想在这里理解的是为什么if the type of the expression Q is S or a subclass of S 会出现。是否有任何特定场景可以使此实施受益?任何相关的例子都将受到高度赞赏。我尝试在 SO 上查看它,但找不到可以解决我疑问的解释。
【问题讨论】:
标签: java inheritance packages protected