java什么变量定义要加new,Java变量定义在什么时候执行(基础)

前言

今天,在某个群里,一个群友问了一个问题。非常基础的一个问题,结果却不懂得如何解释,有种一知半解的感觉,于是就围绕问题,展开了思考。

题目

以下两段代码输出的结果是什么?为什么?

public class T extends A {

int x;

public T(){

super();

num=x;

}

public static void main(String[] args) {

System.out.println(new T().num);

}

@Override

protected void name() {

x=3;

}

}

abstract class A {

protected int num =-1;

public A(){

name();

}

protected abstract void name ();

}

复制代码public class T extends A {

int x=1;

public T(){

super();

num=x;

}

public static void main(String[] args) {

System.out.println(new T().num);

}

@Override

protected void name() {

x=3;

}

}

abstract class A {

protected int num =-1;

public A(){

name();

}

protected abstract void name ();

}

复制代码

分析

两段代码,分别输出的结果为3和1。然鹅,为什么呢?有人觉得name()没有执行?

因为T继承了A,所以正常情况下,创建一个新的T对象的同时,应该首先执行父类A的构造函数,再执行子类T的构造函数,所以第一种情况,代码输出为3是正常的。可是为什么x有初始值的情况下,代码输出为1呢?

分别将两段代码进行javap -c 反编译之后,发现两种情况下的差异在于执行构造函数时,多了一次赋值操作。

078ea754c6c44ecba42890486e8f3c15.png

如图,左侧为x未赋值情况下反编译后的输出,右侧为x=1情况下反编译后的输出。为了方便查看,在此通过Jad进行反编译,来更加直观的表示结果。

5eaff89bcd53ada65169369640ff9cc2.png

可以看出,代码首先执行了A(),此时x应该为3。当x变量仅声明而没赋值的时候(左侧),程序直接进行了num的赋值。当x变量声明并赋了初值的时候(右侧),程序重新执行了赋初值的操作,导致x=1,最后得到的结果num=1。

扩散思考

这种情况是特例吗?明显不是!可能用高级语言用久了,有人疏忽了,变量其实是有声明和定义两步的。很明显,Java在进行编译的时候,是将这分开执行,而变量的定义则是在构造函数中执行,并且迟于父类构造函数执行,早于任意赋值语句执行。

为了更好理解,在此增加多另一个实例,供扩展使用

public class T extends A {

int x=1;

int y=1;

Test test=new Test();

public T(){

super();

num=x;

}

public T(int i){

super();

this.x=i;

num=x;

}

public static void main(String[] args) {

System.out.println(new T().num);

}

@Override

protected void name() {

x=3;

}

}

abstract class A {

protected int num =-1;

public A(){

name();

}

protected abstract void name ();

}

复制代码

3c6ecdacca05d5be16b5aa88f4c45409.png

无论后期如何操作,变量会在构造函数内部完成定义,再实现新的赋值操作。

总结

Java中变量的定义则是在构造函数中执行,并且迟于父类构造函数执行,早于任意赋值语句执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值