`
yunmanfan
  • 浏览: 91331 次
  • 性别: 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  
对,这个对于初学者来说要理解透,面试常问

相关推荐

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

    先附一张官网上的vue实例的生命周期图,每个Vue实例在被创建的时候都需要经过一系列的初始化过程,例如需要设置数据监听,编译模板,将实例挂载到DOM并在数据变化时更新DOM等。同时在这个过程中也会运行一些叫做生命...

    突破程序员基本功的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表格组件神器【二、父子表和行列调序】

    今天就结合Bootstrap table的父子表和行列调序的用法再来介绍下它稍微高级点的用法。 bootstrap table系列: JS表格组件神器bootstrap table详解(基础版) JS组件系列之Bootstrap table表格组件神器【终结篇】 JS...

    vue.js页面加载执行created,mounted的先后顺序说明

    ... ... 补充知识:关于Vue子组件data选项某个属性引用子组件props定义的属性的几点思考 ... 我们也都知道在Vue父子组件可以通过...在项目开发中,我们会遇到这种需求,页面初始化时,父组件通过接口拿到需要数据,然后拿到

    Spring.html

    --全局初始化参数--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> 4.在Servlet中使用WebApplicationContextUtils获取容器...

    ssh(structs,spring,hibernate)框架中的上传下载

     我们前面已经指出Oracle的Lob字段和一般类型的字段在操作上有一个明显的区别--那就是你必须首先通过Oracle的empty_blob()/empty_clob()初始化Lob字段,然后获取该字段的引用,通过这个引用更改其值。所以要完成对...

    java经典面试2010集锦100题(不看你后悔)

    B) 编译出错,数组ar[]必须初始化 C) 编译出错,Mine应声明为abstract D) 出现IndexOutOfBounds的异常。 题目17:c 下面关于抽象类描述错误的是:(选择1项) A) 抽象类的关键字是abstract,在抽象类中可以定义变量...

    css入门笔记

    必须是父子(有层叠嵌套的关系)结构 大部分的css效果是可以 2.优先级 1.浏览器默认样式 2.内部样式和外部样式(就近原则) 3.内联样式 4.!important; 绝对优先使用() 格式 p{ color:red !important; ...

    JAVA核心知识点整理(有效)

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................

Global site tag (gtag.js) - Google Analytics