通过super()关键字调用Java构造函数生成冲突结果

通过super()关键字调用Java构造函数生成冲突结果,java,Java,下面是我用来检查继承者行为的代码 超级级 class Vehicle { public Vehicle(int x) { System.err.println("super param " +x); } public Vehicle() { System.err.println("super defult"); } } 子类 class Bus extends Vehicle { public Bus(int y)

下面是我用来检查继承者行为的代码

超级级

class Vehicle {

    public Vehicle(int x) {
        System.err.println("super param " +x);
    }

    public Vehicle() {
        System.err.println("super defult");
    }
}
子类

class Bus extends Vehicle {

    public Bus(int y) {
        super(y);
        System.out.println("Sub param");
    }

    public Bus() {
        super(11);
        System.out.println("Sub Class defult");
    }
}
主要课程是

public class TestClass {
    public static void main(String[] args) {
        new Bus();
    }
}
三个不同的结果如下所示

结果1

结果2

结果3


**这里发生了什么事?输出的顺序与我们预期的不同**

在打印到System.err的超类中,但在打印到System.out的子类中,因此您的问题与继承无关,而与打印的工作方式有关。

您的类名为Bus,在构造函数中,您的类名应与类名相同,您正在使用bus作为构造函数名称,请将其更改为bus

class Bus extends vehicle {

    public bus(int y) {
        super(y);
        System.out.println("Sub param");
    }

    public bus() {
        super(11);
        System.out.println("Sub Class defult");
    }
}
将测试中的主要功能更改为:

new Bus();
您的示例在此之后运行良好。

System.out是“标准输出”(stdout),System.err是“错误输出”(stderr),它们都是不同的文件描述符。 派生类使用标准输出fd,父类使用标准输出fd

您的程序也没有强制刷新输出。您可以通过在语句中添加新行来强制刷新,这样可以保留打印顺序


由于您的代码不会强制刷新fds上的输出,内核会在程序终止后为您执行此操作,并且无法保证将首先刷新哪个fd。

构造函数名必须与类名相同,在本例中,类名为Bus,并且在构造函数名称中键入Bus

第二件事是理解System.outSystem.err之间的区别

因此,System.out用于提供输出,并在您使用的控制台中打印。println()或print()或您想要使用的任何东西,以及在print函数中给出的任何东西,您将在控制台中以纯文本的形式获得结果


但是在System.err中,它是不同的,是的,您可以将相同的.print()函数与System.err一起使用,但是您将得到的输出现在是错误(在异常日志中为红色)。因此,它们只是用于识别自定义错误消息自定义调试日志

看起来您只是在写入/刷新out和err流之间受到干扰。选一个,把所有的信息都写进去。你到底有什么问题?输出的颜色?输出的顺序?您使用的是两个不同的输出流-它们分别刷新并且没有定义的顺序。@FinnEggers输出的顺序output@wthamira这是因为您使用两个不同的流。编程速度非常快。向流中添加内容也是如此。如果你用一个,他们是完美的秩序。如果使用两个,其中一个可能需要比另一个更长的处理时间。就这样。仅因为在将objectB放入streamB之前将objectA放入streamA,并不意味着pbkectA将在objectB离开streamA之前离开streamA。虽然构造函数必须与类名匹配这一点是正确的,但它必须只是一个转录错误,因为代码必须为OP编译才能获得输出。谢谢。这就是我把代码放在这里的错误。现在它更正了。@wthamira请将答案标记为已接受,如果它帮助您并解决了您的问题。这样其他用户也可以知道这个问题:-)谢谢。这就是我把代码放在这里的错误。现在它改正了。