`
talentluke
  • 浏览: 604735 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JAVA类的初始化顺序(静态变量,静态模块,变量,模块,构造器)

 
阅读更多
package com.luke.java;

/**
 *@descripton 
 *@author               luke
 *@time                 2012-7-20:下午02:13:27
 *@version                       
 */
public class ClassA
{

	/**
	 * <p>Title: </p>
	 * <p>Description: </p>
	 */
	
	public ClassA(String msg)
	{
		super();
		// TODO Auto-generated constructor stub
		System.out.println(msg + " in ClassA");
	}

}

 package com.luke.java;

/**
 *@descripton 
 *@author               luke
 *@time                 2012-7-20:下午02:14:12
 *@version                       
 */
public class ClassB
{
	public ClassB(String msg)
	{
		super();
		// TODO Auto-generated constructor stub
		System.out.println(msg + " in ClassB");
	}

}

 package com.luke.java;

/**
 *@descripton 
 *@author               luke
 *@time                 2012-7-20:下午02:12:57
 *@version                       
 */
public class Parent
{
	private static ClassA classA = new ClassA("parent static classA");
	
	static
	{
		System.out.println("parent static block");
	}
	
	
	private int i = 10;
	
	{
		System.out.println("parent common block");
		
	}
	
	private ClassB classB = new ClassB("parent common classB");
	
	public Parent(int i)
	{
		this.i = i;
		System.out.println("parent constructor");
	}
	
	public void callInnerClass()
	{
		InnerClass innerClass = new InnerClass();
	}
	
	protected static class InnerClass
	{
		private static ClassA classA = new ClassA("parent InnerClass static classA");
		
		static
		{
			System.out.println("parent InnerClass static block");
		}
		
		
		private ClassB classB = new ClassB("parent InnerClass common classB");
		
		{
			System.out.println("parent InnerClass common block");
			
		}
		
		public InnerClass()
		{
			System.out.println("parent InnerClass constructor");
		}
	}

}

 package com.luke.java;

/**
 *@descripton 
 *@author               luke
 *@time                 2012-7-20:下午02:21:19
 *@version                       
 */
public class Child extends Parent
{
	private static ClassB classB = new ClassB("child static classB");

	static
	{
		System.out.println("child static block");
	}

	private ClassA classA = new ClassA("child common classA");
	
	private int j = 20;


	{
		System.out.println("child common block");

	}

	public Child(int i, int j)
	{
		super(i);
		// TODO Auto-generated constructor stub
		this.j = j;
		System.out.println("child constructor");
	}
	
	public void callInnerClass()
	{
		//Parent.InnerClass innerClass = new Parent.InnerClass();//如果Parent的InnerClass设置成private就不能引用
		InnerClass innerClass = new InnerClass();
	}
	
	private static class InnerClass
	{
		private static ClassA classA = new ClassA("child InnerClass static classA");
		
		static
		{
			System.out.println("child InnerClass static block");
		}
		
		
		private ClassB classB = new ClassB("child InnerClass common classB");
		
		{
			System.out.println("child InnerClass common block");
			
		}
		
		public InnerClass()
		{
			System.out.println("child InnerClass constructor");
		}
	}

}

 package com.luke.java;

/**
 *@descripton 
 *@author               luke
 *@time                 2012-7-20:下午02:12:36
 *@version                       
 */
public class LoadOrderTest
{

	/**
	 *@description
	 *@param
	 *@return                void 
	 *@author                luke
	 *@time                  2012-7-20:下午02:12:36
	 *@version
	 */

	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		/*
		 * 输出结果如下
		 * 
		   parent static classA in ClassA
           parent static block
           parent common block
           parent common classB in ClassB
           parent constructor
           parent InnerClass static classA in ClassA
           parent InnerClass static block
           parent InnerClass common classB in ClassB
           parent InnerClass common block
           parent InnerClass constructor 
		 * */
		Parent parent = new Parent(60);
		parent.callInnerClass();
	
		/*
		 * 输出结果如下
		 * 
		   parent static classA in ClassA
           parent static block
           child static classA in ClassB
           child static block
           parent common block
           parent common classB in ClassB
           parent constructor
           child common classA in ClassA
           child common block
           child constructor
           child InnerClass static classA in ClassA
           child InnerClass static block
           child InnerClass common classB in ClassB
           child InnerClass common block
           child InnerClass constructor

		 * */
		Child child = new Child(30, 40);
		child.callInnerClass();
		

	}

}

 

 

 说明 :

1.静态变量与静态模块是最先初始化的,它是属于进程的静态常量区

2.Parent的构造器要先于它的子类,这一点是肯定的,但Parent的变量,初始化模块要先于它的子类,构造器可能涉及到类变量操作,所以既然先初始化了父类的构造器,那父类的成员变量也当然要先构造

3.静态变量与静态模块的初始化顺序是根据在类里面定义的顺序,同理变量化初始化模块的顺序也是根据类里面定义的顺序

4.内部静态类在用的时候才会初始化

先父类后子类;

先静态,再初始化,最后构造函数;

父类静态变量(静态初始化块)(按类定义顺序)> 子类静态变量(静态初始化块)(按类定义顺序)>父类普通变量(普通初始化块)(按类定义顺序)>父类构造方法>父类普通方法>子类普通变量(普通初始化块)(按类定义顺序)>子类构造方法>子类普通方法

分享到:
评论

相关推荐

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    java程序初始化顺序

    - 静态初始化块(static{}):如果类中存在静态初始化块,该块的代码会在类加载后的准备阶段执行,用于初始化静态变量或执行其他静态设置任务。 - 静态变量的赋值:接着,静态变量会被赋予它们的初始值,这可以是...

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

    这个顺序表明,无论类之间的继承关系如何,初始化顺序始终是:静态变量和静态初始化块先于非静态成员。在创建对象时,父类的初始化先于子类。这是Java语言规范所规定的,确保在子类访问父类的静态或非静态成员时,...

    Java类继承初始化顺序

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

    Java变量初始化

    这也很容易理解,因为类变量是类加载的时候执行的初始化,且只执行一次,而调用构造器是对象实例化执行的,每实例化一次对象,执行一次。 总结 Java 变量初始化是 Java 语言的基础知识点之一。变量的初始化过程...

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

    首先,需要了解Java类初始化的基本规则,即在类的静态变量、静态初始化块、变量、初始化块、构造器这五个部分中,它们的初始化顺序依次是:静态变量、静态初始化块、变量、初始化块、构造器。这个顺序在单个类中是...

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

    同时,掌握类变量初始化顺序可以避免因误解而导致的错误,特别是在多线程环境中,对静态变量的并发访问和初始化顺序的控制需要特别注意。 总之,深入理解Java的ClassLoader机制和类变量初始化顺序是提升Java编程...

    Java初始化顺序1

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

    java代码的初始化顺序demo

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

    Java中static静态变量的初始化完全解析

    Java中的静态变量(static变量)是在类加载时初始化的,而不是在对象创建时。静态变量属于类,而不属于任何特定的对象,因此它们是共享的,所有类实例都可以访问。了解静态变量的初始化顺序对于理解和避免潜在的编程...

    java中静态与非静态的变量定义与使用

    在 `Table` 类和 `Cupboard` 类的构造器中,可以看到静态变量的初始化会导致它们关联的实例方法 `f()` 被调用。例如,`Table` 类的构造器在创建静态变量 `b2` 时调用了 `b2.f(1)`,这将打印出 "f(1)"。同样,`...

    JAVA类的初始化顺序文.pdf

    1. **静态成员和静态初始化块**:首先,会按照父类到子类的顺序初始化静态变量和执行静态初始化块。在上面的例子中,"父类 --静态变量" 和 "子类 --静态变量" 先被初始化,然后分别执行对应的静态初始化块。 2. **...

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

    在 JAVA 中,类的初始化顺序可以分为四个阶段:静态变量、静态初始化块、变量、初始化块和构造器。其中,静态变量和静态初始化块的初始化顺序是最高的,接着是变量和初始化块,最后是构造器。 在了解类的初始化顺序...

    java 构造器的调用

    总结,Java中的构造器是至关重要的,它们负责对象的初始化,包括设置成员变量的初始值。了解和掌握构造器的调用、初始化、默认构造器、继承中的构造器调用以及构造器重载等概念,是编写高质量Java代码的基础。通过...

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

    3. **父类的非静态部分**:在创建子类实例时,首先执行父类的非静态变量初始化和非静态初始化块,然后调用父类的构造器。 4. **子类的非静态部分**:最后执行子类的非静态变量初始化和非静态初始化块,以及子类的...

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

    2. 非静态数据成员:在构造函数初始化列表中,成员变量按照它们在类声明中的顺序被初始化。即使初始化列表中的顺序不同,也会按照声明的顺序进行。 例如: ```cpp class MyClass { public: int a; int b; static...

    Java成员变量局部变量静态变量成员方法全局方法等概念的区

    它们在类加载时初始化,并且在整个程序运行期间都存在。 4. 成员方法(Member Methods): 成员方法是类中的函数,它们定义了对象的行为。成员方法可以访问和修改类的实例变量,也可以调用其他成员方法。成员方法...

    php 静态变量的初始化

    然而,如果你想要将静态变量初始化为一个对象,PHP并不支持像Java那样的静态构造器或静态初始化块。在这种情况下,你需要在代码的某个时刻显式地调用一个方法来完成初始化。例如: ```php class A { static ...

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

    在Java编程世界中,类的初始化顺序是理解面向对象编程概念的一个重要方面。尤其对于那些准备应对技术面试的Java程序员和工程师来说,掌握这一知识点是面试时的必备能力之一。本文将深入探讨Java中类的初始化顺序,...

Global site tag (gtag.js) - Google Analytics