`
len-len
  • 浏览: 22256 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java中在创建对象时候的初始化顺序

    博客分类:
  • java
阅读更多

    最近由于工作空闲时间较多(不是酱油哦),闲暇之余,想多学习点java的基础知识。目的嘛,说的大点,就是增加自己的知识的深度。因为目前java的开发人员,很多都处于一个很低层次的水平,完全的code+copy,缺乏对基础知识的掌握,也就完全成为了“码工”,很有必要对基础知识充充电,在以后换工作,面试的时候也许让面试官刮目相看,至少让别人看到了你不只是会code,还有对java的基础理解,面向对象的理解。废话不多说了,进入正题。
    今天想说说java在创建对象的时候的初始化顺序,其实大家如果笔试,或者面试的时候,经常会遇到一些初始化的问题,反正我是遇到过。今天我们就来看看。

    先看下我写的几个示例类,一个父类,一个子类继承这个父类,最简单的模式。

/**父类*/
package test;
public class Father {
	static
	{ System.out.println("父类静态初始化块");}
	{ System.out.println("父类初始化块");      }
	private static int b = 1;
	public Father() {
		System.out.println("调用了父类无参构造器");
	}
	public Father(int b) {
		this.b = b;
		System.out.println("调用父类的有参构造器");
	}
}
/**子类*/
package test;
public class Son extends Father {
	static
	{ System.out.println("子类静态初始化块"); }
	{ System.out.println("子类初始化块");       }
	private static int a =1;
	public Son() {
		System.out.println("调用子类的构造器");
	}
	public Son(int a){
		this.a=a;
		System.out.println("调用子类的有参构造器");
	}
}

  •    单独的一个对象初始化,不含继承和其他情况

package test;
public class Test {

	public static void main(String[] args) {
		Father father = new Father();
	}
}

 

    打印的结果为:

    父类静态初始化块

    父类初始化块

    调用了父类无参构造器

 

    我们来分析下,大家都知道静态对象(包括静态块,静态方法,静态属性),都是和类相关联的。当第一次创建对象的时候,首先初始化的应该是静态对象,然后才是非静态对象,最后才是构造器去创建实例。所以大致的顺序应该是:静态对象-非静态对象-构造器。那么在静态对象或者非静态对象中是否也存在一个什么顺序呢?经过测试,我们发现其实在同等的优先级的情况下,是按照声明的顺序初始化的。

  • 包含继承的子类初始化

下面讨论另外一个问题,设计到继承的问题,我们现在创建Son对象,他会执行父类的一些初始化么,他和子类的一些初始化之间又存在什么关联呢?

 

package test;
public class Test {
	public static void main(String[] args) {
		Son son = new Son();
	}
}
 

   打印语句:

    父类静态初始化块

   子类静态初始化块

   父类初始化块

   调用了父类无参构造器

   子类初始化块

   调用子类的构造器

  打印语句告诉了我们,静态对象依然是第一个初始化的,然后呢?就是父类中的非静态对象-构造器,子类中的非静态对象-构造器。

  • 包含继承和多态的子类初始化

  再看如果是多态的情况下会有什么情况出现呢?

 

package test;

public class Test {

	public static void main(String[] args) {
		Father father = new Son();
	}
}

 打印语句:

     父类静态初始化块

     子类静态初始化块

     父类初始化块

     调用了父类无参构造器

     子类初始化块

     调用子类的构造器

和前面继承的情况完全一样,这里不再啰嗦了。

 

总的一个结论就是:静态对象总是在第一次创建对象前就已经初始化完毕,初始化的顺序从最顶端的父类到子类,只会初始化一次。然后就是从父类到子类中,依次初始化非静态对象和构造器。

 

 

30
6
分享到:
评论
13 楼 netwelfare 2015-06-07  
分析的不错,关于对象初始化的过程有很多,从网上看到一篇文章,推荐看看:Java对象的初始化过程研究与探索
12 楼 当时年轻 2012-10-28  
   
11 楼 xueji5368 2012-05-28  
原来如此,难怪每次都不知道是怎么运行的。看来得好好补补基础了。
10 楼 jazzmozart 2012-04-07  
学习下楼主的分享
9 楼 huqiji 2012-04-07  
不错,谢谢
8 楼 蚂蚁路过 2012-04-06  
学习了··
7 楼 乱_战 2012-04-06  
不错,学习了
6 楼 fackyou200 2012-04-06  
留个脚印...
5 楼 chenyunhong 2012-04-06  
不错,学习了!
4 楼 hgj0521 2012-02-24  
路过,留下个脚印,。
3 楼 zhumeilian 2012-02-21  
2 楼 taoge2121 2012-02-20  
挺不错的……
1 楼 yangnanenana 2012-02-20  
学习了!关注~

相关推荐

    java程序初始化顺序

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

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

    在实际开发中,理解这个初始化顺序是非常重要的,尤其是在设计复杂的类结构或者涉及单例模式、线程安全初始化等场景时。如果在构造器或初始化块中依赖其他静态或非静态成员,必须确保这些成员在需要之前已经被正确...

    Java类继承初始化顺序

    在Java编程语言中,类继承是面向对象设计的一个核心特性,它允许我们创建一个新类(子类)作为现有类(父类)的扩展。当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、...

    java代码的初始化顺序demo

    让我们深入探讨Java中的初始化顺序及其背后的机制。 1. **类加载阶段**: 在Java程序运行时,JVM会先加载类的字节码文件(.class文件)。这个过程包括加载、验证、准备、解析和初始化五个步骤。这里我们主要关注...

    java中类的初始化顺序

    在Java中,类的初始化顺序遵循一定的规则: 1. **静态成员变量的初始化**:当类被加载到JVM中时,静态成员变量首先被初始化。 2. **静态初始化块的执行**:紧随静态成员变量之后,静态初始化块被执行。 3. **父类...

    Java初始化顺序1

    在 Java 中,实例变量的初始化顺序是按照定义的顺序进行的,而静态变量的初始化顺序则是按照定义的顺序,并且只在第一次访问时初始化。 在上面的示例代码中,我们可以看到,类变量和实例变量的初始化顺序是按照定义...

    类继承的初始化顺序类,继承的初始化顺序

    在面向对象语言中(如Java、C#等),当创建一个继承自某个基类的子类对象时,会有一个特定的初始化顺序。这个顺序通常遵循以下步骤: 1. **基类静态成员初始化**:如果基类中有任何静态成员,则会在程序启动时按照...

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

    总之,理解并有效地使用静态和对象初始化块是Java开发中的关键技能,它们可以帮助我们更好地控制类和对象的初始化过程,确保代码的高效性和正确性。在实际编程中,我们应该根据需求谨慎选择合适的初始化策略,以优化...

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

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

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

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

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

    在Java编程语言中,对象初始化是一个关键的概念,它涉及到类加载、对象实例化以及成员变量的赋值。本文将深入探讨Java中对象初始化的顺序,帮助开发者理解这一过程的细节。 首先,Java类的加载过程分为三个阶段:...

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

    在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块、非静态块以及构造函数时,明确它们的初始化顺序有助于避免潜在的编程错误。 ...

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

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

    Java初始化块Java初始化块.doc

    普通初始化块在创建对象时会被隐式调用,并且在执行构造器之前运行。这意味着,如果你在类中有多个初始化块,它们将按照它们在代码中的顺序依次执行。初始化块可以用于设置对象的初始状态,特别是当某些初始化逻辑...

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

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

    学习java静态数据初始化.doc

    在 Java 中,静态变量的初始化顺序是按照它们在类中的定义顺序进行的。如果一个静态变量依赖于另一个静态变量的值,那么这两个变量的初始化顺序是重要的。 在给定的代码中,我们可以看到有多个静态变量的声明和初始...

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

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

    JAVA类的初始化顺序文.pdf

    子类 --构造器 这个输出揭示了在继承关系中类的初始化顺序: 1. **静态成员和静态初始化块**:首先,会按照父类到子类的顺序初始化静态变量和执行静态初始化块。在上面的例子中,"父类 --静态变量" 和 "子类 --静态...

    Java变量初始化

    Java 变量初始化的时机是指在 Java 语言中变量的初始化过程,包括变量的声明、初始化和赋值的步骤。 Java 变量声明 在 Java 语言中,每个变量必须先声明,然后才能使用。声明变量时必须指定该变量的数据类型。...

Global site tag (gtag.js) - Google Analytics