类成员什么时候会被初始化呢?一般来说:“类的代码在初次使用时才被加载”,加载过程包括了初始化。

比如说new A()调用构造函数时,类中全部成员都会被初始化。

但对于static域(包括静态成员变量、静态代码块、静态方法),当某个static域被调用时,类中的的所有staict就会被初始化,按照定义顺序(即书写顺序)初始化,且只会初始化一次(N个实例共用)``。

static域的初始化优先级要优于普通成员(即非静态域)

下文代码例子名称解释:

静态域:静态代码块、静态成员变量

非静态域:非静态代码块、非静态成员变量

(ps:成员方法不包含在里面,因为方法只能讲加载而非初始化)

在没有继承父类的情况下:

class HelloA {
public HelloC helloC1 = new HelloC("普通成员C1 构造函数前"); public HelloA() {
System.out.println("构造函数A");
} public HelloC helloC2 = new HelloC("普通成员C2 构造函数后"); static {
System.out.println("静态块A");
} public HelloC helloC3 = new HelloC("普通成员C3 静态块后"); {
System.out.println("非静态块A");
} public HelloC helloC4 = new HelloC("普通成员C4 非静态块后"); public static HelloC helloC5 = new HelloC("静态成员C5"); public static void main(String[] args) {
new HelloA();
}
} class HelloC {
public HelloC(String str) {
System.out.println(str);
}
} //out:
静态块A
静态成员C5
普通成员C1 构造函数前
普通成员C2 构造函数后
普通成员C3 静态块后
非静态块A
普通成员C4 非静态块后 构造函数C
构造函数A

可以看出,初始化顺序为:静态域 -> 非静态域 -> 构造函数

以上面优先级并按所定义的顺序初始化(即书写顺序)

在有继承父类的情况下:

class HelloA extends HelloB{

    public HelloA() {
System.out.println("子类:构造函数A");
} static {
System.out.println("子类:静态块A");
} {
System.out.println("子类:非静态块A");
} public static void main(String[] args) {
new HelloA();
}
} class HelloB {
public HelloB() {
System.out.println("父类:构造函数B");
} static {
System.out.println("父类:静态块B");
} {
System.out.println("父类:非静态块B");
}
} //out:
父类:静态块B
子类:静态块A
父类:非静态块B
父类:构造函数B
子类:非静态块A
子类:构造函数A

从结果可以看出,初始化顺序为:父类静态域->子类静态域->父类非静态域->父类构造函数->子类非静态域->子类构造函数

这里说明一点:这是初始化顺序,不等同于语句程序的执行过程。因此在上面的初始化顺序里没有成员方法(静态或者非静态都没有),这是因为成员方法都是调用了才执行,虽然静态方法已经被加载进了方法区,但初始化过程中并没有执行过。

推荐阅读:

「 趣图 」HTTP状态码

共享单车,要凉凉了?

点击阅读原文,阅读「java小心机」系列文章

您的点赞、转发是对我最大的支持!

THANDKS

  • End -

一个立志成大腿而每天努力奋斗的年轻人

伴学习伴成长,成长之路你并不孤单!

