java的静态属性,静态块,构造函数的执行顺序

今天为了搞清楚实例化一个对象时其属性等的实例化顺序,写了下面的例子来探究:

实例化一个C的对象,其中,A为其静态属性,B为其普通属性;D为C的父类,E为D的静态属性,F为D的普通属性;C中还包含了静态代码块和普通代码块。

package com.yawn;

public class Test3 {

	public static void main(String[] args) {
		System.out.println("-------第1次实例化-------");
		new C();
		System.out.println("-------第2次实例化-------");
		new C();
	}

}

class A {
	public A(){
		System.out.println("构造静态属性A");
	}
}
class B {
	public B(){
		System.out.println("构造普通属性B");
	}
}
class E {
	public E(){
		System.out.println("父类的静态属性E");
	}
}
class F {
	public F(){
		System.out.println("父类的普通属性F");
	}
}
class D {
	static E e = new E();
	F f = new F();
	public D(){
		System.out.println("构造父类D");
	}
}

class C extends D{
	
	/**
	 * 静态代码块先于构造器执行 普通块先于构造块  只执行一次
	 * 凡是静态的与对象无关,先于对象存在的; 凡是静态的都是共享的
	 */
	
	B b = new B();
	static A a = new A();
	
	{
		System.out.println("普通代码块");
	}
	
	static {
		System.out.println("静态代码块");
	}
	
	public C(){
		System.out.println("构造函数C");
	}
}

运行结果:

-------第1次实例化------- 父类的静态属性E 构造静态属性A 静态代码块 父类的普通属性F 构造父类D 构造普通属性B 普通代码块 构造函数C -------第2次实例化------- 父类的普通属性F 构造父类D 构造普通属性B 普通代码块 构造函数C

结论(实例化顺序):

  1. 父类静态的属性
  2. 父类静态的代码块
  3. 子类静态的属性
  4. 子类静态的代码块
  5. 父类普通属性
  6. 父类普通代码块
  7. 父类构造函数
  8. 子类普通属性
  9. 子类普通代码块
  10. 子类构造函数

静态的东西只在第一次实例化的时候执行

原则:先静态后非静态、先父类后子类

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏柠檬先生

Java 流程控制

Java 主要的流程控制语句有3钟,选择语句,循环语句,跳转语句。 Java 中的作用域,是一对用花括号括起来的,块定义了变量使用的范围,   各个块之间可以嵌...

1867
来自专栏我的技术专栏

java与C++变量初始化的对比

863
来自专栏小二的折腾日记

day5(面向对象2)

异常体系:Throwable |–Eroor |–Exception ...

362
来自专栏小程序的道路

小程序渲染

在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。通过遍历数据,将数据展示,类似vue中的 v-for。 wx:for-...

1082
来自专栏GreenLeaves

Jquery 遍历数组之grep()方法介绍

grep()方法用于数组元素过滤筛选。 grep(array,callback,boolean);方法参数介绍。 array   ---待处理数组 callba...

1785
来自专栏海天一树

小朋友学Python(3):布尔类型

本节讲解C/C++/Java/Python中的布尔类型。 一、C语言 C语言中没有布尔类型,判断时 ,0为假,非0为真。 二、C++ C++的bool是布尔类型...

26411
来自专栏小樱的经验随笔

Vijos P1784 数字统计【模拟】

数字统计 背景 来自 NOIP2010 普及组 第一题 描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。 比如在给定范围[2, 22],数...

2499
来自专栏前端架构

HTML解析里的标记化算法

该算法使用状态机来表示。每一个状态接收来自输入信息流的一个或多个字符,并根据这些字符更新下一个状态。当前的标记化状态和树结构状态会影响进入下一状态的决定。这意味...

321
来自专栏xingoo, 一个梦想做发明家的程序员

复制控制---复制构造函数

复制构造函数 只有单个形参,而且该参数是对本类类型对象的引用。 主要用于: 1 根据另一个同类型的对象显示或隐式的初始化一个对象 string a = "abc...

1845
来自专栏python成长之路

字典常用操作

1634

扫描关注云+社区