根据以下程序进行分析
定义一个父类
- package sas.LearnJava;
- public class ExcuteOrderTest {
- {
- System.out.println("我是在父类开始的普通代码块!");
- }
- public ExcuteOrderTest() {
- System.out.println("我是父类的无参构造函数!");
- }
- public void showSomething() {
- System.out.println("我是父类中定义的方法!");
- }
- static {
- System.out.println("我是在父类中静态的代码块!");
- }
- }
定义一个子类
- package sas.LearnJava;
- public class SubExcuteOrderTest extends ExcuteOrderTest {
- static {
- System.out.println("我是在子类中的静态代码块!");
- }
- public SubExcuteOrderTest() {
- System.out.println("我是子类的无参构造函数!");
- }
- @Override
- public void showSomething() {
- System.out.println("我是子类中定义的方法!");
- }
- public static void test() {
- System.out.println("子类中的静态测试方法");
- }
- {
- System.out.println("我是在子类结束的普通代码块!");
- }
- }
再写一个 demo 使用上述子类
- package sas.LearnJava;
- public class ExcuteOrderDemo {
- public static void main(String[] args) {
- System.out.println("创建第一个对象");
- SubExcuteOrderTest subExcuteOrderTest1 = new SubExcuteOrderTest();
- System.out.println("创建第二个对象");
- SubExcuteOrderTest subExcuteOrderTest2 = new SubExcuteOrderTest();
- }
- }
创建第一个对象
我是在父类中静态的代码块!
我是在子类中的静态代码块!
我是在父类开始的普通代码块!
我是父类的无参构造函数!
我是在子类结束的普通代码块!
我是子类的无参构造函数!
创建第二个对象
我是在父类开始的普通代码块!
我是父类的无参构造函数!
我是在子类结束的普通代码块!
我是子类的无参构造函数!
从运行结果中可以几点:
在创建类的对象时会执行其父类中的代码块及默认的无参构造函数, 然后再执行自己的代码块和构造函数
静态代码块, 非静态代码块以及构造函数的执行顺序时确定的, 与在程序中的位置无关
子类的静态代码块会在父类的静态代码块执行后执行
静态代码块只执行一次, 普通代码块随着对象的创建而重新进行初始化
- package sas.LearnJava;
- public class ExcuteOrderDemo {
- public static void main(String[] args) {
- SubExcuteOrderTest.test();
- }
- }
我是在父类中静态的代码块!
我是在子类中的静态代码块!
子类中的静态测试方法
当不创建对象直接调用类的静态方法时, 只会执行父类和子类中的静态代码块
来源: https://www.cnblogs.com/sasworld/p/11515616.html