美文网首页
JAVA & .NET创建对象构造函数调用顺序

JAVA & .NET创建对象构造函数调用顺序

作者: 雪飞鸿 | 来源:发表于2019-02-24 11:45 被阅读29次

JAVA & .NET创建对象构造函数调用顺序

JAVA

定义Person类

package models;

public class Person {
    public Person() {
        System.out.println("person constructor");
    }

    {
        System.out.println("person init block");
    }

    static {
        System.out.println("person static block");
    }
}

定义Chinese类

package models;

public class Chinese extends Person {
    public Chinese() {
//        super();
        System.out.println("chinese constructor");
    }

    {
        System.out.println("chinese init block");
    }

    {
        System.out.println("chinese init block2");
    }

    static {
        System.out.println("chinese static block");
    }

    static {
        System.out.println("chinese static block 2");
    }
}

创建Chinese类实例

public class Program {
    public static void main(String[] args) {
        new Chinese();
    }
}

输出结果如下:

person static block
chinese static block
chinese static block 2
person init block
person constructor
chinese init block
chinese init block2
chinese constructor

执行顺序为:

基类静态初始化块——当前类静态初始化块——基类初始化块——基类构造函数——当前类初始化块——当前类构造函数

JAVA中加载类时会调用类的静态代码块

try {
    Class.forName("models.Chinese");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

执行结果如下:

person static block
chinese static block
chinese static block 2
class models.Chinese

.NET

与JAVA相比,.NET中没有初始化块及静态初始化块

定义类型如下:

class Person
{
    public Person()
    {
        Console.WriteLine("person constructor");
    }

    static Person()
    {
        Console.WriteLine("person static constructor");
    }
}

class Chinese : Person
{
    public Chinese()
    {
        Console.WriteLine("chinese constructor");
    }

    static Chinese()
    {
        Console.WriteLine("chinese static constructor");
    }
}

创建对象:

class Program
{
    static void Main(string[] args)
    {
        new Chinese();
    }
}

输出结果如下:

chinese static constructor
person static constructor
person constructor
chinese constructor

执行顺序为:

当前类静态构造函数——基类静态构造函数——基类构造函数——当前类构造函数

小结

JAVA与.NET创建对象时都是先执行静态代码块后执行非静态代码块;

JAVA先执行基类中的静态及非静态代码块;

.NET先执行基类中的静态代码块,先执行当前类中的实例构造函数;

相关文章

  • JAVA & .NET创建对象构造函数调用顺序

    JAVA & .NET创建对象构造函数调用顺序 JAVA 定义Person类 定义Chinese类 创建Chine...

  • C++中对象构造顺序

    单个对象的构造与析构 单个对象创建时构造函数的调用顺序1、调用父类的构造过程2、调用成员变量的构造函数(调用顺序与...

  • 构造函数

    1、构造函数:新对象被创建时,构造函数会被调用。程序未提供构造函数的情况下,Java编译器会为这个类创建一个默认构...

  • c++面向对象-构造、析构、初始化列表

    构造函数 构造函数是指创建对象的时候,会调用的函数。C++构造函数可以重载,指针或者对象均可调用构造函数。 析构函...

  • 函数调用方式&图书管理操作&严格模式&作用域&变量提升

    函数调用方式 普通构造函数调用:内部的this指向全局对象window; 构造函数调用:内部的this指向新创建的...

  • 2019-03-25函数的不同的调用方式

    普通函数 构造函数---通过new 来调用,创建对象 对象的方法 数组里面的函数调用:

  • 自由存储方式创建对象

    用new创建单个对象时,会根据参数调用相应的构造函数。用new创建对象数组时,会调用默认构造函数。用delete删...

  • JavaScript 面向对象编程

    构造函数 JavaScript中的构造函数是创建对象时调用的函数,写法如下: 定义Person构造函数(默认构造函...

  • Spring-ioc-配置

    创建对象的方式 本质就是调用对象的构造函数,不指定为调用无参构造函数 通过参数下标构造 通过参数名称构造 通过参数...

  • 构造函数和原型对象

    一、构造函数 构造函数:定义一类相同结构的对象 构造函数就是用 new 创建对象是调用的函数。构造函数的区别就是函...

网友评论

      本文标题:JAVA & .NET创建对象构造函数调用顺序

      本文链接:https://www.haomeiwen.com/subject/zmvvyqtx.html