gpt4 book ai didi

java - 无法访问也是子类的子类中的 protected 成员

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:25:12 24 4
gpt4 key购买 nike

这是 A Programmer's Guide to Java™ SCJP Certification A Comprehensive Primer - Third Edition - Khalid A. Mughal Rolf W. Rasmussen 中的示例,我不能明白了。

我知道如果我们没有将它继承到另一个包中定义的子类中,我们就无法访问 protected 成员。

但是我还是不明白为什么我们不能从子类的子类中访问它。

例子如下

A.java

package packageA;
public class A {
protected int z;
}

B.java

package packageB;

import packageA.A;

public class B extends A {

void action(A obj1, B obj2, C obj3) {
z = 10; // z in B - Works
obj1.z = 10; // Won't work for obvious reason
obj2.z = 10; // z in B - Works
obj3.z = 10; // z in C - Works

}
}

class C extends B {

void action(A obj1, B obj2) {
z = 10; // Works
obj1.z = 10; // Won't work for obvious reason
obj2.z = 10; // z in B - WHY DOESN'T THIS WORK?????

}
}

最佳答案

当前接受的答案没有回答问题。它解释了为什么您无法访问成员 z A 的一个实例来自 B 的体内或 C .但是问题是为什么不能访问成员z B 的一个实例来自内部 C .

原因是B不是 C 的子类.阅读 Java 规范,第 6.6.2.1 节:

Let C be the class in which a protected member is declared. Access is permitted only within the body of a subclass S of C.

In addition, if Id denotes an instance field or instance method, then:

If the access is by a qualified name Q.Id, where Q is an ExpressionName, then the access is permitted if and only if the type of the expression Q is S or a subclass of S.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.2.1

(加粗我的)

所以在 B 内你可以说 obj3.z因为obj3类型为 C , 和 CB 的子类.

但在C内你不能说 obj2.z ,因为 obj2类型为 BB 不是 C 的子类.


总结一下protected的含义:

假设在类 A 的主体中声明了一个 protected 成员.

(1) 您可以从包含A 的包中的任何位置访问 protected 成员.

(2) 此外,一个子类 SA ,在不同的包中定义,可以访问 S 实例上的 protected 成员或继承自 S 的类的实例, 但不在 S 类的实例上继承自。

最后一个子句是回答这个问题的关键。

关于java - 无法访问也是子类的子类中的 protected 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6878884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com