【问题标题】:Running a Method in Constructor在构造函数中运行方法
【发布时间】:2016-02-04 00:25:44
【问题描述】:

我是新手。所以,我找不到确切的词来解释我想要做什么。我会尽力解释。

我创建了一个扩展一些基类的类。在基类中,我有一些使用对象特定信息来运行的方法。我的意思是我们用构造函数定义的。

所以,在扩展我的基类的类中,我用super创建了一个构造函数,我可以在构造函数中调用一些基类方法,以便在对象创建后自动运行。

这样:

class Base {
    String someInfo;

    Base(String someInfo) {
        this.someInfo = someInfo;
    }

    String someMethod() {
        return someInfo;
    }
}

class MClass extends Base {

    MClass(String someInfo) {
        super(someInfo);
        someMethod();
    }
}

【问题讨论】:

  • 你尝试的时候发生了什么?
  • 你可以在你的构造函数中调用超类的方法,但是它们不会在对象创建之后执行。
  • 我试过了。它有效,但仍然有更好或更正式的方法来做到这一点。类中的一些特殊方法可能在对象创建后运行。因为我可能想在某些条件下运行其他一些方法。

标签: java methods constructor


【解决方案1】:

您的问题更多是关于理论,而不是实践。

在实践中 - 你可以。但你不应该做这样的事情。这是关于代码气味和难以发现的错误的可能性。看看这个样本

class Base {
  private final String t;
  private final int length;
  Base(String t) {
    this.t = t;
    length = this.t.length();// here you'll got NullPointerException
  }
}
class Override {
   Override() {
     super(calculate());
   }
   String calculate() {
     return "Override";
   }
}
class OverrideB {
  private final String b = "some string";
  OverrideB() {
  }
  String calculate() {
    return b;
  }
}

在当前示例中,当您尝试创建OverrideB 实例时,您将得到NullPointerException - 因为b 在当前时刻未实例化(您可以自行检查 - 它与构造函数的顺序有关来电)。 但是你必须选择避免这个问题:

  • 私有方法(它们不能被覆盖,只能隐藏在子类中)
  • final 方法(与 private 的情况相同,但它们甚至不能被隐藏,它们可用于所有子类)

PS 根据类名约定,您应该将mClass 命名为MClass

【讨论】:

  • 感谢您的回答。关于 mClass/MClass,我有时会犯这个错误。我认为现在调用我创建对象的方法听起来更好。
  • 我认为 super(calculate()) 是非法的,除非 calculate 是静态的。
  • @immibis 在构造函数执行的每一刻你已经有一个类的实例......这个实例没有很好地初始化,但你可以完全访问它的所有方法和变量。
  • @immibis 嗯……你说得对——我不喜欢“危险”代码,所以我没有尝试……但你仍然可以使用超类型方法。 (在super 再次调用后,您可以使用当前类方法)。
猜你喜欢
  • 2018-02-13
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 2013-05-02
  • 2019-01-06
  • 1970-01-01
相关资源
最近更新 更多