黑马程序员技术交流社区

标题: 这个题我做着是6为什么运行4? [打印本页]

作者: gongyanfa123    时间: 2015-7-3 23:10
标题: 这个题我做着是6为什么运行4?
public class Test1 {
        public static void leftshift(int i, int j) {
                   i+=j;
        }
        public static void main(String args[]) {
                int i = 4, j = 2;
                leftshift(i, j);
                System.out.println(i);
        }
}
我是基础班的学生,请大神详细的解析。
作者: Diors    时间: 2015-7-3 23:14
这个是方法特性的时候会讲,传入的数值运算完就被放弃了,没有保存,可以这么理解,在leftshift方法上以及方法内,i和j都是局部变量,超出这个范围就没有了
作者: 小骆驼    时间: 2015-7-3 23:18
你的public static void leftshift(int i, int j) {                     i+=j;         } void根本就没有返回值,leftshift(i,j);就是没有一样的效果
作者: linjian931219    时间: 2015-7-3 23:48
gongyanfa123 发表于 2015-7-3 23:10
public class Test1 {
        public static void leftshift(int i, int j) {
                   i =j;

你调用函数的时候,用了void类型,而void是没有返回值的,左右相加赋给左边,但没有返回值,但你定义了inti =4.所以传出的值还是它本身。把leftshift函数的返回值类型改成int应该就行了
作者: 冷雨敲窗被未温    时间: 2015-7-3 23:57
楼上正解
作者: 慕容旺财    时间: 2015-7-5 13:49
少年 你要让你的函数和主函数产生联系 要么直接在函数内打印 要么用返回值返回 不然 两个函数各算各的
作者: 雏鹰起飞    时间: 2015-7-5 13:56
leftshift方法里面的i和主函数中的i只不过同名而已,这两者其实没有什么关系的,就像北京有个张三,上海有个张三,你给了北京那个张三100万,但是上海的张三还是个穷鬼啊
作者: icichacici    时间: 2015-7-5 16:58
因为i是局部变量,而不是全局变量,所以你即时调用leftshift(i,j)函数后,在public static void leftshift(int i, int j) {                     i+=j;         System.out.println(i); } 中i的值是6,而在public static void main(String args[]) {                  int i = 4, j = 2;                  leftshift(i, j);                  System.out.println(i);          } 中i的值仍然是4.
作者: 825176857    时间: 2015-7-5 17:13
  1. class Test1 {
  2.     public static int leftshift(int i, int j) {
  3.               return  i=i+j;
  4.     }
  5.     public static void main(String args[]) {
  6.             int i = 4;
  7.             int j = 2;
  8.             System.out.println(leftshift(i, j));

  9.     }
  10. }
复制代码

你要的6.改一下你就知道了为什么了
  1. class Test1 {
  2.     public static int leftshift(int a, int b) {
  3.               return a=a+b;
  4.     }
  5.     public static void main(String args[]) {
  6.             int i = 4;
  7.             int j = 2;
  8.             System.out.println(leftshift(i, j));
  9.             System.out.println(i);
  10.     }
  11. }
复制代码

作者: fmi110    时间: 2015-7-5 17:22
传值 传地址的问题
作者: A等待着    时间: 2015-7-5 17:59
class OperationDemo
{
      public static int leftshift(int i, int j) {
                   i+=j;
                                   return i;
        }
        public static void main(String args[]) {
                int i = 4, j = 2;
                i=leftshift(i, j);
                System.out.println(i);
        }
}
这就可以了
作者: very爱    时间: 2015-7-5 18:06
leftshift返回值类型是void,没有具体返回值,所以i=4
作者: 进军黑马    时间: 2015-7-5 18:08
学习了                       
作者: 贾森    时间: 2015-7-5 18:25
方法的返回值为空 调用之后还是原来的
作者: limingdada    时间: 2015-7-5 22:10
因为传递的是基本数据类型的值哦。
作者: wws1214    时间: 2015-7-5 22:14
(个人理解)int定义的对象的值存在栈中,所以参数得到的只是值而已,如果用存在堆中的对象,那么参数得到的就是地址
作者: 巴拉森    时间: 2015-7-5 22:24
如果局部变量有  I类型  那么就会在局部变量 来找这个I  ;main 是一个主方法  ,所以打印的是I
作者: 巴拉森    时间: 2015-7-5 22:25
巴拉森 发表于 2015-7-5 22:24
如果局部变量有  I类型  那么就会在局部变量 来找这个I  ;main 是一个主方法  ,所以打印的是I ...

如果局部方法有  I类型  那么就会在局部方法 来找这个I  ;main 是一个主方法  ,所以打印的是I
作者: 鹰隼展翼    时间: 2015-7-5 22:28
test1方法没有返回值,在主函数中不能收到i的返回值,所以在主函数中定义i=4,输出就是4
作者: 张恩祺    时间: 2015-7-5 23:25
这个是方法特性的时候会讲,,在leftshift方法上以及方法内,i和j都是局部变量,超出这个范围就没有了
作者: 942932576    时间: 2015-7-6 07:34
public static void leftshif中void表示没有返回值,且leftshift中的成员变量为局部变量,主函数中的i的值是没有变化的!希望能帮助到你
作者: 改变    时间: 2015-7-6 08:54
看到各位大神的解答,感觉你们都好强啊,压力山大。
作者: fantianfei    时间: 2015-7-6 10:05
public class Test1
        {
        public static void leftshift(int i, int j)
                {
                   i+=j;
                                   System.out.println(i);
        }
        public static void main(String args[])
                {
                int i = 4, j = 2;
                leftshift(i, j);
                 
        }
}
作者: fantianfei    时间: 2015-7-6 10:08

class OperationDemo
{
      public static int leftshift(int i, int j) {
                   i+=j;
                                   return i;
        }
        public static void main(String args[]) {
                int i = 4, j = 2;
                i=leftshift(i, j);
                System.out.println(i);
        }
}
这样也可以
作者: wing-SF    时间: 2015-7-6 11:52
变量生命周期的问题
作者: qihuan    时间: 2015-7-6 22:05
  1. public class Test1 {
  2.         public static void leftshift(int i, int j) {
  3.                 i+=j;
  4.                 System.out.println(i);
  5.         }
  6.        
  7.         public static void main(String args[]) {
  8.                 int i = 4, j = 2;
  9.                 leftshift(i, j);  
  10.         }
  11. }
复制代码


这个结果是6
作者: 赵文斌    时间: 2015-7-6 22:18
你计算出6,是因为你错误的以为Test1这个方法有返回值,其实他没有返回值,所以呢main函数打印不出局部变量
作者: 如初见    时间: 2015-7-6 22:51
4L说的对。。
作者: 夜写意    时间: 2015-7-6 22:58
这个是基本数据类型的作用域问题。方法内的变量只对此方法的作用域内有效,不会影响到main函数内的i与j。
作者: qian0217wei    时间: 2015-7-6 23:00
传递进去的和你本身的并没有任何关系,你要是想有关系,就必须要加上静态修饰!这样传递的时候就可以保证了!
作者: 夜写意    时间: 2015-7-6 23:02
夜写意 发表于 2015-7-6 22:58
这个是基本数据类型的作用域问题。方法内的变量只对此方法的作用域内有效,不会影响到main函数内的i与j。 ...

补充下,如果传过去的是数组,对其的操作是有效的。
作者: 凶狠搞Android    时间: 2015-7-6 23:10
因为System.out.println(i),这句话只是打印了你初始化为4的i 的值,   leftShift()方法,根本没有返回值,运不运行,对这个结果没有影响..
作者: 凶狠搞Android    时间: 2015-7-6 23:16
  1. class Test1
  2. {
  3.         public static int leftShift(int i, int j)
  4.         {
  5.                 return i+=j;
  6.         }
  7.         public static void main(String[] args)
  8.         {
  9.                 int i = 4;
  10.                 int j = 2;
  11.                 System.out.println(leftShift(i ,j));
  12.         }
  13. }
复制代码

楼主改成这样,才打印出来的是相加后的结果


作者: CLTDEZHUCE    时间: 2015-7-6 23:22
值没有返回给主函数




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