内部可以有输出语句 随着类的加载而执行,而且只执行一次 作用:初始化当前类的属性 如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行 静态代码块的执行优先于非静态代码块的执行 只能调用静态的属性和静态的方法,不能调用非静态的结构
非静态代码块内部可以有输出语句 随着对象的创建而执行 每创建一个对象就执行一次非静态代码块 作用:在创建对象时,对对象的属性等进行初始化 如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行 可以调用静态与非静态的属性与方法
对属性可以复制的位置①默认初始化 ②显示初始化、⑤代码块中赋值 ③在构造器中赋值 ④有了对象以后,可以通过"对象.属性"或者"对象.方法"进行赋值 顺序 ①-②/⑤-③-④
public class BlockTest{ public static void main(String[] args){ String desc =Person.desc; System.out.println(desc); Person p1=new Person(); System.out.println(p1.age); Person.info; } } class Person{ String name; int age; static String desc="我是一个人"; public Person(){ } public Person(String name,int age){ this.name=name; this.age=age; } //static的代码块 static{ System.out.println("hello,static block-1"); desc="我是一个爱学习的人"; // 调用静态方法 info(); // 调用非静态方法,错误 // eat(); } static{ System.out.println("hello,static block-2"); desc="我是一个爱学习的人"; } //非static的代码块 { System.out.println("hello, block-1"); age=1; // 调用静态方法 info(); // 调用非静态方法 eat(); } { System.out.println("hello, block-2"); } //方法 public void eat(){ System.out.println("吃饭"); } public String toString(){ return "Person[name="+name+",age="+age+"]"; } public static void info(){ System.out.println("我是一个快乐的人"); } }