`
静夜独窗
  • 浏览: 56309 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 类的初始化执行顺序(包括继承、static变量及代码块,普通成员变量,构造方法)

阅读更多

不忙的时候看了一下java基础,初始化顺序这里以前不太清楚,现在明白好多,如果你也和我一样,相信通过这段代码能给你帮助

public class TestCodeExecOrder extends TestCodeExecOrderHost {
	
	static {System.out.println("TestCodeExecOrder static代码块");}//(3)静态代码块
	
	//(1)和(2)的顺序决定了输出顺序,也就是说哪个在前,先走哪个代码
	private int x = print("TestCodeExecOrderHost xx变量");//(2)普通成员变量
	{System.out.println(xx2+"TestCodeExecOrderHost  动态代码块");}//(1)动态代码块
	//private int x = print("TestCodeExecOrderHost xx变量");//(2)普通成员变量
	
	//(3)和(4)的顺序决定了输出顺序,也就是说哪个在前,先走哪个代码
	private static int xx2 = print("static TestCodeExecOrder.xx2 init");//(4)static成员变量
	
	public TestCodeExecOrder(){
		System.out.println("TestCodeExecOrder  j="+j);
		System.out.println("TestCodeExecOrder  x="+x);
	}
	public static void main(String[] args) {
		System.out.println("TestCodeExecOrder main");
		TestCodeExecOrder t = new TestCodeExecOrder();
	}
}
class TestCodeExecOrderHost{
	private int i = 9;
	public int j;
	
	private static int xx = print("static TestCodeExecOrderHost.xx init");
	{System.out.println(xx+"TestCodeExecOrderHost 动态代码块");}
	static {System.out.println("TestCodeExecOrderHost static代码块");}
	public TestCodeExecOrderHost(){
		System.out.println("TestCodeExecOrderHost  i="+i+" j="+j);
		j = 10;
	}
	
	public static int print(String s){
		System.out.println(s);
		return 20;
	}
}

 

 

//output结果
static TestCodeExecOrderHost.xx init
TestCodeExecOrderHost static代码块
TestCodeExecOrder static代码块
static TestCodeExecOrder.xx2 init
TestCodeExecOrder main
20TestCodeExecOrderHost 动态代码块
TestCodeExecOrderHost  i=9 j=0
TestCodeExecOrderHost xx变量
20TestCodeExecOrderHost  动态代码块
TestCodeExecOrder  j=10
TestCodeExecOrder  x=20

 

 

总结:

主线:如果有父类先走父类部分,再走子类部分

细分:

(0)在其他任何事情发生之前,将分配给对象的存储空间初始化成二进制的的零(先是父类的成员变量初始为默认值,再是子类的成员变量初始为默认值)

(1)程序运行时第一件事就是试图访问TestCodeExecOrder .main方法(他是static的),这是加载器加载TestCodeExecOrder的编译代码,对他加载过程中如果发现他有一个父类TestCodeExecOrderHost,接着对父类进行加载;

(2)接着,父类中的static初始化被立刻进行,然后是子类的static初始化(此处的static包括:static变量和static代码块,谁在前,谁就先执行),此时必要的类加载完毕,就可以创建对象了

(3)此时,对对象中的普通成员变量初始化(有值得赋值,没值的赋默认值)(普通成员变量包括:普通成员变量和动态代码块,谁在前,谁就先执行),接着父类的构造方法被执行,然后是子类的构造方法

本人看书之后的理解,如果有不对的地方欢迎大家指正,这些基本的执行顺序在分析实际项目的bug感觉很有用

0
0
分享到:
评论

相关推荐

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    Java开发技术大全(500个源代码).

    errorInit.java 演示变量初始化错误的程序 integerExample.java 演示各种整型变量的使用 isPrime.java 判断素数 leapYearByIf.java 用if语句判断闰年 leapYearByLogical.java 用逻辑表达式判断闰年 lowToUpper...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    生成对象的最后一步是执行构造方法,进行初始化。由于对构造方法可以进行重写 ,所以通过给出不同个数或类型的参数会分别调用不同的构造方法。 例子:以类 Rectangle 为例,我们生成类 Rectangle 的对象: Rectangle p1...

    【04-面向对象(上)】

    •用static修饰的初始化块为静态初始化块,由于是静态的,所以是属于类,当类加载时,就执行静态初始化块 ,  但执行一个子类时,最先执行其最顶层父类的静态初始化, •初始化块是属于实例 的。只要创建一次...

    java基础非常典型的面试题目.wps

    实例变量可以在定义处或者在构造方法中被显式初始化。如果在这两处都没有初始化,那么保留自动初始化时的默认值。final型的变量必须被显式初始化。 静态变量可以在定义处或者在静态代码块中被显式初始化。如果在这两...

    【05-面向对象(下)】

    •在java类里只能包含Field,方法,构造器,初始化块,内部类(接口、枚举)等5种成员。 用static修饰的类成员属 于类成员,类Field既可通过类来访问,也可以通过类的对象来访问。当通过对象来访问类属性时,系统会在底...

    J2SE(javaSE基础知识).doc

    java简介、java不同版本、java特点、jdk、第一个程序、jdk、jre、jvm、eclipse配置、注释、标识符、变量、数据类型、运算符、分支语句、命名规范、循环语句、数组、main方法、面向对象、成员变量和局部变量、构造...

    screenshot-www.rockstargames.com-2019.12-1.png

    可修饰:Static 可以修饰 内部类、方法、成员变量、代码块。 不可修饰:Static不可修饰外部类、局部变量【static 属于类的,局部变量属于其方法,并不属于类】 注意:static 方法不能兼容this关键字【static...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解...

    JAVA编写飞机大战-千锋实训项目

    飞机大战的需求: ​ 1.游戏可以产生: 小敌机/大敌机/小蜜蜂 -> 随机(概率)产生 ...5.创建类需要不同的构造方法 - 初始化成员变量 a.加载(读取)图片 -> static{} -> 静态代码块,需要静态成员变量 b.获取父类中的成员变量

    java 面试题 总结

    接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象...

    javaSE代码实例

    6.7.2 局部变量的初始化 90 6.8 this预定义对象引用 92 6.9 擅用系统已有的类 94 6.9.1 Java中的Date类 94 6.9.2 Java中的GregorianCalendar类 96 6.9.3 擅用系统已有类的思想 98 6.10 小结 99 第7章...

    java三大特性说明

     对于由final static共同修饰的变量,赋值的机会有两个,一是在声明的时候,二是在静态代码块中,两次机会有且只能有一次被选择.   继承:  允许存在父子类的关系,一个子类有且只有一个直接的父类(Java中的继承...

    JAVA面试题最全集

    一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? ...

    JAVA基础课程讲义

    静态初始化块(经常用来初始化类,加载类信息时执行!) 67 package 68 JDK中的主要包 68 import 68 eclipse的使用 69 继承(extend, inheritance) 70 为什么需要继承?继承的作用? 70 继承介绍 70 如何实现继承? ...

    基于javatcpsocket通信的拆包和装包源码-java-:Java-

    构造代码块:所有的对象进行初始化,所有的对象都会调用一个代码块 构造函数:给相对应的对象进行初始化,具有针对性 this:代表对象,就是锁在函数所属对象的引用(在构造函数中必须是第一行) 静态方法:只能访问...

    javacore:java核心 运算符,控制语句,函数,异常,集合,线程,数组,IO流,网路编程,设计模式,java8,面试相关

    Java基础 java控制流程语句 数据交换 左(右)移 加密 java控制流程语句 switch语句 季节判断 while循环 1+...+100 do while循环 ...jvm类加载顺序决定代码执行顺序 super关键字 方法重写 instanceof关键字 fi

    c#学习笔记——学习心得

    向方法传递结构时,是通过传值方式传递的,结构实例化可以不用new,结构可以声明构造函数,但必须带参数,且声明的构造函数是用来对成员初始化的,必须包含每个字段。结构不能从另一个结构或类继承而来,但可以实现...

Global site tag (gtag.js) - Google Analytics