1 package com.hangao.teststatic; 2 3 /** 4 * @author hangao hangao1204@hotmail.com 5 * 6 * 1.声明父类引用,指向父类对象,代码执行顺序是 7 * 依次执行父类的静态代码块,再依次执行父类非静态代码块,最后执行父类构造方法 8 * 9 * 2.声明父类引用,指向子类对象,代码执行顺序是 10 * 依次执行父类的静态代码块,依次执行子类的静态代码块 11 * 再依次执行父类非静态代码块,执行父类构造方法 12 * 再依次执行子类非静态代码块,最后执行子类构造方法 13 * 14 * 3.声明子类引用,指向子类对象,代码执行顺序是<!-- 同上 --> 15 * 依次执行父类的静态代码块,依次执行子类的静态代码块 16 * 再依次执行父类非静态代码块,执行父类构造方法 17 * 再依次执行子类非静态代码块,最后执行子类构造方法 18 * 19 * 4.总结:静态代码块在类被jvm加载的时候执行,且只执行一次 20 * 非静态代码块在类构造方法被调用的时候执行,可能会执行多次 21 */ 22 public class TestStatic { 23 public static void main(String[] args) { 24 testStatic1(); 25 testStatic2(); 26 testStatic3(); 27 testStatic4(); 28 } 29 30 /** 31 * 运行结果: 32 * Animal-static1 33 * Animal-static2 34 * Animal-no-static1 35 * Animal-no-static2 36 * Animal.Animal() 37 * Animal.eat() 38 */ 39 private static void testStatic1() { 40 Animal animal = new Animal(); 41 animal.eat(); 42 } 43 44 /** 45 * 运行结果: 46 * Animal-static1 47 * Animal-static2 48 * Dog-static1 49 * Dog-static2 50 * Animal-no-static1 51 * Animal-no-static2 52 * Animal.Animal() 53 * Dog-no-static1 54 * Dog-no-static2 55 * Dog.Animal() 56 * Dog.eat() 57 */ 58 private static void testStatic2() { 59 Animal animalDog = new Dog(); 60 animalDog.eat(); 61 } 62 63 /** 64 * 运行结果: 65 * Animal-static1 66 * Animal-static2 67 * Dog-static1 68 * Dog-static2 69 * Animal-no-static1 70 * Animal-no-static2 71 * Animal.Animal() 72 * Dog-no-static1 73 * Dog-no-static2 74 * Dog.Animal() 75 * Dog.eat() 76 */ 77 private static void testStatic3() { 78 Dog dog = new Dog(); 79 dog.eat(); 80 } 81 82 /** 83 * 运行结果: 84 * Animal-static1 85 * Animal-static2 86 * Animal-no-static1 87 * Animal-no-static2 88 * Animal.Animal() 89 * Animal-no-static1 90 * Animal-no-static2 91 * Animal.Animal() 92 * Animal.eat() 93 */ 94 private static void testStatic4() { 95 Animal animal = new Animal(); 96 animal = new Animal(); 97 animal.eat(); 98 } 99 }
1 package com.hangao.teststatic; 2 3 public class Animal { 4 static{ 5 System.out.println("Animal-static1"); 6 } 7 { 8 System.out.println("Animal-no-static1"); 9 } 10 public Animal() { 11 System.out.println("Animal.Animal()"); 12 } 13 { 14 System.out.println("Animal-no-static2"); 15 } 16 static{ 17 System.out.println("Animal-static2"); 18 } 19 public void eat(){ 20 System.out.println("Animal.eat()"); 21 } 22 }
1 package com.hangao.teststatic; 2 3 public class Dog extends Animal { 4 static{ 5 System.out.println("Dog-static1"); 6 } 7 { 8 System.out.println("Dog-no-static1"); 9 } 10 public Dog() { 11 System.out.println("Dog.Animal()"); 12 } 13 { 14 System.out.println("Dog-no-static2"); 15 } 16 static{ 17 System.out.println("Dog-static2"); 18 } 19 @Override 20 public void eat() { 21 System.out.println("Dog.eat()"); 22 } 23 }