A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 新晋猿工 中级黑马   /  2016-9-1 10:52  /  1210 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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

14 个回复

倒序浏览
t.change1(t.x);传递的是基本数据类型的值,调用后会弹栈, change2(t);传递的是引用数据类型的值,调用后还在堆内存里,因为是这个样子的吧,新手莫喷
回复 使用道具 举报
调用的change1和第一次打印没有关系,打印的仅仅是t.x++,change2参数是类本身,而且是静态的,它会从头开始执行代码然后执行方法算法
回复 使用道具 举报

回帖奖励 +10

因为x是Test类的成员变量,成员变量作用域为整个类中,所以Test对象.x值一直在变
而change1(int m),m为方法内的局部变量,只是给方法内局部变量赋值,与成员变量x无关!
回复 使用道具 举报
顺便问一下,大神是怎么这么快就有这么多币的
回复 使用道具 举报

回帖奖励 +10

这道题主要是靠成员变量与局部变量的作用范围
方法内的局部变量随方法的结束而结束
类的成员变量跟随类的作用范围
且change1()只是传值操作
change2()传对象操作
回复 使用道具 举报
此题共考察了成员变量与局部变量的区别
还有方法传值与传对象的区别
回复 使用道具 举报
public class Test {

    int x = 4;

    public static void main(String[] args){
            Test t = new Test();
            t.x++;        //x=5
            t.change1(t.x);
            System.out.println(t.x); // x = 5;
             change2(t);
            System.out.println(t.x); // x = 7 ;
        }

    void change1(int m){ // m = 5 //用m接受t.x的值
        m += 2;                         // m = 7 ;


        } //方法结束后m被释放

    static void change2(Test m){//用m接受t这个对象的地址值,也就是说m和t其实是一个对象
            m.x += 2;                        //然后把成员变量x+2
        }
}


回复 使用道具 举报
t.change1(t.x);这个没有让x值发生改变 ,  t.x++;赋值完x是5,所以打印出5;
回复 使用道具 举报

回帖奖励 +10

那个代码格式怎么贴上去的?
回复 使用道具 举报

回帖奖励 +10

change2(t);x的值发生改变为7,主要 的是 要理解t.change1(t.x);这个x值是没有改变的,改变的地方只有  t.x++;和change2(t);
回复 使用道具 举报
[Java] 纯文本查看 复制代码
public class Test {

    int x = 4;

    public static void main(String[] args){
            Test t = new Test();
            t.x++;	//x=5
            t.change1(t.x);
            System.out.println(t.x); // x = 5;
             change2(t);
            System.out.println(t.x); // x = 7 ;
	}

    void change1(int m){ // m = 5 //用m接受t.x的值
        m += 2;			 // m = 7 ;


	} //方法结束后m被释放

    static void change2(Test m){//用m接受t这个对象的地址值,也就是说m和t其实是一个对象
            m.x += 2;			//然后把成员变量x+2
	}
}

回复 使用道具 举报
在java里面没有 地址传递,传递的都是值 。这句话好像是高司令说的。
回复 使用道具 举报

回帖奖励 +10

看了上面的回复,受益非浅
回复 使用道具 举报
谢谢大家的回答了~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马