Java 基础(代码块)
类的成员之四: 代码块(或初始化块)
1.代码块的作用:用来初始化类、对象
2.代面树如果有修饰的话,只能使用 static.
3.分类:静态代码块 VS 非静态代码块
4.静态代码块
内部可以有输出语句
随着类的加载而执行,而且只执行一次
作用: 初始化类的信息
如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
静态代码块的执行要优先于非静态代码块的执行
静态代码块内只能调用静态的属性、静态的方法,不能调用非静态的结构
5.非静态代码块
内部可以有输出语句
随着对象的创建而执行
每创建一个对象,就执行一次非静态代码块
作用:可以在创建对象时,对对象的属性等进行初始化
如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行
非静态代码块内可以调用静态的属性、静态的方法、或非静态的属性、非静态的方法
对属性可以赋值的位置:
① 默认初始化
② 显式初始化/⑤ 在代码块中赋值
③ 构造器中初始化
④ 有了对象以后,可以通过 "对象.属性" 或 "对象.方法"的方式,进行赋值
执行的先后顺序:① - ②/⑤ - ③ - ④
实例化子类对象时,涉及到父类、子类中静态代码块、非静态代码块、构造器的加载顺序:
由父及子,静态先行。
BlockTest.java
package com.klvchen.java3; public class BlockTest { public static void main(String[] args) { String desc = Person.desc; Person p1 = new Person(); Person p2 = 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 的代码块 { System.out.println("hello, block - 1"); age = 1; eat(); desc = "我是一个爱学习的人"; info(); } { System.out.println("hello, block - 2"); } //static 的代码块 static { System.out.println("hello, static block-2"); } static { System.out.println("hello, static block-1"); desc = "我是一个爱学习的人"; info(); // eat(); // name = "Tom"; } public void eat() { System.out.println("吃饭"); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } public static void info() { System.out.println("我是一个快乐的人!"); } }

StaticBlockTest.java
package com.klvchen.java3; public class StaticBlockTest { public static void main(String[] args) { System.out.println("total = " + MyPerson.total); System.out.println("total = " + MyPerson.total); } } class MyPerson{ public static int total; static { total = 100; System.out.println("in static block!"); } }

LeafTest.java
package com.klvchen.java3; class Root{ static { System.out.println("Root的静态初始化块"); } { System.out.println("Root的普通初始化块"); } public Root() { System.out.println("Root的无参数的构造器"); } } class Mid extends Root{ static { System.out.println("Mid的静态初始化块"); } { System.out.println("Mid的普通初始化块"); } public Mid() { System.out.println("Mid的无参数的构造器"); } public Mid(String msg) { //通过this调用同一类中重载的构造器 this(); System.out.println("Mid的带参数构造器,其参数值: " + msg); } } class Leaf extends Mid{ static { System.out.println("Leaf的静态初始化块"); } { System.out.println("Leaf的普通初始化块"); } public Leaf() { //通过 super 调用父类中有一个字符串参数的构造器 super("klvchen"); System.out.println("Leaf的构造器"); } } public class LeafTest { public static void main(String[] args) { new Leaf(); System.out.println(); new Leaf(); } }

Son.java
package com.klvchen.java3; class Father{ static { System.out.println("11111111111111111111"); } { System.out.println("22222222222222222222"); } public Father() { System.out.println("33333333333333333333"); } } public class Son extends Father { static { System.out.println("44444444444444444444"); } { System.out.println("55555555555555555555"); } public Son() { System.out.println("66666666666666666666"); } public static void main(String[] args) { System.out.println("77777777777777777777"); System.out.println("**********************"); new Son(); System.out.println("**********************"); new Father(); } }

OrderTest.java
package com.klvchen.java3; public class OrderTest { public static void main(String[] args) { Order order = new Order(); System.out.println(order.orderId); } } class Order{ { orderId = 4; } int orderId = 3; }


浙公网安备 33010602011771号