与构造函数和子类混淆

zay*_*ynv 3 java constructor class subclass

我无法理解使用带子类的构造函数的概念.

这是父类:

public class A
{
    public A()
    {
        System.out.println("The default constructor of A is invoked");
    }
}
Run Code Online (Sandbox Code Playgroud)

儿童班:

public class B extends A
{
    public B(String s)
    {
        System.out.println(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

而我的主要方法是:

public class C
{
    public static void main (String[] args)
    {
        B b = new B("The constructor of B is invoked");
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行C时,我得到的输出是

调用A的默认构造函数

调用B的构造函数

我不明白为什么来自A类的消息正在输出.因为你将一个字符串参数传递给B类的构造函数,它不应该只打印出来吗?换句话说,输出不应该只是:

调用B的构造函数

在此先感谢,我真的很感谢你们给予的任何帮助.

Sud*_*hul 7

来自文档

如果构造函数未显式调用超类构造函数,则Java编译器会自动插入对超类的无参数构造函数的调用.如果超类没有无参数构造函数,则会出现编译时错误.对象确实有这样的构造函数,因此如果Object是唯一的超类,则没有问题.

因此,即使您没有显式调用超类构造函数,编译器也会插入super()在类的构造函数中调用的语句B.

这就是B类构造函数在编译后的样子.

public B(String s){
    super(); // this is inserted by the compiler, if you hadn't done it yourself.
    System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢,你解释得非常好! (2认同)