JAVA的初始化顺序

这里主要是介绍JAVA的类的初始化顺序,比较基础;主要是以例子演示为主:

  • 例子一:


 1 package com.cnblog.GDUTtiantian;
2
3 /**
4 *
5 * @author GDUTtiantian
6 * @date 2014-5-19 下午1:30:10
7 * JAVA类的初始化顺序
8 */
9 public class Tiantian {
10
11 {
12 System.out.println("初始化:代码块1");
13 }
14
15 {
16 System.out.println("初始化:代码块2");
17 }
18
19 public Tiantian(){
20
21 System.out.println("Constructor:Tiantian");
22 }
23
24 {
25 System.out.println("初始化:代码块3");
26 }
27
28 public static void main(String[] args) {
29 Tiantian client = new Tiantian();
30 }
31
32 }

?





1

2

3

4

例子一运行结果:<br><br>初始化:代码块1

初始化:代码块2

初始化:代码块3

Constructor:Tiantian

  

  非静态代码块和普通变量一样,按照在程序出现的先后顺序,被加载到构造器中进行初始化;所以它们被初始化的顺序就是在程序中的出现的先后顺序。

  下一步,稍微修改下例子一的代码:

  • 例子二:


 1 package com.cnblog.GDUTtiantian;
2
3 /**
4 *
5 * @author GDUTtiantian
6 * @date 2014-5-19 下午1:30:10
7 * JAVA类的初始化顺序
8 */
9 public class Tiantian {
10
11 {
12 //这里编译不会出错,主要是当前代码块处于name属性的作用域范围。
13 this.name = "GDUT";
14 System.out.println("初始化:代码块1");
15 }
16
17 {
18 System.out.println("初始化:代码块2");
19 }
20
21 private String name = "tiantian";
22
23 public Tiantian(){
24
25 System.out.println("Constructor:Tiantian");
26 }
27
28 {
29 System.out.println("初始化:代码块3");
30 }
31
32 public static void main(String[] args) {
33 Tiantian client = new Tiantian();
34 System.out.println(client.name);
35 }
36
37 }

  

?





1

2

3

4

5

6

7

例子二运行结果:

初始化:代码块1

初始化:代码块3

初始化:代码块3

Constructor:Tiantian

tiantian

  理解了这里,可以帮助更好地理解JAVA类的初始化过程。JAVA类不是在定义private String
name =
"tiantian";的时候先对name进行初始化,而是在代码块一中就对name进行了初始化,name的值为”GDUT”,然后再进一步初始化,name的值为”tiantian”.下面一个例子主要是针对具有继承关系的两个类的初始化顺序的探讨。

  • 例子三:


 1 package com.cnblog.GDUTtiantian;
2
3
4 class Parent {//父类
5
6 {//Parent:block 1
7 this.name = "My parent.";
8 System.out.println("Parent:代码块1");
9 }
10
11 private String name = "A Parent.";
12
13 {//Parent:block 2
14 this.name = "Your parent.";
15 System.out.println("Parent:代码块2");
16 }
17
18
19 public Parent(){
20 System.out.println("Constructor:Parent");
21 System.out.println(this.name);
22 }
23
24 {//Parent:block 3
25 this.name = "Their parent.";
26 System.out.println("Parent:代码块3");
27 }
28 }
29
30 /**
31 *
32 * @author GDUTtiantian
33 * @date 2014-5-19 下午1:30:10
34 * JAVA类的初始化顺序
35 */
36 public class Tiantian extends Parent{
37
38 {//block 1
39 //这里编译不会出错,主要是当前代码块处于name属性的作用域范围。
40 this.name = "GDUT";
41 System.out.println("初始化:代码块1");
42 }
43
44 {//block 2
45 System.out.println("初始化:代码块2");
46 }
47
48 private String name = "tiantian";
49
50 public Tiantian(){
51
52 System.out.println("Constructor:Tiantian");
53 }
54
55 {//block 3
56 System.out.println("初始化:代码块3");
57 }
58
59 public static void main(String[] args) {
60 Tiantian client = new Tiantian();
61 System.out.println(client.name);
62 }
63
64 }

   

?





1

2

3

4

5

6

7

8

9

10

11

12

例子三运行结果:

Parent:代码块1

Parent:代码块2

Parent:代码块3

Constructor:Parent

Their parent.

初始化:代码块1

初始化:代码块2

初始化:代码块3

Constructor:Tiantian

