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

父子类初始化的顺序

阅读更多

自己测试了一下自己对父子类初始化的理解,发现了还是不是很准确的。以下是测试的结果。

父类

package com.java.parentandchild;

public class Parent {

	public static void sysOut() {
		System.out.println("我是父类的静态函数。");
	}
	public Parent(){
		System.out.println("我是父类的构造函数。");
	}
	static {
		System.out.println("我是父类的静态代码块。");
	}

}

 

子类

package com.java.parentandchild;

public class Child extends Parent {

	public static void sysOut() {
		System.out.println("我是子类的静态函数。");
	}
	public Child() {
		System.out.println("我是子类的构造函数。");
	}
	static {
		System.out.println("我是子类的静态代码块。");
	}

}

 

客户端(直接初始化子类)时(第一种情况)

package com.java.parentandchild;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// Parent parent = new Parent();
		System.out.println("============");
		Child child = new Child();
	}

}

 输出结果

============
我是父类的静态代码块。
我是子类的静态代码块。
我是父类的构造函数。
我是子类的构造函数。

而当客户端是先父类后子类时(第二种情况)

package com.java.parentandchild;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		 Parent parent = new Parent();
		System.out.println("============");
		Child child = new Child();
	}

}

 输出是:

我是父类的静态代码块。
我是父类的构造函数。
============
我是子类的静态代码块。
我是父类的构造函数。
我是子类的构造函数。

 以下是我对这个结果的理解。

 

第一种情况下:按照初始化顺序是先父类后子类,所以肯定是先执行父类的静态代码块,然后是父类的构造函数,子类的静态代码块,子类的构造函数。

第二种情况下:因为是先new一个父类的对象,所以肯定是先执行父类的静态代码块和构造函数。在new子类的对象时,因为前面已经对父类进行了new,所以直接对进行子类的静态代码块的初始化,然后是父类的构造函数,最后是子类的构造函数。

分享到:
评论
5 楼 lwhy830617 2010-04-12  
yangfuchao418 写道
yunmanfan 写道
wuyuhua 写道
顺序应该是父类的静态变量或者静态块、子类的静态变量或者静态块、父类的构造函数、子类的构造函数

至于第二种情况,应该父类初始化的时候已经将父类的静态变量初始化了,所以子类在初始化的时候就不需要初始化父类的静态变量了。

不晓的理解的对不对?

谢谢,我看了你的回复,觉得你说的有道理。
回复楼上,我做java也有四五年了,不过很少有这么抠这么细的时候。也谢谢你了,我的确是面试了几个人后发现这些问题的。

呵呵,不错,无意中闯入,完全赞成你说的


收益很多 希望LZ能允许我转载到我博客里做个学习资料
4 楼 yangfuchao418 2010-04-11  
yunmanfan 写道
wuyuhua 写道
顺序应该是父类的静态变量或者静态块、子类的静态变量或者静态块、父类的构造函数、子类的构造函数

至于第二种情况,应该父类初始化的时候已经将父类的静态变量初始化了,所以子类在初始化的时候就不需要初始化父类的静态变量了。

不晓的理解的对不对?

谢谢,我看了你的回复,觉得你说的有道理。
回复楼上,我做java也有四五年了,不过很少有这么抠这么细的时候。也谢谢你了,我的确是面试了几个人后发现这些问题的。

呵呵,不错,无意中闯入,完全赞成你说的
3 楼 yunmanfan 2009-06-22  
wuyuhua 写道
顺序应该是父类的静态变量或者静态块、子类的静态变量或者静态块、父类的构造函数、子类的构造函数

至于第二种情况,应该父类初始化的时候已经将父类的静态变量初始化了,所以子类在初始化的时候就不需要初始化父类的静态变量了。

不晓的理解的对不对?

谢谢,我看了你的回复,觉得你说的有道理。
回复楼上,我做java也有四五年了,不过很少有这么抠这么细的时候。也谢谢你了,我的确是面试了几个人后发现这些问题的。
2 楼 wuyuhua 2009-06-22  
顺序应该是父类的静态变量或者静态块、子类的静态变量或者静态块、父类的构造函数、子类的构造函数

至于第二种情况,应该父类初始化的时候已经将父类的静态变量初始化了,所以子类在初始化的时候就不需要初始化父类的静态变量了。

不晓的理解的对不对?
1 楼 炫速飞火 2009-06-21  
对,这个对于初学者来说要理解透,面试常问

