`
cobo85
  • 浏览: 116970 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA中类的加载及对象初始化顺序

    博客分类:
  • J2SE
阅读更多

      前段时间在做单例的时候遇到一个很奇怪的问题,前面已经初始化的参数,已经有值了,但是等到对象建立却发现值却为null了,随便debug跟踪下看看到底是怎么回事。

   

   解释示例代码如下

public class Demo {
	private static int i=0;
	private static  String msg ="";
	private static Demo d=new Demo();//这样写确实很怪异,只是为说明顺序而写在这里
	
    private static  String DRIVER=null;
	
	private static  String URL=null;
	
	private static  String USERNAME=null;
	
	private static  String PASSWORD=null;
	
	private   String demoString="abc";
	
	static{
		System.out.print("执行了类的静态块,在类的静态块里面为USERNAME赋值----");
		USERNAME="USERNAME";
		//do something
		System.out.print("类加载时,因DRIVER在d后声明,后经DRIVER声明后值为"+DRIVER);//此时DRIVER值为null
		System.out.print("   USERNAME为:"+USERNAME+"--------");//USERNAME为USERNAME
		System.out.println("类加载时不对非静态的属性进行加载,因此demoString在此不可用");
		//System.out.println(demoString);类加载时不对非静态的属性进行加载,因此demoString在此不可用
	}
	
	public Demo(){
		System.out.print("调用了构造函数,在构造函数中为DRIVER赋值------");
		DRIVER="DRIVER";
		//do something
		i++;
		if(i==1) msg="类加载初始化属性时,因声明d是一个Demo对象调用了构造函数因此";
		else msg="产生对象时,因类加载时已经执行过USERNAME初始化,且产生对象又调用了构造函数,因此";
		
		System.out.print(msg+"DRIVER为:"+DRIVER);//此时DRIVER值为DRIVER
		System.out.print("   USERNAME为:"+USERNAME+"-----");//USERNAME为null
		
		System.out.println("构造函数时对象开始产生,非静态的属性被解释"+demoString);//构造函数时对象开始产生,非静态的属性被解释
	}
	
	public String test() {
		//do something 类加载和产生对象时不会执行,当调用时才执行
		return null;
	}
	
	public static String test1() {
		//do something 类加载和产生对象时不会执行,当调用时才执行
		return null;
	}
}

   测试代码

 

public class XmlMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
                              Demo dd=new Demo();
       }
}

打印结果:

调用了构造函数,在构造函数中为DRIVER赋值------类加载初始化属性时,因声明d是一个Demo对象调用了构造函数因此DRIVER为:DRIVER   USERNAME为:null-----构造函数时对象开始产生,非静态的属性被解释demoString=abc
执行了类的静态块,在类的静态块里面为USERNAME赋值----类加载时,因DRIVER在d后声明,后经DRIVER声明后值为null   USERNAME为:USERNAME--------类加载时不对非静态的属性进行加载,因此demoString在此不可用
调用了构造函数,在构造函数中为DRIVER赋值------产生对象时,因类加载时已经执行过USERNAME初始化,且产生对象又调用了构造函数,因此DRIVER为:DRIVER   USERNAME为:USERNAME-----构造函数时对象开始产生,非静态的属性被解释demoString=abc

 

 

上面的代码基本上可以展示一个类从加载到产生对象的先后顺序,类加载时:静态属性顺序执行到静态代码块,产生对象时按非静态属性到执行构造函数顺序执行,至此一个对象完整产生。

分享到:
评论

相关推荐

    java程序初始化顺序

    在Java编程语言中,程序初始化的顺序是一个关键概念,它涉及到类加载、对象创建以及执行流程的安排。了解这些顺序对于编写高效、无错误的...在实际项目中,合理利用初始化顺序可以帮助我们优化资源加载,提高程序性能。

    java面试题-类的初始化顺序.doc

    类--初始化块"); 39. } 40. // 构造器 41. public SubClass() { 42. System.out.println("子类--构造器"); 43. } 44. 45. public static void main(String[]...因此,掌握类的初始化顺序是每个Java开发者必备的知识点。

    Java类继承初始化顺序

    当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...

    java中类的初始化顺序

    ### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...

    详解Spring 中如何控制2个bean中的初始化顺序

    Spring 中控制 2 个 bean 的初始化顺序 在 Spring 框架中,控制多个 bean 的初始化顺序是一个常见的问题。本篇文章将详细介绍如何控制 2 个 bean 的初始化顺序,提供了多种实现方式,并分析了每种方式的优缺。 ...

    探究java的ClassLoader及类变量初始化顺序

    Java中,类变量(static变量)的初始化顺序遵循以下规则: 1. 首先,执行父类的静态初始化块(方法),如果有的话。 2. 然后,执行子类的静态初始化块。 3. 静态变量的初始化顺序取决于它们在代码中声明的顺序,而...

    java代码的初始化顺序demo

    总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...

    Java静态初始化块和对象初始化块

    在Java编程语言中,初始化块是程序执行时用于初始化对象或类的重要机制。这里我们将深入探讨两种类型的初始化块:静态初始化块(Static Initializer Block)和对象初始化块(Instance Initializer Block)。这两种...

    Java初始化顺序1

    Java 中的初始化顺序是按照定义的顺序进行的,而静态变量的初始化顺序则是按照定义的顺序,并且只在第一次访问时初始化。 Java 初始化顺序的知识点总结: * 类变量(静态变量)和实例变量(对象变量)的区别 * ...

    Java类加载器:静态变量初始化.docx

    在本文中,我们讨论了 Java 类加载器中的静态变量初始化机制,了解了静态变量的初始化顺序和类加载器的生命周期。通过对静态变量初始化机制的理解,我们可以更好地掌握 Java 语言的基础知识,并更好地应用 Java 语言...

    java对象的初始化顺序[参考].pdf

    Java对象的初始化顺序是一个关键的编程概念,它涉及到类加载、静态初始化、实例初始化等多个步骤。下面我们将详细探讨这些步骤。 首先,当程序运行并创建一个新的对象时,JVM(Java虚拟机)会按照特定的顺序来初始...

    Java中对象初始化顺序的详细介绍

    这种情况下,初始化顺序如下:首先,`Lower`类的实例创建并分配默认值,然后调用`Upper`的构造器,接着执行`Initializer.initialize()`,该方法根据对象的实际类型(`Lower`)来设置字段的值。 5. **默认值**:即使...

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

    在Java中,类的初始化顺序是一个经常被问及的面试题目,尤其对于Java程序员和工程师来说,了解这个知识点是必须的。在Java中,类的初始化顺序是面试中的经典问题之一,它涉及到继承、静态成员以及实例成员等多个方面...

    Java类加载初始化的过程及顺序

    Java类加载初始化的过程是Java编程语言中一个重要的概念,它决定了Java类的加载和初始化顺序。在Java中,类的加载是通过类加载器(ClassLoader)来实现的。类加载器会将类的字节码文件(.class)加载到Java虚拟机...

    java类中静态域、块,非静态域、块,构造函数的初始化顺序

    ### Java 类中静态域、块,非静态域、块,构造函数的初始化顺序 #### 一、概述 在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块...

    对象初始化流程梳理对象初始化流程梳理

    Java中的对象初始化流程是编程实践中一个非常重要的概念,它涉及到类加载、静态初始化块、实例初始化块、构造器等多个方面。下面将详细解释这个过程。 首先,对象初始化流程的起点是程序的入口点,即`main`方法。当...

    java类中元素初始化顺序详解

    在 Java 中,类的元素初始化顺序遵循以下规则: 1. **静态变量与静态初始化块**: 首先,Java 解释器会执行类中的静态变量初始化和静态初始化块。这些静态元素的初始化只会在类加载时执行一次,并且按照它们在源...

    C++和Java初始化顺序的比较代码

    在Java中,初始化顺序则有所不同: 1. 基本类型的静态字段和引用类型的静态字段(如果它们是常量,即final且已初始化):这些字段在类加载时按声明顺序初始化。 2. 静态初始化块:当类第一次被加载时执行,按块的...

Global site tag (gtag.js) - Google Analytics