构造函数顺序

java类加载后执行顺序:

静态代码块 > 构造函数代码块 > 构造函数

而静态代码块只执行一次,构造函数代码块和构造函数会随对象new的次数变化

例子:

package com.test;

public class Student {
    private String name;
    private int age;

    // 静态代码块
    static {
        System.out.println("静态代码块...");
    }

    // 构造函数代码块
    {
        System.out.println("构造函数代码块...");
    }

    // 默认构造函数
    Student() {
        System.out.println("默认构造函数...");
    }

    // 构造函数
    Student(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("构造函数...");
    }

    public static void main(String[] args) {
        new Student("zhangsan", 20);
        new Student("zhangsan", 20);
    }
}
打印结果:

静态代码块...
构造函数代码块...
构造函数...
构造函数代码块...
构造函数...

每 new 一次对象,都会执行构造代码块和对应的构造函数,静态代码块只是执行一次.

时间: 2024-08-30 00:40:15

构造函数顺序的相关文章

虚拟继承中子类和父类的构造函数顺序1

这里的inter1,2,3.要写base2的构造函数 final也写,否则里面的数据未初始化 inert2写的原因是假如有人使用直接使用inert2,里面数据就可以初始化了 总结一下,虚拟继承的基类就像一个指针一样差不多,但又有分别,因为弄了 private会使用不了数据. 以后每个要实现的类都要调用虚拟基类的构造函数,如上面的inter2. 写上我个人测试代码 class A{ protected://不能写private int a; public: A(int x) :a(x){} };

c++组合类构造函数顺序

#include <iostream> #include <cmath> using namespace std; class Point{ private: int x, y; public: Point(int a = 0, int b = 0) { x = a; y = b; cout << "Point construction: " << x << ", "<< y <<

派生类的构造函数与析构函数的调用顺序

派生类构造函数各部分的执行次序为1.调用基类的构造函数,按他们在派生类定义的先后顺序,顺序调用.2.调用成员对象的构造函数,按他们在类定义中声明的先后顺序,顺序调用3.派生类的构造函数体中的操作 在派生类构造函数中,只要基类不是使用缺省构造函数,都要显式给出基类名和参数表如果基类没有定义构造函数,则派生类也可以不定义,全部采用系统给定的缺省构造函数.如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数. //Test1.h #include<iostream> using names

C++:派生类的构造函数和析构函数

4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类的派生类的析构函数,随后再执行基类的析构函数. //例4.5 派生类的构造函数和析构函的执行顺序 #include<iostream> using namespace std; class Base{ //声明基类Base public: Base() { cout<<"Co

C++学习之顺序容器(一)

一个容器就是一些特定类型对象的集合.顺序容器(sequential container)为我们提供了控制元素存储和访问顺序的能力.这种顺序不依赖于元素的值,而是与元素加入容器时的位置向对应. 顺序容器类型概述 容器名称 容器特性 访问特性 修改特性 vector 可变大小数组 随机 尾部插入/删除速度快 deque 双端队列 随机 头尾位置插入/删除速度快 list 双向链表 双向顺序 任意位置插入/删除均很快 forward_list 单项链表 单向顺序 任意位置插入/删除均很快 array

C++——类继承以及类初始化顺序

对于类以及类继承, 几个主要的问题:1) 继承方式: public/protected/private继承. 这是c++搞的, 实际上继承方式是一种允许子类控制的思想. 子类通过public继承, 可以把基类真实还原, 而private继承则完全把基类屏蔽掉. 这种屏蔽是相对于对象层而言的, 就是说子类的对象完全看不到基类的方法, 如果继承方式是private的话, 即使方法在基类中为public的方法. 但继承方式并不影响垂直方向的访问特性, 那就是子类的函数对基类的成员访问是不受继承方式的影

《C和C++程序员面试秘笈[精品]》-笔记

2015-12-16 原文:在C++中可以通过域操作符"::"来直接操作全局变量 2015-12-16 原文:后缀式(i++)必须返回对象的值,所以导致在大对象的时候产生了较大的复制开销,引起效率降低.因此处理使用者自定义类型(注意不是指内建类型)的时候,应该尽可能地使用前缀式递增/递减,因为它天生"体质"较佳. 2015-12-16 原文:内建数据类型的情况,效率没有区别. 自定义数据类型的情况,++i效率较高. 2015-12-16 原文:当表达式中存在有符号类

virtual table

在虚表中,派生类虚函数指针会替代基类的对应的虚函数指针的位置 //析构函数:派生类析构函数首先调用派生类析构,然后调用父类析构函数:与构造函数顺序相反 多态还有个关键之处就是一切用指向基类的指针或引用来操作对象,所以要实现子类接口的重写,必须使用抽象类. 1)虚函数按照其声明顺序放于表中. 2)父类的虚函数在子类的虚函数前面. 虚表http://blog.csdn.net/haoel/article/details/3081328

C++要点总结

1.内联成员函数 1)隐式声明:将成员函数直接定义在类的内部 2)显式声明:inline标示 2)在类中,使用inline定义内联函数时,必须将类的声明和内联成员函数的定义都放在同一个文件中,否则编译时无法进行代码置换. 2.同类对象赋值 1)对象赋值语句进行对象赋值时,两个对象的类型必须相同 2)数据成员占存储空间,成员函数占相同的函数代码段 3)类中存在指针时,使用默认赋值运算函数赋值,可能错误 3.构造函数 1)跟普通成员函数一样,当构造函数直接定义在类中时,作为内联函数处理 2)一般声明