为了账号安全,请及时绑定邮箱和手机立即绑定

Java 初始化过程

Java 初始化过程

慕妹3146593 2019-03-22 19:15:36
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);            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  = new TestStaticCon();     } }输出:静态代码块在执行a=10非静态代码块在执行a=8a在类带参构造方法中的值:1088类无参构造方法在执行a=8为什么第三行输出是10??
查看完整描述

4 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

自动动手调试一下就什么都清楚了
java的初始化顺序,静态变量、静态快、变量、初始化块、构造方法,如果在构造方法中调用了重载的构造方法,那第一次调用的构造方法就不会进行对象变量的初始化了
java的构造方法的重载调用只能在第一行,原因也在于此;至于为何这么设计,我也不懂
你的代码里面,先执行的
this("a在类带参构造方法中的值:" + a); // 调用另外一个构造方法

之后又执行的变量和初始化快
用IDE的单步调试看一下就明白了

查看完整回答
反对 回复 2019-04-28
?
MM们

TA贡献1886条经验 获得超2个赞

public static int a = 0;

    static {   
        a = 10;   
        System.out.println("静态代码块在执行a=" + a);   
    }

相当于下面的代码
public static int a;


查看完整回答
反对 回复 2019-04-28
?
POPMUISE

TA贡献1765条经验 获得超5个赞

因为你存在两个构造函数, 当你在执行第一个构造函数时, 已经转入另外一个构造方法,而在这时你传入的形参为10, 所以在第2个构造方法中n并不是对a的引用, 况且a是int型, 本身就只是常量, 不存在地址的引用, 所以第一条输出语句为你传入的形参10


查看完整回答
反对 回复 2019-04-28
?
UYOU

TA贡献1878条经验 获得超4个赞

Object是所有类的超类,在java的构造其中this或者super必须放在构造器的第一行执行,在没署名的情况下,每个类的构造方法第一行调用super(),这样才能完成父类的初始化(同类中的构造器必然会用一个调用到父类的构造器),
这个过程可能是一个递归构造链,最终回归到Object。
这里用本类带参的构造方法代替了默认的super(),所以讲通过this(String n)这个构造方法来完成父类的初始化,为了调用this(String n),就需要先将它的参数装配好,因此第三行输出的是10.
写出来可能更好理解
[code="java"]
public TestStaticCon(String n) { 
[color=red] super();[/color]
System.out.println(n);

System.out.println(a);

    }

希望能对你有帮助.


查看完整回答
反对 回复 2019-04-28
  • 4 回答
  • 0 关注
  • 430 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号