(资料图片)
本文主要讲述java中代码块的细节
2)3)示例代码如下:
public class CodeBlockDetail { public static void main(String[] args) { // 类别加载的情况举例 // 1.是对象创建时// new AA(); // 2.创建子类对象,父类先加载// new BB(); // 3.使用类的静态属性/方法// System.out.println(Cat.age); // 静态代码块在类加载时执行,并且只执行一次 // 非静态代码块,随着对象的创建,被调用.// CC c1 = new CC();// CC c2 = new CC(); // 当调用静态变量/方法时,非静态代码块不会被调用,只会调用静态代码块// System.out.println(CC.age); CC.getAge(); }}class CC { public static int age = 10;// private String name = "Tom"; public static void getAge(){ System.out.println(age); } static { System.out.println("CC的static代码块2在执行..."); } { System.out.println("CC的非静态代码块别执行..."); }}class Animal { static { System.out.println("Animal的static代码块4在执行..."); }}class Cat extends Animal{ public static int age = 20; static { System.out.println("Cat的static代码块3在执行..."); }}class BB extends AA { static { System.out.println("BB的static代码块2在执行..."); }}class AA { // 静态代码块,随着类的加载而执行 static { System.out.println("AA的static代码块1在执行..."); }}
4)示例代码如下:
public class CodeBlockDetail01 { public static void main(String[] args) { A a = new A(100); }}class A { /* 静态代码块和静态方法,先于普通代码块和普通方法执行。 构造器最后被调用.... */ { System.out.println("非static代码块..."); } public int id = getId(); // 非静态代码块 // 静态代码块 static { System.out.println("static静态代码块..."); } // 静态变量只能由静态方法赋初始值... public static int age = getAge(); public static int getAge(){ System.out.println("getAge()..."); return 100; } public int getId(){ System.out.println("getId()"); return 50; } public A(int id) { System.out.println("public A(int id)调用..."); this.id = id; }}
运行结果:
示例代码如下:
public class CodeBlockDetail02 { public static void main(String[] args) { BBB bbb = new BBB(); }}/** 静态方法/变量/代码块,随着类信息的加载而加载。 * (1) AAA的static代码块 * (2) BBB的static代码块 * (3) AAA的普通代码块.... * (4) public AAA()构造器.... * (5) BBB的非静态代码块.... * (6) public BBB()构造器.... */class AAA { static { System.out.println("AAA的static代码块"); } { System.out.println("AAA的普通代码块...."); } public AAA(){ // (1)super()调用父类的无参构造器 // (2)本类的普通代码块 System.out.println("public AAA()构造器...."); }}class BBB extends AAA{ static { System.out.println("BBB的static代码块"); } { System.out.println("BBB的非静态代码块...."); } public BBB() { // (1) super(),调用父类的无参构造器. // (2) 本类的普通代码块 System.out.println("public BBB()构造器...."); }}
运行结果:
示例代码如下:
public class CodeBlockDetail03 { public static void main(String[] args) { Cc cc = new Cc(); }}/** * (1) Aa的静态代码块 * (2) Bb的静态代码块 * (3) Cc的静态代码块 * (4) Aa的非静态代码块 * (5) public Aa()构造器 * (6) Bb的非静态代码块 * (7) public Bb()构造器 * (8) Cc的非静态代码块 * (9) public Cc()构造器 */class Aa { { System.out.println("Aa的非静态代码块"); } static { System.out.println("Aa的静态代码块"); } public Aa() { // (1) super()父类的构造器 // (2) 本类的普通代码块 System.out.println("public Aa()构造器"); }}class Bb extends Aa{ { System.out.println("Bb的非静态代码块"); } static { System.out.println("Bb的静态代码块"); } public Bb() { // (1) super()父类的构造器 // (2) 本类的普通代码块 System.out.println("public Bb()构造器"); }}class Cc extends Bb{ { System.out.println("Cc的非静态代码块"); } static { System.out.println("Cc的静态代码块"); } public Cc() { // (1) super()父类的构造器 // (2) 本类的普通代码块 System.out.println("public Cc()构造器"); }}
运行结果: