我正在学习java,无意中遇到了以下代码,其中默认构造函数在方法之后执行。
public class ChkCons { int var = getVal(); ChkCons() { System.out.println("I'm Default Constructor."); } public int getVal() { System.out.println("I'm in Method."); return 10; } public static void main(String[] args) { ChkCons c = new ChkCons(); } }
输出:
I'm in Method. I'm Default Constructor.
谁能给我解释一下为什么会这样?
谢谢。
我们可以参考以下关于初始化实例变量的oracle留档(重点是我的):
初始化实例成员
通常,您会在构造函数中放入初始化实例变量的代码。使用构造函数初始化实例变量有两种选择:初始值设定项块和final方法。
实例变量的初始化器块看起来就像静态初始化器块,但没有静态关键字:
{//初始化所需的任何代码都在这里}
不能在子类中重写final方法。这将在接口和继承课程中讨论。下面是使用最终方法初始化实例变量的示例:
class Whatever {
private varType myVar = initializeInstanceVariable();
protected final varType initializeInstanceVariable() {
// initialization code goes here
}
}
https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
构造函数在方法之前被调用。方法的执行发生在对象创建的一部分之后,在对象创建过程中,实例变量被计算。从下面的代码中可以更好地理解这一点。
class SuperClass{
SuperClass(){
System.out.println("Super constructor");
}
}
public class ChkCons extends SuperClass{
int var = getVal();
ChkCons() {
System.out.println("I'm Default Constructor.");
}
public int getVal() {
System.out.println("I'm in Method.");
return 10;
}
public static void main(String[] args) {
ChkCons c = new ChkCons();
}
}
上面的代码有以下输出
Super constructor
I'm in Method.
I'm Default Constructor.
在这里,编译器会自动添加super()
作为ChkCons()
构造函数中的第一条语句,因此它在getVal()
方法之前被调用。
实例变量初始化表达式,例如int var=getVal()
在超级类构造函数执行之后,但在当前类构造函数的主体执行之前进行计算。
因此,在执行
ChkCons
构造函数的主体之前调用getVal()
。
问题内容: 默认构造函数到底是什么?你能告诉我以下哪个是默认构造函数,它与其他构造函数有何不同? 问题答案: 他们都不是。如果定义,则不是默认值。 除非你定义另一个构造函数,否则默认构造函数是自动生成的无参数构造函数。任何未初始化的字段都将设置为其默认值。对于你的榜样,它看起来像这样假设的类型String,int以及int,那类本身是公共的: 这与 完全没有构造函数。但是,如果定义至少一个构造函数
问题内容: 我知道我在这里问一些严重的101问题… 我有一些课,还有一个延伸课。在我有一个构造函数,它接受一组参数,并对其字段进行设置。派生类(例如)通常不需要进行修改。现在我的IDE给我 “ Foo中没有默认的构造函数” 。从一点点谷歌搜索,这似乎是因为“构造函数没有继承”。因此,一切都很好,但是我现在如何使它工作而不在每个派生类中复制此构造函数?我假设有一个更合理的方法? 问题答案: 使用构造
问题内容: 其实我不明白,无参数构造函数和默认构造函数有什么区别。 创建名为cFrame的Test对象时,这是否调用此类的默认构造函数? 问题答案: 该构造函数是一个无参数的构造函数,代表您的Java编译器插入; 它包含对(not )的调用,这是默认行为。如果实现任何构造函数,则不再收到默认的构造函数。 JLS-8.8.9。默认构造函数说(部分), 如果一个类不包含构造函数声明,则隐式声明一个没有
问题内容: 除了* 使用如下所示的反射检查 之外 ,是否有任何方法 要求 类具有默认(无参数)构造函数?(以下方法可以工作,但是很hacky,反射速度很慢) * 问题答案: 您可以为此构建一个注释处理器。注释处理器是在编译时运行的编译器插件。它们的错误显示为编译器错误,甚至可能停止构建。 这是一个示例代码(尽管我没有运行它): 如果引入注释(例如RequiresDefaultAnnotation)
当Java中给出参数构造函数时,为什么默认的无参数构造函数会失败? 这个设计有什么意义? 例如: