父 class 访问子 class 的受保护成员 Java
Parent class accessing protected members of subclasses Java
我有以下代码,我认为 Oracle 的教程没有完全解释这些代码。
package visibilidad;
import otropaquete.*;
public class ejemplo2 extends Test {
protected int prot = 4;
}
package otropaquete;
import visibilidad.*;
public class Test {
public void metodopublico() {
ejemplo2 a = new ejemplo2();
System.out.println(a.prot);
Hija b = new Hija();
System.out.println(b.prot);
}
}
class Hija extends Test {
protected int prot = 3;
}
基本上,我想做的是从父 class 访问子 class 的受保护成员。有趣的是,当 subclass 在另一个包中定义时,这会产生编译时错误
如果 subclass 在同一个 class 中定义,则运行完美。
我想知道标准是否考虑了这种行为。
protected
修饰符也允许从同一个包进行访问。参见 the documentation。
在 Java
中有 4 种不同的访问修饰符:
(No Modifier) - Visible to the package.
(private) - Visible to the class only.
(public) - Visible to the world.
(protected) - Visible to the package and all subclasses.
这是一个reference
使用 protected
修饰符意味着只有该包的其他 classes
和 subclasses
可以访问 field/method。在您的情况下,同一包中的 class 工作正常,而不同包中的 class 会抛出编译时错误,这正是应该发生的情况。
The docs 非常明确:protected
字段可在 Class、包和子类级别访问。由于父类既不是子类也不在同一个包中 - 该字段不可访问并且您遇到编译错误。
来自 Oracle 文档的访问级别 table:
Access Levels
Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
我有以下代码,我认为 Oracle 的教程没有完全解释这些代码。
package visibilidad;
import otropaquete.*;
public class ejemplo2 extends Test {
protected int prot = 4;
}
package otropaquete;
import visibilidad.*;
public class Test {
public void metodopublico() {
ejemplo2 a = new ejemplo2();
System.out.println(a.prot);
Hija b = new Hija();
System.out.println(b.prot);
}
}
class Hija extends Test {
protected int prot = 3;
}
基本上,我想做的是从父 class 访问子 class 的受保护成员。有趣的是,当 subclass 在另一个包中定义时,这会产生编译时错误 如果 subclass 在同一个 class 中定义,则运行完美。
我想知道标准是否考虑了这种行为。
protected
修饰符也允许从同一个包进行访问。参见 the documentation。
在 Java
中有 4 种不同的访问修饰符:
(No Modifier) - Visible to the package.
(private) - Visible to the class only.
(public) - Visible to the world.
(protected) - Visible to the package and all subclasses.
这是一个reference
使用 protected
修饰符意味着只有该包的其他 classes
和 subclasses
可以访问 field/method。在您的情况下,同一包中的 class 工作正常,而不同包中的 class 会抛出编译时错误,这正是应该发生的情况。
The docs 非常明确:protected
字段可在 Class、包和子类级别访问。由于父类既不是子类也不在同一个包中 - 该字段不可访问并且您遇到编译错误。
来自 Oracle 文档的访问级别 table:
Access Levels
Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N