通过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.out和System.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请将答案标记为已接受,如果它帮助您并解决了您的问题。这样其他用户也可以知道这个问题:-)谢谢。这就是我把代码放在这里的错误。现在它改正了。