java小心机(5)| 浅谈类成员初始化顺序
类成员什么时候会被初始化呢?一般来说:“类的代码在初次使用时才被加载”,加载过程包括了初始化。
比如说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
从结果可以看出,初始化顺序为:父类静态域->子类静态域->父类非静态域->父类构造函数->子类非静态域->子类构造函数
这里说明一点:这是初始化顺序,不等同于语句程序的执行过程。因此在上面的初始化顺序里没有成员方法(静态或者非静态都没有),这是因为成员方法都是调用了才执行,虽然静态方法已经被加载进了方法区,但初始化过程中并没有执行过。
推荐阅读:
点击阅读原文,阅读「java小心机」系列文章
您的点赞、转发是对我最大的支持!
THANDKS
- End -
一个立志成大腿而每天努力奋斗的年轻人
伴学习伴成长,成长之路你并不孤单!
java小心机(5)| 浅谈类成员初始化顺序的更多相关文章
- Java类成员初始化顺序
类中包含7中成员:1.静态变量 static2.final静态常量 final static3.静态代码块 static{} //多个代码块顺序执行 4.普通变量5.普通代码块 {} //多个代码 ...
- C#的类成员初始化顺序
C#的类成员的定义和声明如下 using UnityEngine; using System.Collections; public class TestController : ECControll ...
- C#类成员初始化顺序
这里直接给出C#类成员一般初始化顺序: 子类静态字段 子类静态构造 子类实例字段 父类静态字段 父类静态构造 父类实例字段 父类实例构造 子类实例构造 为什么说是"一般"初始化顺序 ...
- C#类和类成员初始化顺序
1.不带静态成员的普通类,首先通过构造函数初始化. 2.带静态属性的类,无论是普通类还是静态类,都会先初始化静态字段,再执行构造函数. 3.类初始化时,不会执行类中方法,无论是否是静态.若想执行方法, ...
- C#核心基础--浅谈类和对象的概念
浅谈类和对象的概念 一.什么是类?什么是对象? 学习一门面向对象编程语言,我们必须得知道什么是类?什么是对象? 类(Class)实际上是对某种类型的对象定义变量和方法的原型.它表示对现实生活中一类具有 ...
- java"小心机"(1)【资源彩蛋!】
每天进步一点点,距离大腿又近一步! 阅读本文大概需要9分钟 java"小心机"系列文章在此开篇.在这,将会给你带来曾经错过.忽略或感到模糊的知识,也许它很基础,微不足道,但它能修复 ...
- java的反射机制浅谈(转)
原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...
- java小心机(3)| 浅析finalize()
每天进步一丢丢,连接梦与想 如果你停止就是谷底,如果你还在努力就是上坡 系列文章 java"小心机"(1)[资源彩蛋!] java小心机(2)| 重载和构造器的小细节 预备知识 J ...
- java小心机(2)| 重载和构造器的小细节
每天进步一点点,距离大腿又近一步! 阅读本文大概需要10分钟 java小心机,为你诉说java鲜为人知的一面 涉及基本数据类型的重载 基本类型能从一个"较小"的类型自动提升到&qu ...
随机推荐
- POJ 1797 Heavy Transportation(Dijkstra运用)
Description Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can no ...
- 破解第一个程序----分析APK文件
反编译APK成功后,在outdir目录下会生成一系列目录与文件. smali:程序所有的反汇编代码: res:程序中所有的资源文件: 如何寻找突破口是分析程序的关键.错误提示一般是指引关键代码的风向标 ...
- 修改Samba密码后无法登录
Samba修改用户名密码后,无法登陆 之后每次进去都是以这样的username和passwd进去的,如何才能使用其他的用户来重新登录samba server呢? 首先使用在开始菜单里面输入cmd: 进 ...
- 小白进阶之路-python数据类型
1.数据类型:变量值是我们存储的数据,所以数据类型值得就是变量的不同种类 2.数据分类型的原因:变量值是用来保存现实世界的中的状态的,呢么针对不同的状态就应该用不同类型上午数据去表示 (1)整型int ...
- 从零开始のcocos2dx生活(九)CCBReader
NodeLoaderLibrary是用来存储节点加载器类型的类,通过registerDefaultNodeLoaders()可以注册所有默认类型的加载器 在CocosBuilder的使用手册中: 1. ...
- pyspider遇到的第一个坑:Active Tasks成功,Results无内容
#!/usr/bin/env python# -*- encoding: utf-8 -*-# Created on 2020-01-04 16:30:27# Project: HomeWork fr ...
- 物理ceph集群+K8s
前提条件 在Ceph为k8s创建一个pool ceph osd pool create k8s 128 创建admin用户 ceph auth get-or-create client.admin m ...
- 如何修改Docker已运行实例的端口映射
如何修改Docker已运行实例的端口映射 Docker的端口映射,往往出现在两个阶段需要处理: 1.是在docker启动前就已经确定好,哪个docker实例映射哪个端口(往往这个情况比较,需要提前做规 ...
- 到底如何配置 maven 编译插件的 JDK 版本
千言万语不及官方文档,详情请阅读 compiler:compile 文档 配置 maven 编译插件的 JDK 版本 maven 编译插件(maven-compiler-plugin)有默认编译 JD ...
- C#调用Matlab生成的Dll
问题描述:最近开发需要调用matlab生成的DLL,在New MWNumericArray 对象的时候报错,提示未将对象引用到对象的实例. 问题分析:因为MWArray.dll是Matlab提供的DL ...