Java中局部变量与类变量的行为疑惑:代码输出差异问题
问题解析:Java实例变量与对象实例的区别
嘿,作为熟悉C/C++的Java新手,你遇到的这个问题核心是Java中实例变量属于对象实例而非类,以及你搞混了两个完全独立的Test对象。咱们一步步拆解清楚:
先理清几个关键概念
- 静态变量(
static int x):属于整个Test类,所有Test对象共享同一个值,修改它会影响所有实例。 - 实例变量(
private int y):每个Test对象都有自己独立的一份,不同对象的y互不干扰,就像C++里的非静态成员变量。 this关键字:指向调用当前方法的那个对象实例,绝不是方法内部新创建的对象。
你的代码执行流程拆解
跟着main方法的执行步骤走,就能明白为什么输出和预期不一样:
main里创建了第一个Test对象:Test t = new Test();这个对象的y初始值是33。- 调用这个对象的
method1(5):- 第一步
Test t = new Test();:又创建了一个全新的Test对象,这个新对象的y还是初始的33,完全没被碰过。 this.x = 22;:因为x是静态变量,this.x等价于Test.x,修改的是类的静态变量,所以所有地方的x都会变成22(这部分你已经理解了)。y = 44;(或this.y = 44;):这里的this指向的是main里创建的那个调用method1的对象(也就是第一个Test对象),所以修改的是它的y,变成44。- 最后输出:
Test.x和t.x都是22(静态变量共享特性)。t.y:这里的t是method1里新创建的对象,它的y从来没被修改过,自然还是33。y:这里的y等价于this.y,指向main里的对象的y,已经被改成44。
- 第一步
如何得到你的预期输出?
如果你想让method1里的新t的y变成44,需要直接修改这个新对象的y:
public void method1(int x) { Test t = new Test(); this.x = 22; y = 44; t.y = 44; // 新增这一行,直接修改新创建的t的y System.out.println("Test.x: " + Test.x); System.out.println("t.x: " + t.x); System.out.println("t.y: " + t.y); System.out.println("y: " + y); }
这样输出里的t.y就会变成你预期的44了。
给C++开发者的小提示
其实逻辑和C是通的:在C成员函数里new一个新的类对象,这个新对象的成员变量也是独立的,和调用函数的对象无关。Java的实例变量和C的非静态成员变量逻辑一致,只是Java的static对应C的static成员变量,都是类级别的共享变量。
内容的提问来源于stack exchange,提问作者Bhawan
相关产品推荐
相关产品推荐

