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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郝林杰 中级黑马   /  2014-4-4 22:33  /  1437 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郝林杰 于 2014-4-4 23:52 编辑

public class Test{
public static void main(String [] args){
int x=6;
Test p=new Test();
p.do(x);
System.out.prinfln("main:x="+x);
}
void do (int x){
System.out.prinfln("do:x="+x++);
}
}
输出结果 为什么不是do:x=7  main:x=7呢?

12 个回复

倒序浏览
本帖最后由 papercup 于 2014-4-4 22:54 编辑

朋友,你写的这个程序好像不太正确吧。。我按照我的理解改了一下:

  1. public class TestClass{
  2.         //main函数:
  3.         public static void main(String [] args){
  4.                 //定义变量 x
  5.                 int x=6;
  6.                 //创建 TestClass对象:p
  7.                 TestClass p=new TestClass();
  8.                 //调用 p的doo方法  (由于java中不能自行定义do方法,所以我改了一下名称)
  9.                 p.doo(x);
  10.                 System.out.println("main:x="+x);
  11.         }
  12.         public void doo (int x){
  13.                 //System.out.println("do:x="+(x++));// 这样显示的是  do:x=6   main:x=7
  14.                 System.out.println("do:x="+(++x)); //这样显示的就是 do:x = 7   main:x =6
  15.         }
  16. }
复制代码


主要就是++x  和x++ 的区别,以及括号的作用。
回复 使用道具 举报
执行到do方法时,参数有个int x,那么就栈中创建个x变量,将上述的x=6中的6给了刚新建的x,相当于复制一个6给它,那么复制的这个6在方法内进行操作,打印出do.x=6,但这个do方法执行完毕就会弹栈,那么方法的参数x也就随之消失,故main.x还是打印原先的6,和方法do没有关系
回复 使用道具 举报
楼主你的被调用函数的函数名写错了
回复 使用道具 举报
papercup 发表于 2014-4-4 22:52
朋友,你写的这个程序好像不太正确吧。。我按照我的理解改了一下:

主要就是++x  和x++ 的区别,以及括号 ...

不对,第一个是do:x=6  main:x=6
回复 使用道具 举报
首先程序错误,do是关键字,怎么可以用来定义函数名呢?编译不会通过。
修改如下:
  1. class Test
  2. {
  3.         public static void main(String [] args)
  4.         {
  5.                 int x =6;
  6.                 Test d =new Test();
  7.                 d.method(x);
  8.                 System.out.println("main:x ="+x);
  9.         }
  10.         void method(int x)
  11.         {
  12.                 System.out.println("method:x ="+x);
  13.         }
  14. }
复制代码

其次Test类里method方法定义的变量x是局部变量,函数运行完即从堆内存释放,和main方法中定义的x没有关系。
所以最后的输出结果:
method:x =6
main:x =6
回复 使用道具 举报
muma 中级黑马 2014-4-4 22:58:26
7#
muma 发表于 2014-4-4 22:53
楼主你的被调用函数的函数名写错了
  1. public class Test
  2. {
  3.          public static void main(String[] args)
  4.          {
  5.                  int x = 6;
  6.                  Test p = new Test();
  7.                  p.do1(x);//将实参x=6传给无返回值的do1方法,输出的是do1:x=6.(毕老师解释先玩后吃饭)
  8.                  System.out.println("main:x="+x);//而main方法输出的是实参中x=6.
  9.          }
  10.          void do1 (int x)
  11.         {
  12.                  System.out.println("do1:x="+x++);
  13.         }
  14. }
复制代码
回复 使用道具 举报
muma 中级黑马 2014-4-4 22:59:27
8#
  1. 楼主你的被调用函数的函数名写错了
  2. public class Test
  3. {
  4.          public static void main(String[] args)
  5.          {
  6.                  int x = 6;
  7.                  Test p = new Test();
  8.                  p.do1(x);//将实参x=6传给无返回值的do1方法,输出的是do1:x=6.(毕老师解释先玩后吃饭)
  9.                  System.out.println("main:x="+x);//而main方法输出的是实参中x=6.
  10.          }
  11.          void do1 (int x)
  12.         {
  13.                  System.out.println("do1:x="+x++);
  14.         }
  15. }
复制代码
回复 使用道具 举报
x++是先赋值 再+1。p.do(x)调用的时候传进去的x值为6,System.out.prinfln("do:x="+x++)一直到这句代码执行的时候还是6,执行结束后,x才会加1,所以do:6。因为参数是int型的,所以传递进方法中的只是值,在方法中对x进行操作不会影响到main中x的值,所以main中调用的时候,输出的结果还是6
回复 使用道具 举报
此题考了三个知识点:
关键字不能作为方法名定义:do()应该换一个名字;
方法中的变量为局部变量,类中的变量是成员变量,局部变量改变不影响成员变量:main:x 中的x始终是6;
单目运算符的使用:x++是先赋值,在自加;
回复 使用道具 举报
papercup 发表于 2014-4-4 22:52
朋友,你写的这个程序好像不太正确吧。。我按照我的理解改了一下:

主要就是++x  和x++ 的区别,以及括号 ...

首先谢谢你的回答 。额,程序没错,我刚对了一遍,只是我把doStuff后的Stuff没写,忘了do是关键词了。
回复 使用道具 举报
疯狂沙漠 发表于 2014-4-4 22:52
执行到do方法时,参数有个int x,那么就栈中创建个x变量,将上述的x=6中的6给了刚新建的x,相当于复制一个6 ...

p.do(x)   方法怎么会去用  main函数里的 x值呢?   是怎么用的?
回复 使用道具 举报
请备注 发表于 2014-4-5 00:46
p.do(x)   方法怎么会去用  main函数里的 x值呢?   是怎么用的?

执行到do方法时,main中的x的值复制给do方法中的x,而do方法中操作x,和main中的x没有任何关系
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马