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 条评论
登录 后参与评论

相关文章

来自专栏用户3030674的专栏

java抽象类和抽象方法之间的关系

抽象类和抽象方法之间的关系 有抽象方法的类,一定是抽象类;抽象类不一定有抽象方法 当子类继承抽象类时,必须要将抽象类中的抽象方法全部实现(或者称为重写),否则子...

451
来自专栏mathor

JAVA——类的定义及其实例化

713
来自专栏ios 技术积累

Java 重写(Override)与重载(Overload)总结

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根...

792
来自专栏海说

单元测试基本方法

依照类型划分,单元测试方法可以划分为两大类。一类是针对public方法进行测试,另一类是针对private方法进行测试。 public方法测试 public方法...

1870
来自专栏程序员互动联盟

【java基础】static关键字--静态块

在说明static关键字的第三个用法时,我们有必要重新梳理一下一个对象的初始化过程。以下面的代码为例: package com.dotgua.study; cl...

34511
来自专栏LanceToBigData

JavaSE(三)之static、final、abstract修饰符

一、static修饰符 1.1、static变量         在类中,使用static修饰的成员变量,就是静态变量,反之为非静态变量。         ...

1785
来自专栏LanceToBigData

JavaSE(四)之接口、访问控制

上面我们学习了几个修饰符,在开发中经常会用的到,所以必须熟练的掌握。接下来我学习一下接口和访问控制。 一、接口 一系列方法的声明,是一些方法特征的集合,一个接口...

2147
来自专栏互联网杂技

简单理解通过原型继承

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head>...

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

Java程序员的日常 —— Java类加载中的顺序

之前说过Java中类的加载顺序,这次看完继承部分,就结合继承再来说说类的加载顺序。 继承的加载顺序 由于static块会在首次加载类的时候执行,因此下面的...

18210
来自专栏everhad

使用通配符和泛型:完成父子类关系的List对象的类型匹配

泛型和通配符 使用泛型和通配符都可以让一个方法所表示的算法逻辑适应多种类型。 Java中具备继承关系的类A、B(A extends B)它们的集合List<A...

1777

扫码关注云+社区