tiantian

  

  首先,初始化子类时,会先去调用父类的构造器(如果没有显示调用,则编译器会自动调用父类的无参构造器,如果此时父类没有无参构造器,则编译会出错。),如果父类有继承其他类,则会调用其他类的构造器;否则,和例子二的初始化顺序一样。

总结:这里主要是涉及类的初始化,仅仅是非静态属性的初始化;还有其他的东西,后面会继续完善。

  

  我的主页

  

以上是个人的观点,欢迎交流讨论。

  [从文章转到随笔]  

JAVA的初始化顺序,布布扣,bubuko.com

时间: 2024-10-08 02:50:52

JAVA的初始化顺序的相关文章

Java 对象初始化顺序 执行顺序

先看一道Java面试题: 求这段程序的输出. 解答此题关键在于理解和掌握类的加载过程以及子类继承父类后,重写方法的调用问题: 从程序的执行顺序去解答: 1.编译:当这个类被编译通知后,会在相应的目录下生成两个.class 文件.一个是 Base.class,另外一个就是Base$Sub.class.这个时候类加载器将这两个.class  文件加载到内存 2.Base base= new Sub(): 声明父类变量base对子类的引用,JAVA类加载器将Base,Sub类加载到JVM(Java虚拟

Java对象初始化顺序(一)

---恢复内容开始--- 偶尔翻到了关于Java对象初始化顺序的面试题,重新复习了一下,顺便做笔记. 1.父类子类构造函数执行的先后顺序 public class Test2 { public int Field; //step 1 public Test2(){ Field = 1; } } /*************************************************/ /** * 次类的目的仅是为了验证父类子类构造函数执行的先后顺序 */ public class T

java类初始化顺序

java类初始化顺序 执行顺序如下: 没有继承其他类时: 静态变量 静态初始化块 变量 初始化块 构造器 继承其他类时: 父类--静态变量 父类--静态初始化块 子类--静态变量 子类--静态初始化块 父类--变量 父类--初始化块 父类--构造器 子类--变量 子类--初始化块 子类--构造器 执行顺序图:

Java变量、Java对象初始化顺序

局部变量与成员变量: 局部变量分为: 行参:在方法签名中定义的局部变量,随方法的结束而凋亡. 方法内的局部变量:必须在方法内对其显示初始化,从初始化后开始生效,随方法的结束而凋亡. 代码块内的局部变量:必须在代码块内对其显示初始化,从初始化后开始生效,随代码块的结束而凋亡. 成员变量: 静态属性:类加载时初始化,随着类的存在而存在: 非静态属性:随着实例的属性存在而存在: 关于他两的区别: 1.局部变量不可以加static: 2.局部变量不可以加public.protected.private:

静态代码块、构造代码块、构造函数以及Java类初始化顺序

静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public HelloA(){//构造函数 } 关于构造函数,以下几点要注意:1.对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的.2.构造函数的作用是用于给对象进行初始化.3.一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次. 构造代码块 {//构造代码块 }

Android(java)学习笔记136:Java类初始化顺序

Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: 静态变量 静态初始化块 变量 初始化块 构造器 由此得出Java继承类初始化顺序结论: 1 .继承体系的所有静态成员初始化(先父类,后子类) 2 .父类初始化完成(普通成员的初始化-->构造函数的调用) 3 .子类初始化(普通成员-->构造函数) Java初始化顺序如图: 代码演示: class Sample { Sample(String s) { System.out.println(s); } Sample() { Sy

转!!关于java类初始化顺序

原文地址:http://www.cnblogs.com/luckygxf/p/4796955.html 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量->子类静态变量初始化块->父类变量初始化->父类变量初始化块->父类构造方法->子类变量初始化->子类变量初始化块->子类构造方法 --------------------------

Java对象初始化顺序

最近我发现了一个有趣的问题,这个问题的答案乍一看下骗过了我的眼睛.看一下这三个类: package com.ds.test;   public class Upper { String upperString;   public Upper() {   Initializer.initialize(this); } } package com.ds.test;   public class Lower extends Upper {   String lowerString = null;  

【细说Java】Java变量初始化顺序

Java的变量初始化顺序,对这里一直似懂非懂,面试的时候也经常被问到,但答的一直不好,现在整理记录一下,以后忘记了可以来看看. 程序分为两个部分,第一个部分不考虑继承,第二个部分考虑继承: (1)不考虑继承的情况 代码如下: public class JavaTest { public JavaTest() { System.out.println("执行JavaTest构造方法1"); } public JavaTest(String param) { System.out.prin