题目1:证明,即使不为子类创立构造器,编译器也会为你合成一个默认的构造器,该构造器将调用基类的构造器。
package iteye; public class child extends father { public static void main(String []args) { child c=new child(); } } class father { public father(){ System.out.println("I am father‘s constructor"); } }
?输出:
I am father‘s constructor
?题目2:证明基类构造器(a)总会被调用;(b)在导出类构造器之前被调用
package iteye; public class child extends father { public child(){ System.out.println("I am child‘s constructor"); } public static void main(String []args) { child c=new child(); } } class father { public father(){ System.out.println("I am father‘s constructor"); } }
?输出为:
I am father‘s constructor I am child‘s constructor
?题目3:创建两个带有默认构造器的类A和类B。从A中继承产生一个名为C的新类,并在c内创建一个B类成员,不要给C编写构造器,创建一个C类的对象并且观察结果。
package iteye; public class C extends A { B b=new B(); public static void main(String []args) { C c=new C(); } } class A { public A(){ System.out.println("I am A‘s constructor"); } } class B { public B(){ System.out.println("I am B‘s constructor"); } }
?输出为:
I am A‘s constructor I am B‘s constructor
?这是一个最简单的demo,但是这个demo涉及到类加载顺序的问题。
加载流程是这样的:
(1)入口方法是C类的main方法,运行之前需要把C类加载进内存,加载的时候发现C类继承自父类A所以要先把A类加载进内存。所以第一步是初始化A类的类变量和静态块。
(2)初始化C类的类变量和静态块。
(3)执行main函数
(4)第一行是创建一个C的实例,先初始化A的实例变量
(5)调用A的构造函数
(6)初始化C的实例变量
(7)调用C的构造函数
原文:http://buptchj.iteye.com/blog/2249168