即使在子类中未使用super()关键字,我也对超级类构造函数语句的打印有疑问。
class A
{
int i;
A()
{
System.out.println("A's constructor");
}
}
class B extends A
{
int i;
B(int a , int b)
{
super.i=a;
i=b;
}
void show()
{
System.out.println(super.i);
System.out.println(i);
}
}
class UseSuper
{
public static void main(String[] args)
{
B b=new B(1,2);
b.show();
}
}
我的程序的输出是:
A的构造函数
1个
2
我不明白为什么我要在控制台上打印A的构造函数?
问题来源:Stack Overflow
1.在子类的成员方法中,访问父类的成员变量。
2.在子类的成员方法中,访问父类的成员方法。
3.在子类的构造方法中,访问父类的构造方法。
从https://docs.oracle.com/javase/tutorial/java/IandI/super.html检查以下几行
注意:如果构造函数未明确调用超类构造函数,则Java编译器会自动将调用插入到超类的无参数构造函数中。如果超类没有无参数构造函数,则将出现编译时错误。对象确实具有这样的构造函数,因此如果对象是唯一的超类,就没有问题。
如果子类构造函数显式或隐式调用其超类的构造函数,则您可能会认为将调用整个构造函数链,一直返回到Object的构造函数。实际上就是这种情况。这称为构造函数链接,当类下降很长时,您需要意识到这一点。
希望能消除您的疑虑。
[更新]
发布此更新可以消除OP在下面的评论中提到的疑虑。
以下代码将不会编译,因为A()尚未定义隐式超级构造函数,我们也未明确定义它。注意,A()当没有其他带参数的构造函数被定义时,隐式的超级构造函数会自动定义。
class A {
int i;
A(int x,int y){
}
}
class B extends A {
int i;
B(int a, int b) {
super.i = a;
i = b;
}
void show() {
System.out.println(super.i);
System.out.println(i);
}
}
public class UseSuper {
public static void main(String[] args) {
B b = new B(1, 2);
b.show();
}
}
[另一个更新]
发布此更新以清除OP在他的以下评论中提到的另一个疑问。
以下代码也不会编译,因为A()已将超级构造函数声明为private阻止子类构造函数调用它。
class A {
int i;
private A() {
System.out.println("A's constructor");
}
}
class B extends A {
int i;
B(int a, int b) {
super.i = a;
i = b;
}
void show() {
System.out.println(super.i);
System.out.println(i);
}
}
class UseSuper {
public static void main(String[] args) {
B b = new B(1, 2);
b.show();
}
}
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。