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

不必在构造函数中放置super()吗?

不必在构造函数中放置super()吗?

鸿蒙传说 2019-10-15 13:58:18
如果不将其放在子类的构造函数中,这不是由编译器自动放置的吗?那意味着我什至不需要关心它?他们在某些文章中将其淘汰。如果我有一个带参数的构造函数,这将是构造函数,还是需要一个不带参数列表的构造函数?
查看完整描述

3 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

首先是一些术语:


无参数构造函数:无参数的构造函数;

可访问的无参数构造函数:超类中的无参数构造函数对子类可见。这意味着它是公共的或受保护的,或者,如果两个类都在同一个包中,则访问包;和

默认构造函数:类中没有显式构造函数时,编译器添加的公共no-args构造函数。

因此,所有类都至少具有一个构造函数。


子类的构造函数可以在执行子类的构造函数中的代码之前,首先指定要调用超类中的哪个构造函数。


如果子类构造函数未指定要调用的超类构造函数,则编译器将自动调用超类中可访问的no-args构造函数。


如果超类没有no-arg构造函数或不可访问,则未指定要调用的超类构造函数(在子类构造函数中)是编译器错误,因此必须指定。


例如:


public class Base { }

public class Derived extends Base { }

这很好,因为如果不显式添加构造函数,则Java会为您放置一个公共的默认构造函数。


public class Base { }

public class Derived extends Base { public Derived(int i) { } }

还可以


public class Base { public Base(String s) { } }

public class Derived extends Base { }

上面是编译错误,因为Base没有默认构造函数。


public class Base { private Base() { } }

public class Derived extends Base { }

这也是一个错误,因为Base的no-args构造函数是私有的。


查看完整回答
反对 回复 2019-10-15
?
胡说叔叔

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

调用无参数的超级构造函数只会浪费屏幕空间和程序员时间。无论您是否编写,编译器都会生成完全相同的代码。


class Explicit() {

    Explicit() {

        super();

    }

}


class Implicit {

    Implicit() {

    }

}

更新(2018年12月):


编写显式super()代码有助于在IDE中导航源代码。


截至2018年12月,Eclipse和IntelliJ均未提供任何从派生类的构造函数导航到基类的构造函数的方法。


查看完整回答
反对 回复 2019-10-15
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

即使不调用子默认构造函数,也会调用默认父构造函数。


主要


public class Main {


    public static void main(String[] args) {

        A a = new B();

    }

}

一种


public class A {


    public A() {

        System.out.println("A");

    }

}


public class B extends A {


    public B() {

        System.out.println("B");

    }

}

版画


A

B


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 512 浏览

添加回答

举报

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