首页
学习
活动
专区
圈层
工具
发布

Java中类的初始化过程:(静态成员变量,静态代码块,普通成员变量,代码块初始化顺序)

初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化; 3.其次,...初始化父类的普通成员变量和代码块,在执行父类的构造方法; 4.最后,初始化子类的普通成员变量和代码块,在执行子类的构造方法; 类的加载顺序: 父类静态成员变量、静态块>子类静态成员变量、 静态块>...父类普通成员变量、非静态块>父类构造函数>子类 普通成员变量、非静态块>子类构造函数 静态代码块:随着类的加载而执行,而且只执行一次 非静态代码块:每创建一个对象,就执行一次非静态代码块 关于各个成员简介

1.1K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++】构造函数初始化列表 ③ ( 构造函数 的 初始化列表 中 为 const 成员变量初始化 )

    构造函数初始化列表 总结 : 初始化列表 可以 为 类的 成员变量 提供初始值 ; 初始化列表 可以 调用 类的 成员变量 类型的 构造函数 进行成员变量初始化操作 ; 初始化列表 可以 使用 构造函数...中传入的 参数 ; 类初始化时 , 根据定义顺序 , 先调用 成员变量的 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 的 const 成员变量 必须只能在 初始化列表 中进行...初始化 , 所有的构造函数都要进行初始化操作 ; 一、构造函数 的 初始化列表 中 为 const 成员变量初始化 1、初始化 const 常量成员 如果 类 中定义了 被 const 修饰 的 成员变量...进行赋值 的 , 因此 这里 必须在 构造函数的 初始化列表中 对 const 成员变量 进行赋值 ; 2、错误代码示例 - 没有初始化常量成员 在下面的 类 B 中 , 定义了常量 const int..., 对 常量成员 进行初始化操作 ; 3、正确代码示例 - 在初始化列表中初始化常量成员 在下面的 类 B 中 , 所有的 构造函数 中 , 都要使用 初始化列表 初始化 常量成员 , 只要遗漏一个构造函数

    1.1K30

    【Kotlin】类的初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )

    文章目录 一、主构造函数定义临时变量 二、主构造函数中定义成员属性 三、次构造函数 四、构造函数默认参数 一、主构造函数定义临时变量 ---- 在 Kotlin 类中 , 可以在 类声明 时 在 类名后...定义 " 主构造函数 " ; 在 主构造函数 中 , 可以 定义 成员属性 , 并为 成员属性 提供 初始值 ; 在 主构造函数 中 , 可以定义 临时变量 , 临时变量 一般使用 以下划线为开头 的名称...---- 在主构造函数中 定义临时变量 , 格式为 : class 类名(_临时变量名: 临时变量类型){} 在主构造函数中也可以 定义成员属性 , 格式为 : class 类名(var 成员属性名:...---- Kotlin 类只允许 在定义类时 定义 一个主构造函数 , 在其中可以定义 临时变量 , 也可以定义 属性变量 ; 次构造函数 定义在 Kotlin 内部 , 可以定义 多个 次构造函数..., 每个次构造函数都可以有不同的参数组合 ; 定义次构造函数后 , 必须调用主构造函数 , 并且为每个主构造函数 的 参数设置 参数值 ; 次构造函数中可以实现代码逻辑 , 作为主构造函数的补充 ; 代码示例

    6.7K20

    【C++】构造函数初始化列表 ① ( 类对象作为成员变量时的构造函数问题 | 构造函数初始化列表语法规则 )

    一、类对象作为成员变量时的构造函数问题 1、问题描述 如果 一个类 A 的对象 作为 另外一个类 B 的成员变量时 , 在以下场景会报错 : 为类 A 定义 有参的 构造函数 , 那么 A 的无参默认构造函数就失效了...; 此时使用 默认无参构造函数 初始化 B , 就会报错 ; 在一个类中 , 其成员变量是 带有参构造函数 的类型 , 这种情况下没有调用 有参构造函数的机会 , 此时就会出现 编译报错情况 ; 在下面的代码中...是一种用于初始化类的成员变量的方法 ; 构造函数初始化列表 可实现功能 : 为成员变量提供初始值 调用其他 成员变量的 构造函数 来初始化成员变量 构造函数初始化列表语法规则 : 构造函数() : 成员变量名称...(成员变量值) , 成员变量名称(成员变量值) { // 构造函数内容 } 构造函数初始化列表 位置在 构造函数 的 参数列表之后 , 冒号 : 与花括号 {} 之间 ; 使用 逗号 , 分隔 ;...初始化列表中的元素由 成员变量的名称 和 初始值组成 , 使用等号 = 连接 ; 在下面的代码中 , 为 B 类定义了默认的构造函数 , 其中定义了 构造函数 初始化列表 ; 在 初始化列表中 , m_age

    1.5K30

    【C++】深入探索类和对象:初始化列表及其static成员与友元

    一、构造函数体赋值 构造函数作用:在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。...int _n; }; 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。...有些成员变量必须通过初始化列表完成初始化,不能进入函数体再赋值,比如:引用、const修饰成员 初始化列表的特性: 第一点:每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 第二点:类中包括以下成员...用static修饰的成员变量称为静态成员变量 用static修饰的成员函数称为静态成员函数,静态成员变量一定要在类外进行初始化 统计调用构造函数次数 关于统计次数这个问题,采用全局变量是一个不太好的方式...非静态成员函数可以调用类的静态成员函数吗? 答: 静态成员函数可以调用非静态成员函数,但是需要通过对象或者指针来调用非静态成员函数。

    23110

    类和对象(3)

    因为初始化只能初始化一次,而构造函数体内可以多次赋值。 初始化列表 以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。...类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时) 3.尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量...4.成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关 下面这段代码: 尽管初始化列表尝试首先初始化_a1然后初始化_a2,但实际的初始化顺序是由成员变量在类定义中的声明顺序决定的...静态成员变量一定要在类外进行初始化 1.静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区 2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明 3....非静态成员函数可以调用类的静态成员函数吗?  可以。静态成员函数属于类本身,而非类的某个特定对象。非静态成员函数则依赖于类的特定实例,所以它们可以在没有任何对象实例的情况下被调用。

    16910

    C++进阶之路:再谈构造函数、static成员、友元(类与对象_下篇)

    ,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化, 构造函数体中的语句只能将其称为赋初值,而不能称作初始化。...因为初始化只能初始化一次,而构造函数体内可以多次赋值 初始化列表 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。...(初始化只能初始化一次) 类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时) class A...成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关 class A { public: A(int a) :_a1(a) ,_a2(_a1) {}...静态成员变量一定要在类外进行初始化 面试题:实现一个类,计算程序中创建出了多少个类对象。

    19810

    【C++】类与对象【下】

    调用构造函数后,每个变量都有一个初始值,但是构造函数中的语句只能将其赋初值,而不能称为初始化,因为初始话只能初始化一次,构造函数体内可以及进行的多次赋值 class Date { public:...,每个成员变量后面跟一个放在括号中的初始值或表达式,初始化完之后,结尾处要有一个“{}”的结束符号 注意事项: 每个成员变量在初始化列表中只能出现一次 即同一成员变量不能同时出现 类中包含以下成员...类的赋值运算符重载函数 四.成员变量再类中声明的次序就是其再初始化列表的初始化顺序,与其再初始化列表的先后顺序无关 #include using namespace std; int...3、内部类就是外部类的友元类,即内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。...2、内部类可以直接访问外部类中的static、枚举成员,不需要外部类的对象/类名。   3、外部类的大小与内部类的大小无关。

    9600

    【C++】类与对象篇四

    ,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。...因为初始化只能初始化一次,而构造函数体内可以多次赋值。 2. 初始化列表 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。...(初始化只能初始化一次) 类中包含以下成员,必须放在初始化列表位置进行初始化:引用成员变量,const成员变量,自定义类型成员(且该类没有默认构造函数时) 尽量使用初始化列表初始化,因为不管你是否使用初始化列表...成员变量在 类中声明次序就是其在初始化列表中的初始化顺序 ,与其在初始化列表中的先后次序无关 class A { public: A(int a) :_a1(a) ,_a2(_a1)//先执行这里...静态成员变量一定要在类外进行初始化 静态成员函数特殊的特殊调用方式:类名 + :: + 函数名,因为它没有this指针,无法通过该类的对象调用。

    11410

    【C++】类与对象(static、explicit、友元、隐式类型转换、内部类、匿名对象)

    注意: 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时)...下面是一道初始化顺序例题: 结论:成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后 次序无关 隐式类型转换 C cc1(1)和C cc2=2都是一样的构造。...静态成员变量一定要在类外进行初始化 计算程序中创建出了多少个类对象 当我们想知道构造函数的调用次数时,可以通过计数来确定。不过需要一个全局变量n,但这样子不安全,别人可能会修改n的值。...但是实际使用中cout需要是第一个形参对象,才能正常使用。所以要将operator函数。但又会导致类外没办法访问成员,此时就需要友元来解决。operator>>同理。...下面是使用友元的方案: 友元函数可访问类的私有和保护成员,但不是类的成员函数 友元函数不能用const修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制 一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同

    18810

    C++心决之类和对象详解(下篇)(封装进阶篇)

    再谈构造函数 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。...,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化, 构造函数体中的语句只能将其称为赋初值 ,而不能称作初始化。...类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时) class A { public: A(int a) :_...成员变量 在类中 声明次序 就是其在初始化列表中的 初始化顺序 ,与其在初始化列表中的先后次序无关 1.3 explicit关键字 构造函数不仅可以构造与初始化对象, 对于接收单个参数的构造函数,...,不受类访问限定符限制 一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同 3.2 友元类 友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

    14510

    【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)

    对于一个普通成员函数,const对象是无法调用的,因为const对象的成员变量不允许被修改;而当成员函数被const修饰时,就确保了函数内部不会修改成员变量的值,const对象就可以调用该函数。...每一个成员变量在初始化列表中只能出现一次。 2. 初始化列表初始化的顺序与成员在类中的声明顺序一致,而与列表中的成员顺序无关。 3....当然,对于普通成员,我们也可以在声明时赋缺省值,但是相比显示写在初始化列表当中,会有一些效率的损耗。 注:对类类型的成员变量通过初始化列表进行初始化时,本质也是在调用它的构造函数。...静态成员变量要在类中进行声明,并且初始化必须要在类外,而不是类中(因为在类中给的初值是给初始化列表的,而静态成员变量不走初始化列表)。...特殊情况:对于有const修饰的整形静态成员变量,可以在类中同时进行声明和初始化。

    26210

    【C++ 初阶路】--- 类和对象(末)

    二、再谈构造函数 2.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。...,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。...(初始化只能初始化一次) 类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时) class A { public:...于是找到了对象实例化必须调用的构造函数,但如果在构造函数体中的话,可能出现多次初始化的情况。 最后规定了初始化列表这一概念!其是每个成员变量定义初始化的位置!...我们前面讲的在声明时给缺省值,其实那个缺省值就是给初始化列表用的! 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。

    16910

    C++类与对象(三)

    类与对象 构造函数的初始化列表 初始化列表 自定义类型与初始化列表 explicit关键字 static成员 静态成员变量 静态成员函数 友元 内部类(类中类) 匿名对象 拷贝对象时的一些编译器优化...C++中成员变量的初始化是在这里。...自定义类型与初始化列表 我们在定义一个变量的时候可以不赋值,但是const和引用时必须赋值的,在类中自定义类型也是必须进行初始化的,如果你没写类的初始化,那么它就会调用它的默认构造函数,如果没有默认构造就报错...static成员 声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。...比如说创建一个对象只为了调用某个类中的函数,创建对象和调用函数是两行,如果用匿名函数就是一行,所以匿名更舒服一些:或者是在调用某个函数,然后需要返回一个类的对象,平时需要创建这个类的对象,这里直接返回匿名对象就可以了

    43000

    C++的魔法世界:类和对象的终章

    一、再探构造函数 类和对象(中)里介绍的构造函数,使用的是赋值实现成员变量的初始化。而构造函数还有另一种初始化方法,就是使用初始化列表。...必须使用初始化列表的类: ​ 没有默认构造的类类型成员变量、被const修饰的成员变量(声明时必须初始化)、被引用的成员变量(声明引用时必须初始化) 自定义类型成员变量,没有默认构造想要调用它的构造需要传参...,只实现了构造函数,在Myqueue中需要对两个栈类的成员变量进行初始化,需要调用它的默认构造而栈类没有实现,从而采用初始化列表。...在初始化列表中可以对这两个成员传参调用它们的构造函数从而实现初始化,而若是在函数体内实现初始化,是无法调用这两个栈类成员变量的构造函数。...三、static成员 用static修饰的成员变量,称为静态成语变量,静态成员变量一定要在类外面进行初始化 静态成员变量为所有类成员共享,不属于某个具体的对象,不存在类中,存在静态区 class pp

    15900

    C++-类和对象(3)

    再谈构造函数 1.1 构造函数体赋值 我们在创建一个对象时,编译器会调用该对象的构造函数对该对象的成员进行初始化。...,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量 的初始化, 构造函数体中的语句只能将其称为赋初值 ,而不能称作初始化。...类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时)  引用必须在定义的时候初始化,所以需要的放到初始化列表...静态成员函数可以调用非静态成员函数吗?不能 2. 非静态成员函数可以调用类的静态成员函数吗?可以 3. 友元 友元提供了一种突破封装的方式,有时提供了便利。...友元函数的调用与普通函数的调用原理相同 3.2 友元类 友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

    18610

    【C++进阶学习】第十四弹——特殊类设计——探寻各种情况下类的应用

    只在栈上创建对象 设计策略:通过私有构造函数和公共静态工厂方法来实现。 实现步骤: 私有构造函数:将构造函数声明为私有,禁止外部直接调用。...通过静态工厂方法,可以提供统一的接口来创建对象,简化了代码结构。 缺点: 需要外部代码调用静态工厂方法来创建对象,可能增加了调用成本。 对于复杂的对象创建逻辑,静态工厂方法可能不够灵活。 2....对象的创建:在需要使用对象的代码中,通过调用智能指针的构造函数来创建对象。...() final { // 不可覆盖的成员函数 } }; 在这个例子中,finalize 成员函数被声明为 final,这意味着它不能被派生类覆盖。...Singleton::instance; // 静态成员变量的初始化 在这个例子中,Singleton 类的构造函数是私有的,外部无法直接创建其实例。

    26110

    【C++】单例模式「详尽版」

    如何实现单例模式 实现一个单例模式的类,要做到以下几点: 私有化构造函数,防止在外部通过构造函数直接创建出对象。 禁用拷贝构造和赋值运算符,防止在外部通过拷贝构造和赋值直接创建出对象。...static Singleton& getInstance() { // 静态局部变量在第一次调用时初始化,且只初始化一次 return only; } // 示例成员函数...我们需要定义一个类的静态成员变量【如刚刚代码中的static Singleton only】。...Singleton& getInstance() { // 静态局部变量在第一次调用时初始化,且只初始化一次 return only; } // 示例成员函数 void doSomething...是的,原因如下: 1.静态局部变量在程序启动阶段就已经被分配内存空间了,但是它的的初始化却是在第一次运行到它的时候,如果我们不调用GetOnly()方法,这个静态局部变量是不会被初始化的。

    32010

    【细品C++】类和对象的一些细节(初始化列表、友元、static成员等)

    不过希望我对这些知识的整理能帮助你更好的理解这部分知识。 深究构造函数 构造函数体赋值与初始化 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。...本质其实是初始化列表的缺省,在初始化时,成员变量也和普通内置类型的变量一样,可以使用值初始化,也可以调用函数并使用其返回值初始化。..._day; }; 类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员变量(且该类型没有默认构造函数时) 尽量使用初始化列表初始化。...当然,抛开这些不谈,无论是类成员,还是普通地使用内置类型变量,尽量对变量初始化是一个良好的编程习惯。 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表的先后次序无关。...一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同 友元类 友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

    58320
    领券