相关推荐

    20.(vue3.x+vite)Vue子组件和父组件执行顺序.rar

    Vue的生命周期是每个组件从创建到销毁的过程,其中包括了初始化、挂载、更新和卸载等阶段。在父子组件的关系中,这种顺序对于协同工作和数据传递至关重要。 首先,我们来看Vue3.x的生命周期变化。Vue3引入了全新的...

    深入理解Vue父子组件生命周期执行顺序及钩子函数

    在此阶段,实例的属性和方法还未被初始化,因此在此钩子中无法访问data和methods中的数据和方法。 2. `created`:在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测(data observer),属性和...

    父子结点树转化为多级编码探讨与研究

    - **提高程序初始化速度**: 通过使用单条 SQL 语句实现编码转换,大大加快了程序初始化的速度,减少了编程的工作量。 - **增强可靠性**: 相比于编写复杂的程序来实现同样的功能,SQL 查询方式更加简洁、可靠。 - **...

    vue同步父子组件和异步父子组件的生命周期顺序问题

    在Vue框架中,父子组件的生命周期顺序是一个非常重要的概念,它关系到组件的挂载、数据初始化和销毁过程。特别是在动态引入组件时,生命周期的顺序会有所不同。下面我们将详细介绍同步引入和异步引入父子组件时,其...

    性能调优专题-jvm类加载机制-performance-jvmclassloader.zip

    其中,加载是读取.class文件,验证确保字节码安全,准备分配静态变量内存,解析绑定符号引用,初始化执行类的初始化方法。 4. **类的加载条件** 类的加载并非在程序启动时一次性完成,而是按需加载。只有当类被...

    类的继承与基类

    派生类的构造函数可能需要调用基类的构造函数来初始化继承自基类的成员。同样,析构函数负责清理派生类及基类的资源。在C++中,派生类的析构函数会自动调用基类的析构函数,确保资源的正确释放顺序。 #### 指针类型...

    Java基础复习笔记01数组_内存形式_父子_内存控制

    2. **初始化**: 对象的成员变量会被初始化为其默认值或通过构造方法设置的值。 3. **构造函数调用**: 构造函数被调用来进一步初始化对象的状态。 **类对象与实例对象** - **类对象**: 在Java中,每个类都有一个...

    sqlserver父子层次查询.pdf

    在`DeptTree`的定义中,基础部分是`select No,Name,parentNo,0 as Level,cast('0' as nvarchar(max)) as treepath from Port_Dept where No = '100'`,这选择出编号为'100'的部门作为起始节点,并初始化`Level`为0...

    Java虚拟机工作原理详解

    * Initializing:执行类的初始化方法,如静态变量赋值和静态块执行。 三、类加载器的特点 * 可见性限制:下层的加载器能够看到上层加载器中的类,反之则不行,也就是说委托只能从下到上。 * 不允许卸载类:类加载...

    Spring学习笔记系列之三

    - **Bean的初始化与销毁**:父子容器都会触发Bean的初始化方法(init-method)和销毁方法(destroy-method),但顺序不同,子容器的Bean会在父容器Bean之后初始化。 4. **自定义配置**: - **DispatcherServlet...

    Java后端日常个人学习笔记

    "17-SpringMVC源码—父子容器启动原理深入剖析-徐庶"这个文件很可能是详细分析了SpringMVC启动过程中的源代码,包括如何初始化容器,如何加载Bean定义,以及如何处理父子容器间的依赖关系。深入理解这部分内容可以...

    突破程序员基本功的16课.part2

    2.1.3 类变量的初始化时机 2.2 父类构造器 2.2.1 隐式调用和显式调用 2.2.2 访问子类对象的实例变量 2.2.3 调用被子类重写的方法 2.3 父子实例的内存控制 2.3.1 继承成员变量和继承方法的区别 2.3.2 内存...

    c.c++找工作面试重点结构图-mindmanager

    但仅仅用建立对象的最远派生类的构造函数调用虚基类的构造函数,而该派生类的所有基类中列出的对虚基类的构造函数的调用在执行中被忽略,从而保证对虚基类子对象只初始化一次。 (7) 在一个成员初始化列表中同时出现...

    JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】

    `oInit.InitSubTable`方法负责加载子表格,通常会通过Ajax请求获取子数据,并使用这些数据初始化新的Bootstrap Table。在这个过程中,我们可以设置子表格的URL、列定义等参数。 接下来,我们讨论行列调序。...

    树(孩子—兄弟链表表示)

    代码片段中包含了创建孩子—兄弟链表所需的关键函数,如初始化树、创建队列、队列操作(插入和删除)、以及创建树等。这些函数共同作用,完成了根据输入数据构建孩子—兄弟链表的任务。 #### 总结 孩子—兄弟链表...

    2023年北京圣思园java课堂笔记.doc

    这是Java初始化过程的一部分。 9. **super关键字**:super用于访问和调用父类的成员,包括构造方法。super()调用父类的构造方法,且必须是子类构造方法的第一条语句。 10. **继承的特性**:子类拥有父类的所有公有...

    classloader源码

    3. 类的加载:解析`.class`文件,创建`Class`对象,并执行初始化操作。 4. 安全性:`ClassLoader`如何配合Java的安全机制,防止恶意代码的执行。 5. 类的缓存:已加载的类会被缓存,避免重复加载,提高性能。 通过...

Global site tag (gtag.js) - Google Analytics