【问题标题】:Java - Explicit super() in subclass constructor [closed]Java - 子类构造函数中的显式 super() [关闭]
【发布时间】:2013-06-05 21:55:15
【问题描述】:

我发现了一些类似的话题,例如here,但他们并没有完全回答我的问题。问题很简单:

在子类的构造函数中调用super() 是一种好习惯吗?我当然知道,如果我没有明确地做到这一点,编译器会为我做这件事,但我只是在最佳实践的背景下询问。您是否认为在每个子类的构造函数中调用 super() 是“形式战胜实质”?

我正在使用包含使用策略的代码,所以我明白了,对于许多程序员来说,这根本不重要...对我来说现在也没关系,但也许我应该改变它...

【问题讨论】:

  • 如果超类没有默认构造函数,您必须这样做。例如:class Fruit{ protected String flavor; public Fruit(String flavor) { this.flavor = flavor; } } class Apple extends Fruit { public Apple() { super("sweet"); } }。题外话:super("sweet") 听起来很有趣:)。
  • 我从不使用空的super(),因为它只是多余的,但正如@LuiggiMendoza 所说,super(...) 可能是必要的。
  • 是的,当然。但我的意思只是 super 可以省略的情况。

标签: java inheritance constructor superclass super


【解决方案1】:

在我看来,明确的 super() 调用只会污染代码。默认 super() 调用正是为此目的而发明的 - 以缩短代码。参见 SE 库源码,super() 几乎没有使用过,例如

public HashMap(int initialCapacity, float loadFactor) {
   if (initialCapacity < 0)
   ...

【讨论】:

    【解决方案2】:

    好的做法?调用正确初始化对象所必需的。

    public class Foo {
        private String name;
        public Foo() { this(""); }
        public Foo(String n) { this.name = n; }
    }
    
    public class Bar extends Foo {
        private int x;
        public Bar(int y) { this("", y); }
        public Bar(String n, int y) {
            super(n);
            this.x = y;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 2014-02-17
      • 2014-11-20
      • 2018-05-06
      • 1970-01-01
      • 2013-02-18
      相关资源
      最近更新 更多