大家好,我是 Stackoverflow 社区的新成员 :-]
首先感谢你们提供的非常有用的建议和更正。由于我是法国人,请原谅我的英语不完美。
这是我的问题:我目前正在学习Java编程语言,并且想测试一些继承的东西。如果我理解正确,声明为protected
的字段可以被与声明受保护字段的类在同一个包中的类访问,以及所有它的子类,无论它们是否在同一个包中。
因此,我创建了这4个类来测试这个问题。我有一个名为“package1”的包,其中包含A和C类。我还有一个名为“package2”的第二个包,其中包含A2和C类,其中A2扩展A。两个C类具有完全相同的代码,只是它们所在的包发生了变化。它们不扩展A。
在A类中,我声明了一些具有不同访问权限的成员,特别是使用protected
可见性声明的构造函数。以下是四个类的代码。
package1,A类:
package package1;
public class A {
public int a;
protected int b;
private int c;
int d;
protected static int h = 30;
protected void aff(){
System.out.println(h);
}
protected A(){
a = 1;
b = 2;
c = 3;
d = 4;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
包 1,类 C:
package package1;
public class C {
public C(){
super();
}
public void app(){
A obj = new A(); //////// OK
}
public static void main(String[] args) {
// TODO Auto-generated method stub
A obj = new A(); //////// OK
obj.aff(); //////// OK
System.out.println(obj.a);
}
}
包2,类A2(继承自A):
package package2;
import package1.A;
public class A2 extends A{
public int x;
A2(){
super();
}
public void app(){
A obj = new A(); //////// ERROR
}
public static void main(String[] args) {
// TODO Auto-generated method stub
A obj = new A(); //////// ERROR
A2 obj2 = new A2();
obj2.aff(); //////// OK
}
}
包2,类C:
package package2;
import package1.A;
public class C {
public C(){
super();
}
public void app(){
A obj = new A(); //////// ERROR
}
public static void main(String[] args) {
// TODO Auto-generated method stub
A obj = new A(); //////// ERROR
obj.aff(); //////// ERROR
System.out.println(obj.a);
}
}
对于 package2 中的 C 类,代码
A obj = new A();
报错了,但对于 package1 中的 C 类,情况并非如此。这是正确的,因为构造函数被声明为 protected
,而 package2 中的 C 不是 A 的子类,而 package1 中的 C 是 A 的子类。至此,我明白了。我的问题在于 A2 类中的代码
A obj = new A();
:无论在哪里写它,都会报错 The constructor A() is not visible
... 因为 A 类的构造函数被声明为 protected
,所以为什么我不能在 A2 类中实例化 A 类型的对象?当我将 A 构造函数声明为
public
时,它可以正常工作。此外,如果我按原样将 A2 类放在 package1 中,它也可以正常工作。似乎只有当 A 类构造函数被声明为 protected
时,在其子类中实例化 A 对象才可能是与其位于同一包中的子类。但是,正如您所看到的,如果我首先实例化一个 A2 对象,然后调用 A 类的
protected
aff() 方法,则它可以正常工作,受到保护的规则得到了遵守。有人能解释这个错误吗?在其子类中实例化超类对象时,如果超类构造函数声明为
protected
,那么这个子类是否总是位于与其超类相同的包中?如果是这样,为什么会这样?还是这与构造函数不被子类继承有关?但我想不出为什么会这样...非常感谢您抽出时间来阅读和回答 :-]