要明白这些你需要先了解jvm初始化对象的顺序。首先在class加载的时候你初始化静态变量和静态初始化块,然后是实例变量和构造函数。当然这些也都是从上往下的顺序执行的。public class HelloWorld{ public String s = "hello world"; //3 public static int i; //1 public HelloWorld(){ //... //4 } static{ //... //2 } }
public class DiffTime { public static int sta=1; static{ sta=2; System.out.println("fdsafdsafds"); } public static void main(String[] args) { System.out.println(DiffTime.sta); } }输出是2 自己理解去
错了使出是:fdsafdsafds 2
public class Test { public int a = 10 ; { System.out.println("aaaa"); System.out.println(a); } public Test(){ a = 11 ; }
public static void main(String[] args) { new Test() ; } } 可以看出这种执行顺序,其实你把他想成一个类的的属性赋值就好了
静态代码块,也就是写在任何函数体外的以static修饰的代码块。 类似 static{ }普通代码块,就是写在任何函数体外的代码块 { }对象初始化顺序: 1、静态代码块(对象的类第一次被加载时,会被执行,如果之前加载过,则不会被执行) 2、普通代码块(每次创建对象时,都会被执行) 3、构造函数 下面是个例子:public class MySolution { { System.out.println("This is Common Code Block"); } static { System.out.println("This is Static Code Block"); } public MySolution(){ System.out.println("This is a constructor"); } public void test(){ System.out.println("Only For Test"); } public static void main(String[] args) { MySolution my = new MySolution(); my.test(); MySolution my2 = new MySolution(); my2.test(); } }结果为: This is Static Code Block This is Common Code Block This is a constructor Only For Test This is Common Code Block This is a constructor Only For Test
写一个无参的构造方法 如: public inner(){ //把你实例时,想要执行的代码,放在这个构造方法里就行了 }
<init>先初始化变量,再执行初始化语句(即你写的那个),再调用构造函数
不写构造方法的的类,在new实例化的时候系统默认的会自动加上一个无参的构造。
而System.out.println("in");是静态方法块,只有在对象被创建的时候才初始化,
构造方法和静态语句块明显是两码事情。有不同的使用方法和场景
静态代码块要早于构造方法执行。
public String s = "hello world"; //3
public static int i; //1
public HelloWorld(){
//... //4
}
static{
//... //2
}
}
感觉好像不能被执行一样
public class DiffTime {
public static int sta=1;
static{
sta=2;
System.out.println("fdsafdsafds");
}
public static void main(String[] args) {
System.out.println(DiffTime.sta);
}
}输出是2 自己理解去
2
public int a = 10 ;
{
System.out.println("aaaa");
System.out.println(a);
}
public Test(){
a = 11 ;
}
public static void main(String[] args) {
new Test() ;
}
}
可以看出这种执行顺序,其实你把他想成一个类的的属性赋值就好了
类似
static{
}普通代码块,就是写在任何函数体外的代码块
{
}对象初始化顺序:
1、静态代码块(对象的类第一次被加载时,会被执行,如果之前加载过,则不会被执行)
2、普通代码块(每次创建对象时,都会被执行)
3、构造函数
下面是个例子:public class MySolution {
{
System.out.println("This is Common Code Block");
}
static
{
System.out.println("This is Static Code Block");
}
public MySolution(){
System.out.println("This is a constructor");
}
public void test(){
System.out.println("Only For Test");
}
public static void main(String[] args) {
MySolution my = new MySolution();
my.test();
MySolution my2 = new MySolution();
my2.test();
}
}结果为:
This is Static Code Block
This is Common Code Block
This is a constructor
Only For Test
This is Common Code Block
This is a constructor
Only For Test
如:
public inner(){
//把你实例时,想要执行的代码,放在这个构造方法里就行了
}