当前位置: 首页 > 知识库问答 >
问题:

Java-在默认构造函数之前执行的方法[重复]

赖俊
2023-03-14

我正在学习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.

谁能给我解释一下为什么会这样?

谢谢。

共有3个答案

公良高刚
2023-03-14

我们可以参考以下关于初始化实例变量的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

益泰平
2023-03-14

构造函数在方法之前被调用。方法的执行发生在对象创建的一部分之后,在对象创建过程中,实例变量被计算。从下面的代码中可以更好地理解这一点。

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()方法之前被调用。

柳宾实
2023-03-14

实例变量初始化表达式,例如int var=getVal() 在超级类构造函数执行之后,但在当前类构造函数的主体执行之前进行计算。

因此,在执行ChkCons构造函数的主体之前调用getVal()

 类似资料:
  • 问题内容: 默认构造函数到底是什么?你能告诉我以下哪个是默认构造函数,它与其他构造函数有何不同? 问题答案: 他们都不是。如果定义,则不是默认值。 除非你定义另一个构造函数,否则默认构造函数是自动生成的无参数构造函数。任何未初始化的字段都将设置为其默认值。对于你的榜样,它看起来像这样假设的类型String,int以及int,那类本身是公共的: 这与 完全没有构造函数。但是,如果定义至少一个构造函数

  • 问题内容: 我知道我在这里问一些严重的101问题… 我有一些课,还有一个延伸课。在我有一个构造函数,它接受一组参数,并对其字段进行设置。派生类(例如)通常不需要进行修改。现在我的IDE给我 “ Foo中没有默认的构造函数” 。从一点点谷歌搜索,这似乎是因为“构造函数没有继承”。因此,一切都很好,但是我现在如何使它工作而不在每个派生类中复制此构造函数?我假设有一个更合理的方法? 问题答案: 使用构造

  • 问题内容: 其实我不明白,无参数构造函数和默认构造函数有什么区别。 创建名为cFrame的Test对象时,这是否调用此类的默认构造函数? 问题答案: 该构造函数是一个无参数的构造函数,代表您的Java编译器插入; 它包含对(not )的调用,这是默认行为。如果实现任何构造函数,则不再收到默认的构造函数。 JLS-8.8.9。默认构造函数说(部分), 如果一个类不包含构造函数声明,则隐式声明一个没有

  • 问题内容: 除了* 使用如下所示的反射检查 之外 ,是否有任何方法 要求 类具有默认(无参数)构造函数?(以下方法可以工作,但是很hacky,反射速度很慢) * 问题答案: 您可以为此构建一个注释处理器。注释处理器是在编译时运行的编译器插件。它们的错误显示为编译器错误,甚至可能停止构建。 这是一个示例代码(尽管我没有运行它): 如果引入注释(例如RequiresDefaultAnnotation)

  • 当Java中给出参数构造函数时,为什么默认的无参数构造函数会失败? 这个设计有什么意义? 例如: