java派生构造函数

8tntrjer  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(373)

在以下代码中:

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类型的示例时,基类的构造函数也会被执行??

ax6ht2ek

ax6ht2ek1#

因为您的子类扩展了基类-它是基类的示例,并且具有所有相同的字段和变量等。因此基类也必须示例化。
作为一个具体的例子,假设您的基类中有以下内容:

public class Base
{
    final private int id;

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

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

    public getId()
    {
        return id;
    }
}

最后一个变量保证在构造类时示例化。你的孩子班将有一个 id 字段(即使它不能用子方法直接访问它),而且由于这个字段是私有的,所以不能用子构造函数示例化它-所以必须调用基类构造函数。
请记住,这不仅仅是最终变量的问题,也不是您可能使用的任何特定功能所特有的问题—因为您的子类是基类,所以需要将其正确地示例化为基类。

ztigrdn8

ztigrdn82#

因为这是应该发生的:-)
派生类使用基类作为基础。在oo语言中,它是一个基类。基类还需要初始化自身,因此必须调用其构造函数。
从您的示例中看不出这一点,但是如果您给基类一些(受保护的)成员,这将更有意义。在基构造函数中初始化它们,因此在构造时从派生类中查看它们时,它们将具有预期的值。
见下文。田野 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);
    }
}
j0pj023g

j0pj023g3#

因为编译器默认情况下会在未指定的子类构造函数中添加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()。如果不是,那就加一个。
希望这有帮助!

相关问题