黑马程序员技术交流社区

标题: 程序解析题 [打印本页]

作者: 新晋猿工    时间: 2016-9-1 10:52
标题: 程序解析题
  1. public class Test {

  2.         int x = 4;

  3.         public static void main(String[] args){
  4.                  Test t = new Test();
  5.                 t.x++;
  6.                 t.change1(t.x);
  7.                 System.out.println(t.x);
  8.                  change2(t);
  9.                 System.out.println(t.x);
  10. }

  11.         void change1(int m){
  12.             m += 2;
  13. }

  14.         static void change2(Test m){
  15.                 m.x += 2;
  16. }
  17. }
复制代码

为什么输出是
5
7

作者: wo1026756529    时间: 2016-9-1 11:00
t.change1(t.x);传递的是基本数据类型的值,调用后会弹栈, change2(t);传递的是引用数据类型的值,调用后还在堆内存里,因为是这个样子的吧,新手莫喷
作者: wb277379322    时间: 2016-9-1 11:16
调用的change1和第一次打印没有关系,打印的仅仅是t.x++,change2参数是类本身,而且是静态的,它会从头开始执行代码然后执行方法算法
作者: 18366882177    时间: 2016-9-1 11:18
因为x是Test类的成员变量,成员变量作用域为整个类中,所以Test对象.x值一直在变
而change1(int m),m为方法内的局部变量,只是给方法内局部变量赋值,与成员变量x无关!
作者: wb277379322    时间: 2016-9-1 11:20
顺便问一下,大神是怎么这么快就有这么多币的
作者: 18366882177    时间: 2016-9-1 11:26
这道题主要是靠成员变量与局部变量的作用范围
方法内的局部变量随方法的结束而结束
类的成员变量跟随类的作用范围
且change1()只是传值操作
change2()传对象操作
作者: 18366882177    时间: 2016-9-1 11:29
此题共考察了成员变量与局部变量的区别
还有方法传值与传对象的区别
作者: zhoubinjian    时间: 2016-9-1 11:37
t.change1(t.x);这个没有让x值发生改变 ,  t.x++;赋值完x是5,所以打印出5;
作者: zhoubinjian    时间: 2016-9-1 11:41
change2(t);x的值发生改变为7,主要 的是 要理解t.change1(t.x);这个x值是没有改变的,改变的地方只有  t.x++;和change2(t);
作者: wb277379322    时间: 2016-9-1 11:45
看了上面的回复,受益非浅
作者: 新晋猿工    时间: 2016-9-1 14:45
谢谢大家的回答了~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2