Java中普通代码块,构造代码块,静态代码块区别及代码示例
执行顺序:(优先级从高到低) 静态变量>静态代码块>普通变量>mian方法>构造代码块>构造方法
静态方法是等到调用到才有执行
其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行
1) 变量定义的先后顺序决定了初始化的顺序,变量会在任何方法(包括构造器)被调用之前得到初始化.这里的变量也指对象 比如说 Person p = new Person()这种
2)静态数据的初始化
当类中有静态对象与普通对象时,是静态对象先初始化才轮到普通对象.
静态代码块与main方法的执行顺序是静态代码块先执行.然后再执行main方法,而静态代码块与静态代码块的执行顺序呢,是按照在类中的位置来执行的.而静态方法跟静态代码块不一样.静态方法是要等调用才会执行.而静态代码块则是在类初始化的时候就执行了.
下面这个例子.第一个作用是可以看到两种对象的初始化顺序 第二个作用是解释什么是static,我们可以看到在StaticDataTest类中,由于在main方法外已经初始化了一个 static Cupboard cupboard = new Cupboard();这样的类,这样子的话,Cupboard类中的bow4跟bow5这两个静态对象就已经初始化了,在输出记录中可以看到.然后当我们在main方法中再初始化一次Cupboard类时,我们可以看到在输出记录中已经不会再初始bow4跟bow5了.即静态数据只有在第一次访问的时候才会被初始化,后面访问都不会再被初始化了
Bow1(int n){
System.out.println("Bow("+n+")");
}
void f1(int n){
System.out.println("f1("+n+")");
}
}
class Table{
static Bow1 bow1 = new Bow1(1);
Table(){
System.out.println("Table()");
bow2.f1(1);
}
void f2(int n){
System.out.println("f2("+n+")");
}
static Bow1 bow2 = new Bow1(2);
}
class Cupboard{
Bow1 bow3 = new Bow1(3);
static Bow1 bow4= new Bow1(4);
Cupboard(){
System.out.println("Cupboard()");
bow4.f1(2);
}
void f3(int n){
System.out.println("f3("+n+")");
}
static Bow1 bow5 = new Bow1(5);
}
public class StaticDataTest {
public static void main(String[] args){
System.out.println("creating new Cupboard() in main");
new Cupboard();
System.out.println("");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}
/* 输出结果
Bow(1)
Bow(2)
Table()
f1(1)
Bow(4)
Bow(5)
Bow(3)
Cupboard()
f1(2)
creating new Cupboard() in main
Bow(3)
Cupboard()
f1(2)
Bow(3)
Cupboard()
f1(2)
f2(1)
f3(1)
*/