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

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

  •  
  •   ESP · 2021-04-22 21:32:45 +08:00 · 2074 次点击
    这是一个创建于 1345 天前的主题,其中的信息可能已经有所发展或是发生改变。
    The title says it all.
    8 条回复    2021-06-11 15:30:39 +08:00
    oldshensheep
        1
    oldshensheep  
       2021-04-22 22:17:09 +08:00   ❤️ 1
    不是很明白问题是什么意思,子类构造函数如果没有用 super,那就是调用父类的无参构造函数。
    如果你父类写了构造函数,就不会自动生成无参构造函数了。
    Kasumi20
        2
    Kasumi20  
       2021-04-22 22:59:53 +08:00
    我虽然同样读不懂楼主在说什么。
    但是。
    我猜。
    他是说:
    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  
       2021-04-23 01:02:12 +08:00 via iPhone
    第一位同学的最后一句已经回答过为什么了
    passerbytiny
        4
    passerbytiny  
       2021-04-23 09:36:05 +08:00 via Android
    一、Java 的类加载机制是,必须先构造基类再构造子类,所以构造器第一句必定是 super() 或 super(args... ) ,你要自己没写编译器就给你自动加上 suoer() 。
    二、只在你没定义构造器的时候才自动添加无参构造器——如果你只添加了带参构造器,通常表示你不允许无参构造而只允许带参构造,这时候编译器是不能自作聪明给加上无参构造的。

    以上两点造成了,如果基类定义了无参构造器并且未添加无参构造,那么子类的构造器都得明确调用 super(args...) 。上述情况不表示你必须为类添加一个无参构造,因为上述情况在某些场景下是正确而非错误情况。
    ESP
        5
    ESP  
    OP
       2021-04-23 14:09:04 +08:00
    @Kasumi20 是这个意思,感谢回答
    ESP
        6
    ESP  
    OP
       2021-04-23 14:10:48 +08:00
    @oldshensheep 感谢回复。如果子类构造函数没有用 super,既然编译器会为父类自动添加无参构造函数,那为什么父类还要显式地提供无参构造函数呢?
    ESP
        7
    ESP  
    OP
       2021-04-23 14:20:29 +08:00
    @passerbytiny 感谢解答
    neptuno
        8
    neptuno  
       2021-06-11 15:30:39 +08:00
    父类不需要显式提供无参构造函数呀,不定义任何构造函数的时候,编译器会给你加上无参构造函数;如果你提供了某个构造函数,编译器不会给你加无参构造函数;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   949 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 21:01 · PVG 05:01 · LAX 13:01 · JFK 16:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.