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);
}
}
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);
}
}
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我也不是很理解输出,等待大佬出现。
这个类中初始化顺序为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 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;
}
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 其实是在构造之后执行的,而且只执行一次。