标签:protect void body ons main 溢出 否则 完全 for
中午看Java编程思想,偶然间遇到一个关于构造器执行过程的问题。代码如下:
package reusing; class A { public A(int a) { System.out.println("A()"); } } class B { public B(int a) { System.out.println("B()"); } } class C extends A { public C() { super(10); System.out.println("C()"); } B b = new B(10); } public class E05_SimpleInheritance { public static void main(String args[]) { new C(); } } /* Output: A() B() C() */// :~
B()为什么会出现在中间呢?问了百老师,好像略微明白了所以然:
下面大部分笔记来自:http://tech.it168.com/j/2006-05-18/200605181021879.shtml
在定义一个类的时候,如果没有定义构造器,则会编译器默认定义一个无参构造器,如果手动定义了有参构造器,则不会编译器不会自动添加无参构造器。
子类构造器中总默认会调用父类构造器。但是,如果没有默认的父类构造器,或者想调用一个带参数的父类构造器,就必须用关键字super显式地调用父类构造器的语句。
在多层继承关系上,构造器的构建过程是从父类“向外”扩散的,所以父类在导出类构造器可以访问它之前,就已经完成了初始化。
public class Demo1 { public static void main(String[] args) { B8 b1 = new B8(); } } class A8{ public A8(int a){ System.out.println("A8 constructor"); } } class B8 extends A8{ public B8() { super(10); //,由于A8没有默认构造器,如果这行注释了,编译器会报错 System.out.println("B81"); } }
你必须在构造器的第一行放置super或者this构造器,否则编译器会自动地放一个空参数的super构造器的,其他的构造器也可以调用super或者this,调用成一个递归构造链,最后的结果是父类的构造器(可能有多级父类构造器)始终在子类的构造器之前执行,递归的调用父类构造器。
public class Object { ... public Object() {} ... } public class Employee extends Object { private String name; private double salary = 15000.00; private Date birthDate; public Employee(String n, Date DoB) { // implicit super(); name = n; birthDate = DoB; } public Employee(String n) { this(n, null); } } public class Manager extends Employee { private String department; public Manager(String n, String d) { super(n); department = d; } }
标签:protect void body ons main 溢出 否则 完全 for
原文地址:http://www.cnblogs.com/ming-zi/p/5987584.html