• 当new()发生时,代码初始化顺序


    首先给出要验证的结论:

    一、当有static修饰的静态代码时

    父类静态代码块(同类内static修饰的属性按顺序执行)>子类静态代码块(同类内static修饰的成员按顺序执行)>父类属性、代码块(按声明顺序执行) >父类构造器>  子类属性、代码块(按声明顺序执行)>子类构造器

    二、当没有static修饰的静态代码时

    父类属性、代码块(按声明顺序执行) >父类构造器>  子类属性、代码块(按声明顺序执行)>子类构造器

    验证一、

    class Family {
        Family (Class className) {
            System.out.println("创建Family对象");
            System.out.println(className.getName());
        }
    }
    class Person {
        Person() {
            System.out.println("创建Person对象");
        }
        public static Family family = new Family(Person.class);
        static {
            System.out.println("执行Person静态代码块");
        }
        {
            System.out.println("执行Person代码块");
        }
    }
    public class Student extends Person {
    public Student() {
            System.out.println("创建student对象");
        }
        {
            System.out.println("执行Student代码块");
        }
        static {
            System.out.println("执行Student静态代码块");
        }
        public static Family staticFamily = new Family(Student.class);
        @Test
        public void test() {
            System.out.println("=============");
        }
        public Family family = new Family(Student.class);
    }
    执行结果:
    创建Family对象
    com.tca.thinkInJava.chap7.Person
    执行Person静态代码块
    执行Student静态代码块
    创建Family对象
    com.tca.thinkInJava.chap7.Student
    执行Person代码块
    创建Person对象
    执行Student代码块
    创建Family对象
    com.tca.thinkInJava.chap7.Student
    创建student对象

    验证二、

    //建筑
    class Building {
        public Building() {
            System.out.println("Building");
        }
    }
    //房子
    class House extends Building{
        public LivingRoom livingRoom = new LivingRoom();//卧室
        public House() {
            System.out.println("House");
        }
    }
    //别墅
    class Villa extends House{
        public Villa () {
            System.out.println("Villa");
        }
    }
    //卧室
    class LivingRoom {
        public Bed bedFirst = new Bed();//
        public Desk deskFirst = new Desk();//桌子
    
        public LivingRoom () {
            System.out.println("LivingRoom");
        }
    }
    //
    class Bed {
        public Bed () {
            System.out.println("Bed");
        }
    }
    //桌子
    class Desk {
        public Desk () {
            System.out.println("Desk");
        }
    }
    此时,我们new Villa():
    public class InitializeDemo {
        @Test
        public void testInitialize() {
            Villa villa = new Villa();
        }
    }
    执行结果为:
    Building
    Bed
    Desk
    LivingRoom
    House
    Villa
  • 相关阅读:
    ZT:POI操作PPT
    ADO.NET 2.0 Dataset和Datatable 新功能新特性
    ADO.NET 2.0 大批量数据操作和多个动态的结果集
    浏览.NET Framework 2.0 类型库中新增的常用功能
    ASP.NET程序中常用代码汇总(四)
    保存div与页面滚动条的位置
    在ASP.NET中实现AJAX
    ASP.NET 2.0中隐藏listbox的某一项
    泛型最佳实践C#
    ASP.NET 2.0 验证控件新的功能
  • 原文地址:https://www.cnblogs.com/mwq1992/p/14262396.html
Copyright © 2020-2023  润新知