刚才学习了一下代码块的使用,代码块我的理解是在加载类和对象时执行的一些语句。对于加载类的时候,就执行静态的代码块,创建新的对象时就执行非静态代码块,这里有一个问题,在代码执行时,牵扯到的每一个类要先加载,然后再是每一个类中的构造器的使用等等。
下面是笔记。
package oop.block; /* * 类的成员之四:代码块(初始化块) * 1.代码块作用:用来初始化类或对象 * 2.代码块如果有修饰只能是static * 3.分类 静态代码块 非静态代码块 * * 静态的属性和方法会随着类的加载而加载 * 非静态的属性和方法随着对象的创建而加载 * 先加载类,然后再可以创建对象 * 4.静态代码块 * ①内部可以有输出语句 * ②随着类的加载而执行,只执行一次 * ③初始化类的信息(可以初始化静态变量) * ④定义多个静态代码块时,按照定义的先后顺序执行 * ⑤静态代码块的执行顺序优先于非静态代码块 * ⑥静态代码块中只能调用静态的属性和方法,不能调用非静态结构 * 5.非静态代码块 * ①内部可以有输出语句 * ②随着对象的创建而执行 * ③每创建一个对象,就执行一次非静态代码块 * ④作用:可以在创建对象时,对对象的属性进行初始化(可以初始化非静态变量) * ⑤定义多个非静态代码块时,按照定义的先后顺序执行 * ⑥非静态代码块既可以调用静态属性和方法也可以调用非静态属性和方法 * 属性可以赋值的位置: * 1.默认初始化 * 2.显示初始化/5.在代码块中赋值 * 3.构造器中初始化 * 4.对象.属性或对象.方法 赋值 * * 2和5的执行先后顺序相同,取决于先写谁后写谁 * * 初始化顺序:①先执行每一个类的静态代码块,将类加载。-> * ②再执行每一个类中的非静态代码块->③再执行对应类的构造器 * 其中①步骤是所有类加载完了以后再进入②步骤,②③步骤是以一个类为一个周期执行。 * * 由父及子,静态先行 */ public 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"); } //非static代码块 { System.out.println("hello block"); } //方法 public void eat() { System.out.println("人吃饭"); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } public static void info() { System.out.println("我是一个快乐的人"); } }
package oop.block; public class BlockTest { public static void main(String[] args) { String desc = Person.desc; } }