Android(java)学习笔记131:关于构造代码块,构造函数的一道面试题(华为面试题)

1. 代码实例:

package text;

public class TestStaticCon {
    
    public static int a = 0;
    
    static {
        a = 10;
        System.out.println("静态代码块在执行a="+a);
    }
    
    {
        a = 8;
        System.out.println("非静态代码块在执行a="+a);
    }
    
    public TestStaticCon() {
        this("带参构造方法在执行a="+a);
        System.out.println("无参构造方法在执行a="+a);
        
    }
    
    public TestStaticCon(String n) {
        System.out.println(n);
        System.out.println(a);
    }

    public static void main(String[] args) {
        TestStaticCon tsc = null ;
        System.out.println("!!!!!!!!!!!");
        tsc = new TestStaticCon();
    }

}

程序运行的结果如下:

(1)TestStaticCon tsc = null; 类进内存,开始进行类的初始化动作,有静态成员,静态先做初始化
(2)输出了 !!!!!!!!!!
(3)tsc = new TestStaticCon();

       ♦ 进入无参的构造方法;这里是关键点了!!! 

       ♦ 执行了this("带参构造方法在执行a=" + a);这里就是原因所在了,这时a的值任然是上一次static代码块执行时赋予的10 

       ♦ 进入了带参数的构造函数,而参数 String n已经记录了this("带参构造方法在执行a=" + a);中的字符串参数。也就意味着这里a的值已经被固定了,因为它已经是一个String了 

       ♦ 这时进入了构造代码块,也就是非static代码块,在这里 a = 8;然后输出 “非静态代码块在执行a=8“ 

       ♦ System.out.println(n);执行,记住这里输出的是String类型了,与 a 已经无关了 

       ♦ 回到无参的构造方法中执行System.out.println("无参构造方法在执行a=" + a); 这里的 a 是经过在 构造代码块中赋值为 8 的 a了

这里的考点应该是:构造代码块只会执行一次。在构造函数中调用构造函数,无论怎么调用最终都会有一个构造函数去执行构造代码块

原文地址:https://www.cnblogs.com/hebao0514/p/4751988.html