Java 在构造函数中运行方法

Java 在构造函数中运行方法,java,methods,constructor,Java,Methods,Constructor,我是个新手。所以,我找不到确切的词语来解释我想做什么。我会尽力解释的 我创建了一个扩展了一些基类的类。在基类中,我有一些方法使用特定于对象的信息来运行。我的意思是,我们定义了一个构造函数 所以,在扩展基类的类中,我用super创建了一个构造函数,我可以在构造函数中调用一些基类方法,以便在对象创建后自动运行 就像这样: class Base { String someInfo; Base(String someInfo) { this.someInfo = som

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

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

所以,在扩展基类的类中,我用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();
    }
}

你的问题更多的是理论,而不是实践

实际上,你可以。但是你不应该做这种事。这是关于代码气味和难以发现的bug的可能性。看看这个样品

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

当您尝试它时发生了什么?您可以在构造函数中调用超类的方法,但它们将在对象创建期间而不是之后执行。我尝试过。它起到了作用,但还是有更好或更正式的方法来做。类中的某些特殊方法可能在创建对象后运行。因为我可能想在某些条件下运行一些其他方法。谢谢您的回答。我有时会对McClass/McClass犯这样的错误。我认为现在调用创建对象的方法听起来更好。我认为
super(calculate())
是非法的,除非
calculate
是静态的。@immibis在构造函数执行的每一刻,您都已经有了类的实例。。。此实例初始化不好,但您可以完全访问它的所有方法和变量。@immibis-Hmm。。。你是对的-我不喜欢“危险”代码,所以我没有试过。。。但您仍然可以使用超级类型方法。(在
super
调用后,您可以再次使用当前类方法)。