我有以下代码,我认为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;
}
基本上,我要做的是从父类访问受保护的子类成员。有趣的是,当在另一个包中定义子类时,这会产生编译时错误 如果子类在同一个类中定义,则运行完美。
我想知道是否在标准中考虑了这种行为。
答案 0 :(得分:2)
The docs非常明确:protected
字段可在Class,Package和Subclass级别访问。由于父既不是子类也不在同一个包中 - 该字段不可访问,并且您收到编译错误。
Oracle docs的访问级别表:
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
答案 1 :(得分:1)
在protected
中有4种不同的访问修饰符:
(无修饰符) - 包可见。
(私人) - 仅对班级可见。
(公开) - 向世界展示。
(受保护) - 对包和所有子类可见。
使用Java
修饰符仅表示该包的其他protected
,classes
可以访问该字段/方法。在您的情况下,来自同一个包的类工作正常,而来自不同包的类会抛出编译时错误,这正是应该发生的错误。
答案 2 :(得分:0)
$ bundle install
修饰符也允许从同一个包中访问。请参阅the documentation。