2009-11-04 77 views
0

在以下代码:派生构造

import java.io.*; 

public class MyClass1 
{ 
    MyClass1() 
    { 
     System.out.println("base class"); 
    } 
    public void print() 
    { 
     System.out.println("base print"); 
    } 
} 

class ChildClass extends MyClass1 
{ 
    public ChildClass() 
    { 
     System.out.println("child class"); 
    } 
    public void print() 
    { 

     System.out.println("child print"); 
    } 
} 

为什么是它,当我创建类型的实例ChildClass也执行的基类的构造函数??

回答

2

因为那正是应该发生的:-)

派生的类使用的基类为基础。在OO中说它is-a基类。该基类也需要初始化,因此必须调用它的构造函数。

从你的例子中不明显,但如果你给你的基类一些(保护)成员,它会更有意义。在基础构造函数中初始化它们,因此在构造时从派生类中查看期望值。

见下文。字段value在子类中可见。作为初始值,你会期望什么?

public class MyClass1 
{ 
    protected int value; 
    MyClass1() 
    { 
     System.out.println("base class"); 
     this.value = 42; 
    } 
} 

class ChildClass extends MyClass1 
{ 
    public ChildClass() 
    { 
     // what would you expect 'value' to be here ? 
     System.out.println("child class " + value); 
    } 
} 
5

因为你的子类扩展的基类 - 它的基类的一个实例,具有所有的相同的字段和变量等。因此,基类也必须被实例化的。

对于一个具体的例子,假设你的基类具有如下所示:

public class Base 
{ 
    final private int id; 

    public Base() 
    { 
     this(-1); 
    } 

    public Base(int id) 
    { 
     this.id = id; 
    } 

    public getId() 
    { 
     return id; 
    } 
} 

最后变量是保证类被构造时被实例化。你的子类将有一个id字段(即使它不能直接用子方法访问它),并且由于这个字段是私有的,所以你不可能用子构造函数实例化它 - 所以基类构造函数必须调用

请记住,这是不是只与最后的变量的问题,也不是唯一的,你可以使用任何特殊的功能 - 因为你的子类一个基类,它需要被正确实例作为一个。

0

因为编译器默认在子类构造函数中添加super()构造函数,如果没有指定的话。每个构造函数在有继承时都应该有this(),如果没有继承或者super()方法。为了说明这一点,我采取了这个例子。

public class Vehicle { 
    protected int wheels; 
    protected int lights; 

    Vehicle(){ 
     System.out.println("Vehicle Class Constructor"); 
     this.wheels=4; 
     this.lights=2; 
    } 
} 

车辆是父类

class Car extends Vehicle { 
    public Car(){ 
    #Compiler add the super() constructor by default 
     System.out.println("Car class constructor"); 
    } 
} 

车是儿童类

public class TestCar { 
    public static void main(String args[]){ 
     Car c = new Car(); 
     System.out.println("Wheels" + c.wheels); 
     System.out.println("Lights" + c.lights); 
    } 
} 

在上面的代码片断。当我在编译的时候编译TestCar.java文件编译器查找对于Car构造函数,检查Car类是否有任何父类,只要它检查到Car类扩展了父类Vehicle,就会检查用户是否在继承树中提供了super()。如果不是,则增加一个。

希望这会有所帮助!