为了账号安全,请及时绑定邮箱和手机立即绑定

Java构造器继承

Java构造器继承

素胚勾勒不出你 2019-12-18 17:13:39
Java构造器继承我想知道为什么在java构造函数中没有继承?你知道当你有这样一堂课的时候:public class Super {   public Super(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){     this.serviceA = serviceA;     //etc   } }稍后,当您继承Super,java会抱怨没有定义默认构造函数。解决方案显然是这样的:public class Son extends Super{   public Son(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){     super(serviceA,serviceB,serviceC);   }}这个代码是重复的,不是干的和无用的(IMHO).因此,这再次提出了一个问题:为什么java不支持构造函数继承?不允许这种继承有什么好处吗?
查看完整描述

3 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

假设构造函数都是遗传的.。因为每个类最终都是从对象派生出来的,每一,每个类将以无参数构造函数结束。馊主意。你到底期望什么:

FileInputStream stream = new FileInputStream();

去做?

现在可能有一种方法可以轻松地创建“通过”构造函数,这是相当常见的,但我不认为它应该是默认的。构造子类所需的参数通常与超类所需的参数不同。



查看完整回答
反对 回复 2019-12-19
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

当你从超级继承时,这就是现实中发生的事情:

public class Son extends Super{

  // If you dont declare a constructor of any type, adefault one will appear.
  public Son(){
    // If you dont call any other constructor in the first line a call to super() will be placed instead.
    super();
  }}

所以,这就是原因,因为你必须调用你唯一的构造函数,因为“Super”没有默认的构造函数。

现在,尝试猜测为什么Java不支持构造函数继承,可能是因为构造函数只有在讨论具体实例时才有意义,而且当您不知道如何(通过多态)定义某物的实例时,您不应该能够创建它的实例。



查看完整回答
反对 回复 2019-12-19
?
大话西游666

TA贡献1817条经验 获得超14个赞

因为构建子类对象的方式可能与构建超类的方式不同。您可能不希望子类的客户端能够调用超类中可用的某些构造函数。

一个愚蠢的例子:

class Super {
    protected final Number value;
    public Super(Number value){
        this.value = value;
    }}class Sub {
    public Sub(){ super(Integer.valueOf(0)); }
    void doSomeStuff(){
        // We know this.value is an Integer, so it's safe to cast.
        doSomethingWithAnInteger((Integer)this.value);
    }}// Client code:Sub s = new Sub(Long.valueOf(666L)):
     // Devilish invocation of Super constructor!s.doSomeStuff(); 
    // throws ClassCastException

或者更简单:

class Super {
    private final String msg;
    Super(String msg){
        if (msg == null) throw new NullPointerException();
        this.msg = msg;
    }}class Sub {
    private final String detail;
    Sub(String msg, String detail){
        super(msg);
        if (detail == null) throw new NullPointerException();
        this.detail = detail;
    }
    void print(){
        // detail is never null, so this method won't fail
        System.out.println(detail.concat(": ").concat(msg));
    }}// Client code:Sub s = new Sub("message");
     // Calling Super constructor - detail is never initialized!s.print();
      // throws NullPointerException

从本例中可以看出,您需要某种方式声明“我想继承这些构造函数”或“我想继承除这些构造函数之外的所有构造函数”,然后还必须指定默认构造函数继承首选项,以防有人在超类中添加新构造函数.或者,如果您想要“继承”它们,那么只需要从超类中重复构造函数,这可以说是更明显的方法。




查看完整回答
反对 回复 2019-12-19
  • 3 回答
  • 0 关注
  • 257 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信