V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ESP
V2EX  ›  Java

[疑问] 既然编译器会为自动为类添加无参构造函数,那么为什么父类还需要一个无参构造方法以供子类调用?(如果子类没有使用 super 调用)

  •  
  •   ESP · 25 天前 · 933 次点击
    The title says it all.
    7 条回复    2021-04-23 14:20:29 +08:00
    oldshensheep
        1
    oldshensheep   25 天前   ❤️ 1
    不是很明白问题是什么意思,子类构造函数如果没有用 super,那就是调用父类的无参构造函数。
    如果你父类写了构造函数,就不会自动生成无参构造函数了。
    Kasumi20
        2
    Kasumi20   25 天前
    我虽然同样读不懂楼主在说什么。
    但是。
    我猜。
    他是说:
    7 class CC {
    8 public CC() {} <----------------- 此处必须显式提供该构造方法
    9 public CC(int a) {}
    10 }
    11
    12 class BB extends CC {
    13 public BB() {
    14 System.out.println("OK");
    15 }
    16 }

    有请下一位同学告诉楼主为什么
    Rocketer
        3
    Rocketer   25 天前 via iPhone
    第一位同学的最后一句已经回答过为什么了
    passerbytiny
        4
    passerbytiny   25 天前 via Android
    一、Java 的类加载机制是,必须先构造基类再构造子类,所以构造器第一句必定是 super() 或 super(args... ) ,你要自己没写编译器就给你自动加上 suoer() 。
    二、只在你没定义构造器的时候才自动添加无参构造器——如果你只添加了带参构造器,通常表示你不允许无参构造而只允许带参构造,这时候编译器是不能自作聪明给加上无参构造的。

    以上两点造成了,如果基类定义了无参构造器并且未添加无参构造,那么子类的构造器都得明确调用 super(args...) 。上述情况不表示你必须为类添加一个无参构造,因为上述情况在某些场景下是正确而非错误情况。
    ESP
        5
    ESP   25 天前
    @Kasumi20 是这个意思,感谢回答
    ESP
        6
    ESP   25 天前
    @oldshensheep 感谢回复。如果子类构造函数没有用 super,既然编译器会为父类自动添加无参构造函数,那为什么父类还要显式地提供无参构造函数呢?
    ESP
        7
    ESP   25 天前
    @passerbytiny 感谢解答
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3540 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 06:49 · PVG 14:49 · LAX 23:49 · JFK 02:49
    ♥ Do have faith in what you're doing.