你好 Stackoverflow 社区 :-]
我是一名新会员,首先我要感谢您提供的非常有帮助的建议和纠正。由于我是法国人,如果我的英语不完美,请原谅我。
这是我的问题:我目前正在学习 Java 编程语言,我想测试一些继承的东西。如果我理解正确的话,一个字段声明为protected
可以由与声明 protected 字段的类位于同一包中的类及其所有子类访问,无论它们是否位于同一包中。
所以,我做了这 4 门课来测试这一点。我有一个名为“package1”的包,其中包含类 A 和 C。我还有一个名为“package 2”的包,其中包含类 A2 和 C,其中 A2 扩展了 A。这两个 C 类具有完全相同的代码,只是包所在的位置它们位于变化处。它们不扩展 A。
在 A 类中,我声明了一些具有不同访问属性的成员,尤其是使用protected
能见度。这是四个类的代码。
包 1,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);
}
}
package2,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 的子类,而 C 位于 package1 中。至此,我明白了。
我的问题出在代码上A obj = new A();
在 A2 类中:无论写到哪里,都会抛出错误The constructor A() is not visible
...由于类 A 构造函数声明为protected
,为什么我无法在 A2 类中实例化 A 类型的对象?
当我将构造函数声明为public
,效果很好。此外,如果我将 A2 类放入 package1 中,让代码保持原样,它也可以工作。似乎只有当子类位于同一个包中并且 A 构造函数声明为时,才可以在 A 的子类中实例化 A 对象protected
.
但是,正如你所看到的,如果我首先实例化一个 A2 对象,然后调用 A 类protected
aff() 方法,它可以工作并且尊重受保护的规则。
有人对此错误有解释吗?当在子类中实例化超类的对象时,如果超类构造函数声明为,则该子类是否始终与其超类位于同一个包中protected
?如果是的话,为什么会这样呢?
或者这是否必须处理构造函数不被子类继承的事实?但我不明白为什么如果是这样的话......
预先非常感谢您花时间阅读和回答:-]