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

相关文章

来自专栏闻道于事

JavaScript深入浅出补充——(一)数据类型,表达式和运算符

项目基本做完,在进行下一阶段学习之前先看视频学习回顾一下JavaScript 一、数据类型 JavaScript中有五种原始类型和一种对象类型 ? JavaSc...

3325
来自专栏黑泽君的专栏

final关键字、多态、抽象类、接口的小复习

--------------------------------------- 1:final关键字可以干什么?有什么特点?   最终的意思。可以修饰类,方法...

702
来自专栏水击三千

浅谈JavaScript的面向对象程序设计(三)

  前面已经对JavaScript的面向对象程序设计作了简单的介绍,包括了对象的属性、对象的工厂模式、构造函数和原型等。通过介绍,这些创建对象的方法依然有不少优...

2345
来自专栏猿人谷

const用法小结

常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。因此,定义或说明常类型时必须进行初始化。 概述 1. const有什么...

1787
来自专栏一“技”之长

深入理解JavaScript函数 原

    从功能上理解,函数是一组可以随时运行的语句,是一段代码块,也是所谓的子程序。在JavaScript中,函数实质上也是一种对象,是Function对象。函...

551
来自专栏河湾欢儿的专栏

第四节检测数据类型4种方式

821
来自专栏黑泽君的专栏

静态变量和成员变量的区别 && 成员变量和局部变量的区别

=============================================================================

1002
来自专栏Android机器圈

JAVA基本数据类型、引用数据类型-参数传递详解

对于基本数据类型,修改这个值并不会影响作为参数传进来的那个变量,因为你修改的是方法的局部变量,是一个副本。实参的精度级别应等于或低于形参的精度级别,否则报错。

932
来自专栏猿人谷

运算符重载

  C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符...

2207
来自专栏十月梦想

变量和常亮

在函数内,变量的使用需要声明常量的作用域globay变量名(全局作用)local(局部)static(静态)

692

扫码关注云+社区