在默认构造函数之前执行的方法

这个问题在这里已经有了答案:

  • 在Java中运行构造函数代码之前,字段是否已初始化? 4个答案

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

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


    构造函数在方法之前调用。 方法的执行发生在作为对象实例变量评估对象创建的一部分之后。 从以下代码可以更好地理解这一点。

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


    我们可以参考以下有关初始化实例变量的Oracle文档(强调是我的):

    初始化实例成员

    通常情况下,您会将代码初始化为构造函数中的实例变量。 使用构造函数初始化实例变量有两种选择:初始化块和最终方法。

    实例变量的初始化块与静态初始化块类似,但没有static关键字:

    {//初始化需要的任何代码都在这里}

    > Java编译器将初始化块复制到每个构造函数中。 因此,这种方法可以用来在多个构造函数之间共享一段代码。

    最后的方法不能在子类中重写。 这在接口和继承课上讨论。 以下是使用最终方法初始化实例变量的示例:

    class Whatever {
    private varType myVar = initializeInstanceVariable();
    
    protected final varType initializeInstanceVariable() {
    
        // initialization code goes here
    } 
    }
    

    https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

    链接地址: http://www.djcxy.com/p/76131.html

    上一篇: Method executed prior to Default Constructor

    下一篇: What To Do Now?