public class Book { static Book book = new Book();
static int a;
static int b = 0;
private Book(){
a++;
b++;
}
public static void main(String[] args) {
Book book = new Book();
System.out.println(book.a);
System.out.println(book.b);
}

}

解决方案 »

  1.   

    package com.demo;public class Book {
        static Book book = new Book();
        static int a;
        static int b = 0;
        private Book(){
            System.out.println("a="+a+",b="+b);
            a++;
            b++;
            System.out.println("a="+a+",b="+b);
        }    public static void main(String[] args) {
            System.out.println("start main -- book");
            Book book = new Book();
            System.out.println(book.a);
            System.out.println(book.b);
        }}
    输出:a=0,b=0
    a=1,b=1
    start main -- book
    a=1,b=0
    a=2,b=1
    2
    1
    https://www.cnblogs.com/DreamDrive/p/5428622.html我也不是很理解输出,等待大佬出现。
      

  2.   

    初始化顺序:静态大于非静态,块大于成员变量、成员变量大于函数,同等级的先声明先初始化,大概就可以这么分
    这个类中初始化顺序为book、a、b 、构造函数(构造函数可视为静态函数)
    book、a、b是静态变量,一个类只有一个相同的静态变量
    执行顺序:book初始化,新构建第二个Book类,进入第二个Book类
    book已经初始化了,a、b初始化等于0,执行Book类的构造函数开始时输出0、0,++后变成1、1
    执行完构造函数后,返回第一个Book类,b重新赋值为0,a、b在构造函数开始时输出1、0,++后变成2,1
      

  3.   

    这里static int b=0;事实上是执行的 static int b; b=0;static 申明只执行一次,赋值还是会执行的,所以b再次被赋值为0;
      

  4.   

    执行顺序优先级:静态块>main()>构造块>构造方法 
    这3个就是静态块,同是静态块,按声明的顺序执行
    static Book book = new Book();
        static int a;
        static int b = 0;
     
    首先执行 static Book book = null,同时a,b声明时获取基本类型的标准初值,也就是a=0,b=0;  因为每产生一个book对象都需要调用一次构造方法,此时就执行了构造方法,这时候a=1,b=1,book对象才真正的产生。其次执行static int b = 0;  这时候b被重新赋值为0
    然后进入main()方法里,执行Book book = new Book(); 此时又调用构造方法,a=2,b=1 打印输出 
    这里需要明确的是静态变量的声明和初始化是两种不同的操作
    a,b声明的时候他就已经获取到了基本类型的标准初值
    a只是声明,b是初始化。
    由于静态变量声明的时候就已经确定了内容的位置,所以静态变量的声明和初始化的顺序可以颠倒。
    static int b = 0;
    等同于
    static int b;
    static{
      b =0;
    }
      

  5.   

    因为b=0;可能看不清楚 我把b=2,大家在看一下;
    public class Book1 {
        static Book1 book = new Book1();
        static int a;
        static int b=2;
        private  Book1() {
    // TODO Auto-generated constructor stub
            System.out.println("a="+a+",b="+b);
            a++;
            b++;
            System.out.println("a="+a+",b="+b);
        }
     
        public static void main(String[] args) {
            System.out.println("start main -- book");
            Book1 book = new Book1();
            Book1 book1= new Book1();
            System.out.println(book1.a);
            System.out.println(book1.b);
        }
    }a=0,b=0
    a=1,b=1
    start main -- book
    a=1,b=2
    a=2,b=3
    a=2,b=3
    a=3,b=4
    3
    4这里static b=2;
    等同于 static b;
      static {b=2};
    静态赋值优先高于,静态块,所以b=2 其实是在构造之后执行的,而且只执行一次。