繁体   English   中英

在Java中继承构造函数

[英]Inheriting a constructor in java

当我们在Java中使用继承时,是否可以通过子类继承超类的构造函数?

tutorialspoint上它说:

子类从其超类继承所有成员(字段,方法和嵌套类)。 构造函数不是成员,因此它们不会被子类继承,但是可以从子类中调用超类的构造函数。

但是在同一教程的某处说:

如果一个类继承了另一个类的属性,则子类将自动获取超类的默认构造函数。

所以我想知道子类可以继承超类的构造函数吗?

所以我想知道子类可以继承超类的构造函数吗?

构造函数不能被继承。

继续,我设法在tutorialspoint找到与您相关的源。

重要的是要注意,在其下面提到的部分明确地标题为“ 调用超类构造函数” ,并且指出:

如果一个类继承了另一个类的属性,则子类将自动获取超类的默认构造函数。 但是,如果要调用超类的参数化构造函数,则需要使用super关键字,如下所示。

 super(values); 

简单地说,这是要说的是,如果子类构造函数未指定要调用的超类构造函数,则编译器将自动调用超类中的可访问的无参数构造函数。

但是,一旦超类中存在参数化的构造函数,则必须将其作为派生类的构造函数中的第一条语句调用,否则您的程序将无法编译。

例如

public class Super { ... }
public class Derived extends Super { ... } // good ! compiler puts in a public default constructor for you.

下面的代码将无法编译,您应该得到一个错误说明:

在Super中没有可用的默认构造函数

public class Super {
    public Super(int id) {...} 
}
public class Derived extends Super {...}

这意味着您需要显式调用Super类的构造函数,作为Derived类的构造函数中的第一条语句,并提供必要的参数,例如

public Derived(){ super(12);}

您可以使用super关键字访问超类构造函数。

您需要在子类中定义构造函数,然后调用超级构造函数。

public class Animal {

    private String name;

    public Animal(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void play(){
        System.out.println(this.getName() + " is playing ");
    }
}

public class Dog extends Animal{
    public Dog(String name) {
        super(name);
    }
}

public class Test {

    public static void main(String[] args) {
        Dog d = new Dog("Winky");
        d.play();
    }
}

默认情况下,所有超类构造函数都是继承的,您可以使用子类构造函数调用这些构造函数。

当实例化子类对象时,子类构造函数之前的子类期望它将执行超类构造函数,然后它将继续执行子类构造函数。 如果您想使用默认超级构造函数以外的其他超级构造函数,则可以从子类构造函数中使用super关键字进行调用,并且此调用应该是子类构造函数中的第一条语句。

例:

public Subclass(String msg) {
    super(msg); // calling non default super class constructor
    // any other initialization
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM