`

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

阅读更多
removed.

请到博文下载PDF文件:http://zangweiren.iteye.com/blog/241218
105
9
分享到:
评论
46 楼 shiyouxu 2008-07-22  
45 楼 spacefly 2008-07-22  
很好啊,thinking in java 里我都没注意到有讲解如此详细
44 楼 yingxing007 2008-07-21  
早点出书吧!谢谢
43 楼 zhanjia 2008-07-20  
谢谢分享, 一年前对这些也挺清楚, 因为当时在学校有java课程, 对于基础知识看得比较多. 时隔一年, 现在倒是有些模糊了
42 楼 jiangli19192 2008-07-18  
这位哥们,总结得真是不错,
41 楼 zm2693450 2008-07-14  
好贴,顶起来
40 楼 臧圩人 2008-07-08  
回复 狂放不羁:
总结的很好,赞一个
39 楼 狂放不羁 2008-07-08  
静态代码为什么先于非静态代码这是因为静态代码是在类加载完毕后执行的,而加载类的顺序是先父类后子类,所以静态代码的执行是先执行父类的,然后执行子类的。对于非静态变量以及实例初始化块都是在构造函数里的代码执行前执行。所以静态代码是在类加载后执行,而实例代码是在构造函数执行前执行。但是当我们显示控制类加载的时候情况有点变化,显示加载可以有关两种方法:
第一种:利用forName方法
当我们查API文档就会发现forName方法有两种形式。分别如下:
public static Class<?> forName(String className)
throws ClassNotFoundException


public static Class<?> forName(String name,
boolean initialize,
ClassLoader loader)
throws ClassNotFoundException

第二个方法值得注意的就是第二个参数boolean initialize,如果我们把这个参数设置为false,那么当我们加载完类后就不会执行静态代码和静态的初始化动作。只有当我们new一个对象的时候才会初始化。而第三个参数是用来指明类的加载器的。
如果查看java.lang.Class类的源代码,上述两种方法最终都会调用Class类中的私有的native方法forName0(),此方法的声明如下:
private static native Class forName0(String name, boolean init , ClassLoader loader)
throws ClassNotFoundException;
所以当我们调用Class.forName(name )时,其实是在方法内部调用了:
forName0(name, true, ClassLoader.getCallerClassLoader());
当我们调用Class.forName(name, initialize, loader )的时候,实际上此方法内部调用了:
forName0(name, initialize, loader);

第二种:利用Class对象获取的ClassLoader装载。
此方法也是在实例化时才执行静态代码的执行。

综上所述可以总结如下:
1 对于隐式的加载(new一个对象和调用类的静态方法),静态代码是在类加载后立刻执行,而对于显示加载(第一种是用java.lang.Class的forName(String str)方法,第二种是用java.lang.ClassLoader的loadClass())就如同我上面所说,加载过程是可以由我们来控制的。
2 实例化代码执行是载构造函数执行之前,涉及到继承时,父类的构造函数执行之前执行父类里的实例化代码,子类的构造函数执行之前执行子类的实例化代码。所以这样可以保证子类中用到的变量都是已经经过父类初始化的,从而保证了初始化的正确性。
                   

呵呵,这些是我学习J2SE的时候总结的,今天和大家分享。
38 楼 臧圩人 2008-07-06  
回复Unmi:
你的建议很好
学习任何东西都有一个由浅入深的过程,能够掌握的广泛和深入固然好,不过有时候够用也是一个不错的标准
37 楼 Unmi 2008-07-06  
实际上你理解了内存中的对象模型就用不着这样的长篇累椟,这也是java人相比与c++人员的一种缺陷,逃避了对内存,指针的感性理解,有些问题,譬如,转型,以及如上的类的初始化顺序反而把自己搞糊涂了。
36 楼 spiritfrog 2008-07-05  
引用

那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序

对于这个,应该不算是规律, 它们的先后顺序,是由你变量的初始化顺序决定的。
倒是lz没有提出为什么静态变量会先初始化。
35 楼 spiritfrog 2008-07-05  
感觉lz这个系列对面试帮助确实很大, 也加深了基础的理解。
支持!
34 楼 sooo 2008-07-04  
支持这样的文章
33 楼 weidewei 2008-07-01  
给大家最简单的记忆方法:
先静态后动态
先定义后构造函数


四个顺序,很好记吧! 
32 楼 yinleiyoung 2008-07-01  
言简意赅,让我茅塞顿开。
为什么有人说错了?
31 楼 dmewy 2008-07-01  
你真是大错特错...
完全错误..
30 楼 yang_rabbit 2008-07-01  
学习了,谢谢
29 楼 naff 2008-07-01  
good!!!!
28 楼 andy54321 2008-06-30  
好的,
清晰明了,
明白了许多
27 楼 zzg2008 2008-06-30  
讲解得很清晰很透彻,学习了。

相关推荐

    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