不忙的时候看了一下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感觉很有用
相关推荐
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
errorInit.java 演示变量初始化错误的程序 integerExample.java 演示各种整型变量的使用 isPrime.java 判断素数 leapYearByIf.java 用if语句判断闰年 leapYearByLogical.java 用逻辑表达式判断闰年 lowToUpper...
生成对象的最后一步是执行构造方法,进行初始化。由于对构造方法可以进行重写 ,所以通过给出不同个数或类型的参数会分别调用不同的构造方法。 例子:以类 Rectangle 为例,我们生成类 Rectangle 的对象: Rectangle p1...
•用static修饰的初始化块为静态初始化块,由于是静态的,所以是属于类,当类加载时,就执行静态初始化块 , 但执行一个子类时,最先执行其最顶层父类的静态初始化, •初始化块是属于实例 的。只要创建一次...
实例变量可以在定义处或者在构造方法中被显式初始化。如果在这两处都没有初始化,那么保留自动初始化时的默认值。final型的变量必须被显式初始化。 静态变量可以在定义处或者在静态代码块中被显式初始化。如果在这两...
•在java类里只能包含Field,方法,构造器,初始化块,内部类(接口、枚举)等5种成员。 用static修饰的类成员属 于类成员,类Field既可通过类来访问,也可以通过类的对象来访问。当通过对象来访问类属性时,系统会在底...
java简介、java不同版本、java特点、jdk、第一个程序、jdk、jre、jvm、eclipse配置、注释、标识符、变量、数据类型、运算符、分支语句、命名规范、循环语句、数组、main方法、面向对象、成员变量和局部变量、构造...
可修饰:Static 可以修饰 内部类、方法、成员变量、代码块。 不可修饰:Static不可修饰外部类、局部变量【static 属于类的,局部变量属于其方法,并不属于类】 注意:static 方法不能兼容this关键字【static...
7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解...
7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解...
飞机大战的需求: 1.游戏可以产生: 小敌机/大敌机/小蜜蜂 -> 随机(概率)产生 ...5.创建类需要不同的构造方法 - 初始化成员变量 a.加载(读取)图片 -> static{} -> 静态代码块,需要静态成员变量 b.获取父类中的成员变量
接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象...
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章...
对于由final static共同修饰的变量,赋值的机会有两个,一是在声明的时候,二是在静态代码块中,两次机会有且只能有一次被选择. 继承: 允许存在父子类的关系,一个子类有且只有一个直接的父类(Java中的继承...
一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? ...
静态初始化块(经常用来初始化类,加载类信息时执行!) 67 package 68 JDK中的主要包 68 import 68 eclipse的使用 69 继承(extend, inheritance) 70 为什么需要继承?继承的作用? 70 继承介绍 70 如何实现继承? ...
构造代码块:所有的对象进行初始化,所有的对象都会调用一个代码块 构造函数:给相对应的对象进行初始化,具有针对性 this:代表对象,就是锁在函数所属对象的引用(在构造函数中必须是第一行) 静态方法:只能访问...
Java基础 java控制流程语句 数据交换 左(右)移 加密 java控制流程语句 switch语句 季节判断 while循环 1+...+100 do while循环 ...jvm类加载顺序决定代码执行顺序 super关键字 方法重写 instanceof关键字 fi
向方法传递结构时,是通过传值方式传递的,结构实例化可以不用new,结构可以声明构造函数,但必须带参数,且声明的构造函数是用来对成员初始化的,必须包含每个字段。结构不能从另一个结构或类继承而来,但可以实现...