`

JAVA面试题解惑系列(一)——类的初始化顺序

阅读更多
removed.

请到博文下载PDF文件:http://zangweiren.iteye.com/blog/241218
105
9
分享到:
评论
86 楼 map612 2011-11-25  
补了一堂课,真值。这种东西还是多学点好
85 楼 jwx0925 2010-05-26  
老大,为什么删了啊??
84 楼 xiaolv 2010-05-20  



很好!
学习很多啊!
83 楼 smartepsh 2010-04-21  
看来我在Java混的还是短。。。这么牛的人一直没发现。好文章,正好解决了我的问题。
82 楼 wzju64676266 2009-12-01  
zhangyou1010 写道
博主写的不错,但我有个疑问。如果代码按下面那样写:

package Test;

public class TestInitOrder {
	
	//静态初始化块
	{
	
		System.out.println("静态初始化块");
		System.out.println(staticFeild);
	}
	
	//	静态变量
	public static String staticFeild = "静态变量";
	
	//变量
	public String feild = "变量";
	
	//初始化块
	{
		System.out.println(feild);
		System.out.println("初始化块");
	}
	
	//构造器
	TestInitOrder() {
		System.out.println("构造器");
	}
	public static void main(String args[]) {
		new TestInitOrder();
	}

}


debug的时候停在System.out.println("静态初始化块");这一行,会发现staticFeild 已经初始化了,按照博主的说法,静态变量和静态初始化块,初始化得次序是按他们在代码中定义的顺序来的,那这样就有矛盾了啊?


另外如果代码这样写:
package Test;

public class TestInitOrder {
	
	//变量
	public String feild = "变量";
	
	//静态初始化块
	{
	
		System.out.println("静态初始化块");
		System.out.println(staticFeild);
	}
	
	//	静态变量
	public static String staticFeild = "静态变量";
	

	
	//初始化块
	{
		System.out.println(feild);
		System.out.println("初始化块");
	}
	
	//构造器
	TestInitOrder() {
		System.out.println("构造器");
	}
	public static void main(String args[]) {
		new TestInitOrder();
	}

} 

debug停在 System.out.println("静态初始化块");这一行,会发现
feild变量也已经初始化了,请问这该怎么解释呢?  谢谢。



//静态初始化块
{

System.out.println("静态初始化块");
System.out.println(staticFeild);
}
你这个叫静态初始化吗?明明是初始化块。静态变量初始化当然会在初始化块前执行了。

       这样才是静态初始化!

         static {

System.out.println("静态初始化块");
System.out.println(staticFeild);
}


81 楼 yzlke 2009-09-25  
谢啦 lz 好东西额
80 楼 emsn 2009-08-20  
zhangyou1010 写道
博主写的不错,但我有个疑问。如果代码按下面那样写:

package Test;

public class TestInitOrder {
	
	//静态初始化块
	{
	
		System.out.println("静态初始化块");
		System.out.println(staticFeild);
	}
	
	//	静态变量
	public static String staticFeild = "静态变量";
	
	//变量
	public String feild = "变量";
	
	//初始化块
	{
		System.out.println(feild);
		System.out.println("初始化块");
	}
	
	//构造器
	TestInitOrder() {
		System.out.println("构造器");
	}
	public static void main(String args[]) {
		new TestInitOrder();
	}

}


debug的时候停在System.out.println("静态初始化块");这一行,会发现staticFeild 已经初始化了,按照博主的说法,静态变量和静态初始化块,初始化得次序是按他们在代码中定义的顺序来的,那这样就有矛盾了啊?


另外如果代码这样写:
package Test;

public class TestInitOrder {
	
	//变量
	public String feild = "变量";
	
	//静态初始化块
	{
	
		System.out.println("静态初始化块");
		System.out.println(staticFeild);
	}
	
	//	静态变量
	public static String staticFeild = "静态变量";
	

	
	//初始化块
	{
		System.out.println(feild);
		System.out.println("初始化块");
	}
	
	//构造器
	TestInitOrder() {
		System.out.println("构造器");
	}
	public static void main(String args[]) {
		new TestInitOrder();
	}

} 

debug停在 System.out.println("静态初始化块");这一行,会发现
feild变量也已经初始化了,请问这该怎么解释呢?  谢谢。

你的//静态初始化块实际上并非静态,没有加static,所以它只是个初始化块,才会出现你运行的结果,如果你在该块前面加了static,是不能通过编译的。静态初始化引用的静态变量,必须在其前面先定义。
79 楼 zhb2432 2009-08-10  
看完 收益非浅!!! 支持楼主 
78 楼 liliugen 2009-06-22  
继承体系的类加载,static型的不管是static变量,还是static代码块都是属于类的.顺序嘛谁在前面先初始化谁.
类加载完毕,才会开始准备生成继承体系的对象,从顶层类开始Object,非static变量,非static代码块,构造器的调用,一个父类的对象出来了,处于可用状态,马上开始下一级的对象的生成工作,一直到没有子类的那个类的对象生成出来.
对象生成工作OVER!
H_eaven 写道
继承体系的类加载,static型的不管是static变量,还是static代码块都是属于类的.顺序嘛谁在前面先初始化谁.
类加载完毕,才会开始准备生成继承体系的对象,从顶层类开始Object,非static变量,非static代码块,构造器的调用,一个父类的对象出来了,处于可用状态,马上开始下一级的对象的生成工作,一直到没有子类的那个类的对象生成出来.
对象生成工作OVER!

  不错,编程思想的解释!
77 楼 zhangyou1010 2009-05-24  
博主写的不错,但我有个疑问。如果代码按下面那样写:

package Test;

public class TestInitOrder {
	
	//静态初始化块
	{
	
		System.out.println("静态初始化块");
		System.out.println(staticFeild);
	}
	
	//	静态变量
	public static String staticFeild = "静态变量";
	
	//变量
	public String feild = "变量";
	
	//初始化块
	{
		System.out.println(feild);
		System.out.println("初始化块");
	}
	
	//构造器
	TestInitOrder() {
		System.out.println("构造器");
	}
	public static void main(String args[]) {
		new TestInitOrder();
	}

}


debug的时候停在System.out.println("静态初始化块");这一行,会发现staticFeild 已经初始化了,按照博主的说法,静态变量和静态初始化块,初始化得次序是按他们在代码中定义的顺序来的,那这样就有矛盾了啊?


另外如果代码这样写:
package Test;

public class TestInitOrder {
	
	//变量
	public String feild = "变量";
	
	//静态初始化块
	{
	
		System.out.println("静态初始化块");
		System.out.println(staticFeild);
	}
	
	//	静态变量
	public static String staticFeild = "静态变量";
	

	
	//初始化块
	{
		System.out.println(feild);
		System.out.println("初始化块");
	}
	
	//构造器
	TestInitOrder() {
		System.out.println("构造器");
	}
	public static void main(String args[]) {
		new TestInitOrder();
	}

} 

debug停在 System.out.println("静态初始化块");这一行,会发现
feild变量也已经初始化了,请问这该怎么解释呢?  谢谢。
76 楼 xinsrxh 2009-05-23  
不错不错,收益非浅
75 楼 shen0405247 2009-05-06  
以前 不是很清楚,看了你的文章 清晰多了
74 楼 usiboy 2009-02-03  
非常不错的一篇文章,支持楼主!
73 楼 brilliant2008 2009-01-29  
感谢楼主,牛年更牛
72 楼 77595009 2009-01-02  
谢谢,您归纳的很好,读后很受益
71 楼 makai512 2008-12-15  
70 楼 walsh 2008-12-11  
楼主写的真详细,谢谢楼主!
69 楼 liu8899 2008-11-05  
学习学习了,楼主大 好人
68 楼 ludaojuan21 2008-10-23  
拜读了,楼主辛苦,谢谢! !
67 楼 xuejianshan 2008-10-08  
面试正需要~~

相关推荐

    JAVA面试题解惑系列——类的初始化顺序

    总结来说,对于Java面试中常出现的关于类初始化顺序的问题,开发者应当掌握以下几点: 1. 单个类内成员的初始化顺序:静态变量、静态初始化块、变量、初始化块、构造器。 2. 在继承关系中,子类的静态成员会在父类...

    JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看.pdf,这是一份不错的文件

    JAVA面试题解惑系列(一)——类的初始化顺序 JAVA 是一门面向对象的编程语言,类的初始化顺序是 JAVA 程序员和 JAVA 工程师面试中一个非常重要的知识点。本文将详细讲解类的初始化顺序,并提供了相关的测试代码,...

    臧圩人--JAVA面试题解惑系列合集.pdf

    **1.1 JAVA面试题解惑系列(一)——类的初始化顺序** - **知识点**:类的初始化顺序涉及静态变量、静态初始化块、实例变量、实例初始化块及构造器的执行顺序。在继承关系中,父类的初始化先于子类进行,且静态部分...

    JAVA面试题解惑系列合集

    1.1 JAVA面试题解惑系列(一)——类的初始化顺序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3 1.2 JAVA面试题解惑系列(二)——到底创建了几个String对象? . . . . . ....

    JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看.pdf

    "子类--构造器"); } public static void main(String[] args) { new SubClass(); } } 当我们运行这段代码时,会看到以下输出...所以,对于Java程序员和工程师来说,掌握类的初始化顺序是非常基础且重要的知识点。

    JAVA面试题解惑系列.doc

    《JAVA面试题解惑系列——类的初始化顺序》 在Java编程中,理解类的初始化顺序是面试中常见的考察点,因为它直接关系到程序的执行逻辑。本文将深入探讨类的初始化过程,以及在继承场景下如何理解这个过程。 首先,...

    经典JAVA面试题解惑系列合集

    JAVA面试题解惑系列(一)——类的初始化顺序 在Java编程语言中,理解类的初始化顺序是非常重要的,尤其是在涉及继承的情况下。本节将详细介绍类初始化的规则,并通过实例来帮助理解。 ##### 类的初始化顺序规则 ...

    JAVA面试题解惑系列.pdf

    ### Java面试题解惑系列——类的初始化顺序详解 #### 背景介绍 在Java面试过程中,关于类的初始化顺序的问题是常见的考察点之一。此类问题通常涉及到类的加载机制、静态变量与实例变量的区别、初始化块的作用及执行...

    ‘’JAVA面试题解惑系列.doc

    《JAVA面试题解惑系列——类的初始化顺序》 在Java面试中,关于类的初始化顺序是一个常见的考点。深入理解这一概念,对于成为一名合格的Java开发者至关重要。在Java中,类的初始化顺序遵循一定的规则,这包括静态...

    JAVA面试题解惑系列by(zangweiren)

    ### JAVA面试题解惑系列——类的初始化顺序 #### 一、基础知识回顾 在Java编程中,类的初始化顺序是一个非常重要的概念,特别是在面试时,它经常被用来考察面试者对于Java类加载机制的理解程度。类的初始化顺序...

    JAVA面试题解惑系列合集.docx

    ### JAVA面试题解惑系列知识点总结 #### 一、类的初始化顺序 **知识点概述:** 在Java中,类的初始化顺序是一个常见的面试问题。它主要涉及到类成员(包括静态和非静态)的加载和初始化过程。理解这些基础知识有助...

Global site tag (gtag.js) - Google Analytics