java小心机(5)| 浅谈类成员初始化顺序的更多相关文章

  1. Java类成员初始化顺序

    类中包含7中成员:1.静态变量 static2.final静态常量 final static3.静态代码块 static{}  //多个代码块顺序执行 4.普通变量5.普通代码块 {}  //多个代码 ...

  2. C#的类成员初始化顺序

    C#的类成员的定义和声明如下 using UnityEngine; using System.Collections; public class TestController : ECControll ...

  3. C#类成员初始化顺序

    这里直接给出C#类成员一般初始化顺序: 子类静态字段 子类静态构造 子类实例字段 父类静态字段 父类静态构造 父类实例字段 父类实例构造 子类实例构造 为什么说是"一般"初始化顺序 ...

  4. C#类和类成员初始化顺序

    1.不带静态成员的普通类,首先通过构造函数初始化. 2.带静态属性的类,无论是普通类还是静态类,都会先初始化静态字段,再执行构造函数. 3.类初始化时,不会执行类中方法,无论是否是静态.若想执行方法, ...

  5. C#核心基础--浅谈类和对象的概念

    浅谈类和对象的概念 一.什么是类?什么是对象? 学习一门面向对象编程语言,我们必须得知道什么是类?什么是对象? 类(Class)实际上是对某种类型的对象定义变量和方法的原型.它表示对现实生活中一类具有 ...

  6. java"小心机"(1)【资源彩蛋!】

    每天进步一点点,距离大腿又近一步! 阅读本文大概需要9分钟 java"小心机"系列文章在此开篇.在这,将会给你带来曾经错过.忽略或感到模糊的知识,也许它很基础,微不足道,但它能修复 ...

  7. java的反射机制浅谈(转)

    原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...

  8. java小心机(3)| 浅析finalize()

    每天进步一丢丢,连接梦与想 如果你停止就是谷底,如果你还在努力就是上坡 系列文章 java"小心机"(1)[资源彩蛋!] java小心机(2)| 重载和构造器的小细节 预备知识 J ...

  9. java小心机(2)| 重载和构造器的小细节

    每天进步一点点,距离大腿又近一步! 阅读本文大概需要10分钟 java小心机,为你诉说java鲜为人知的一面 涉及基本数据类型的重载 基本类型能从一个"较小"的类型自动提升到&qu ...

随机推荐

  1. vue脚手架搭项目 git push超时github网站打不开

    vue: 1.npm install vue-cli -g 全局安装脚手架 2.vue init webpack  name 新建项目 name为项目名称 react: 1..npm install  ...

  2. C# 如何给 ValueTuple 返回值添加注释

    在 C# 7.0 可以在一个方法的返回,返回多个参数,通过 ValueTuple 的方法,但是和单个参数返回不同的是,如何对多个参数返回每个参数进行单独的注释? 如使用下面的代码,我尝试在一个方法返回 ...

  3. Linux 内核 MODULEDEVICETABLE 宏

    这个 pci_device_id 结构需要被输出到用户空间, 来允许热插拔和模块加载系统知道什 么模块使用什么硬件设备. 宏 MODULE_DEVICE_TABLE 完成这个. 例如: MODULE_ ...

  4. Codeforces 837D 动态规划

    Codeforces 837D 动态规划 传送门:https://codeforces.com/contest/837/problem/D 题意: 给你n个数,问你从这n个数中取出k个数,这k个数的乘 ...

  5. 【Linux】Terminal中输入一行命令快速移动光标至行首行尾

    Linux: ①快速移动光标至行首 Home或Ctrl+A ②快速移动光标至行尾 End或Ctrl+E ③从光标处开始删除,直到行尾 Ctrl+K ④到下一行 Ctrl+N 或 方向键:↓ ⑤到上一行 ...

  6. CUP计算资源争抢通过IIS启用处理器关联解决

    由于业务的复杂性,我们在客户环境部署的时候,采用的是预装好在一台机器然后再把机器安装到客户环境,所以为了简单方便,我们把所有的服务都安装到一台机器上面了. 在正常的使用过程中是没有任何问题的.但是当有 ...

  7. Visual Studio Team Services使用教程【6】:Readers tfs组checkin权限修改

    你也可以只开启部分代码的权限 把上面开启的整个应用的权限先去掉 只开启一个文件的权限 2017.4.23之后建议朋友看下面的帖子 TFS2017 & VSTS 实战(繁体中文视频) Visua ...

  8. Python6_模块、包、import、from import的解释

    先说一下模块和包是什么? 模块(module):简单来说一个模块(module)就是一个py文件.在python中是这么约定. 模块里面有函数.类,就是一组代码的集合.   模块显然要有一个名字,这个 ...

  9. jsp页面中如何让一个输入框内的提示文字是灰色而输入的文字是黑色

    <input name="name" type="text"  value="提示的文字" size="30" o ...

  10. docker安装启动、配置MySql

    1.安装mysql镜像 docker pull mysql/mysql-server 2.docker中启动Mysql容器 docker run --name mysql01 -d -p 3306:3 ...