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