public class TestCodeSeg
{
static
{
System.out.println("1");
}
{
System.out.println("2");
}
public TestCodeSeg()
{
System.err.println("3");
}
public static void main(String[] args)
{
new TestCodeSeg();
}
}
问题解答:
1.当父类和子类中都有静态代码块和构造函数时,执行顺序如下:
父类静态代码块---->子类静态代码块
父类构造函数------>子类构造函数
总结:静态代码优先执行,父类优于子类先执行,静态代码块是在jvm加载类的时候执行的,而且仅执行一次
2.System.out和System.err
System.out是行缓冲,System.err是不缓冲。System.err会自动重启一个线程来执行。
综合上述两点,得:静态代码块先执行,然后为构造函数代码块。所以1,2会先输出,随后输出3。但是这里有会牵扯到System.err和System.out两个的区别。如果将System.err改为System.out的话,执行结果一定是:
1
2
3
但是现在这个是System.err,它新开辟一个线程,且没有缓冲,会立即输出。而System.out是行缓冲,在1,2缓冲输出的时候,3可以在任意时候输出。具体结果为:1先2后是绝对的,3的输出位置与程序执行情况有关。输出结果可能会很奇葩,比如:
1
3
2
或者
3
1
2
甚至
13
2
和
1
32
大家结合我上面的分析,就能弄明白了。System.out.println执行的时候会自动换行,但是换行符没有处理之前是缓冲的,所以会有一个时间段,虽然很短,因为只输出一个1和2,但是3还是会可能和1或者2是一行。
另外System.err在eclipse中默认输出就为红色字体。
上述内容转载自:http://blog.youkuaiyun.com/lc2470348636/article/details/8800332
我的分析:
我的问题: 当一个java方法中同时存在 System.out.println和System.err.println输出语句时,无论两者的书写顺序谁先谁后,其输出内容的顺序是不固定的。
代码:
private static void test02() {
System.out.println("1111");
System.err.println("2222");
}
运行结果:
可能的运行结果第一种:
1111
2222
可能的运行结果第二种:
2222
1111
1、System.err,它新开辟一个线程,且没有缓冲,会立即输出。而System.out是行缓冲;
2、System.out.println执行的时候会自动换行,但是换行符没有处理之前是缓冲的,所以会有一个时间段,虽然很短;
另一种声音解释: 大多数操作系统都有三个标准文件描述符:标准输入,标准输出,标准出错.
三个操作系统的文件描述符映射到编程语言的标准库中,往往加了一层包装,但是名字通常还是叫标准输入,标准输出,标准出错.
在其它语言中的一般写法是:stdin,stdout,stderr(有的语言里大写,有的语言里小写).对应Java中的System.in,System.out,System.err.
在语言层面的实现三个文件描述符都是可以重定向的(只要你想).但是一般而言,如果你在unix shell或windows command line中使用管道或重定向,则只是针对标准输入和输出.
另外,标准输出和标准出错的一个区别是,标准输出往往是带缓存的,而标准出错没有缓存(默认设置,可以改).所以如果你用标准出错打印出来的东西可以马上显示在屏幕,而标准输出打印出来的东西可能要再积累几个字符才能一起打印出来.如果你在应用中混用标准输出和标准出错就可能看到这个问题.
总的来说,System.out用于正常的输出,也就是程序真正想输出的内容.而System.err用于出错信息的输出,也就是你本来不期待看到的东西.
因此,System.err打出来的信息常常会跑到System.out信息的前面去.