黑马程序员技术交流社区

标题: 关于静态的小程序问题。 [打印本页]

作者: ok-Prince    时间: 2014-4-9 13:41
标题: 关于静态的小程序问题。
本帖最后由 ok-Prince 于 2014-4-9 18:39 编辑

各位帮忙看看这个程序是怎么走的,为什么结果是4而不是2?
  1. class Cz2
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int x = 4;
  6.                 show(x);
  7.                 System.out.println(x);
  8.         }
  9.         public static void show(int x)
  10.         {
  11.                 x = 2;
  12.         }
  13. }
复制代码

程序调用了一次show方法,把2赋值给了x,为什么打印的最终结果却是4呢?
作者: 491138002    时间: 2014-4-9 14:06
代码中主函数的show(x)方法其实是show(4)实现的功能只是:4=2,就是把2赋值给4,很明显没有意义,x本身没有改变
作者: 年轻的老头    时间: 2014-4-9 14:08
public static void show(int a)         {                 a = 2;         }  换个名字你能看明白吗
作者: 为你而去    时间: 2014-4-9 14:17
这个要理解按值传递与按址传递的区别,按值传递(by value) 适用范围:8种基本数据类型、String对象 特点:在内存中复制一份数据,把复制后的数据传递到方法内部 作用:在方法内部改变参数的值,外部数据不会跟着发生改变 。 按址传递(by address) 适用范围:数组、除String以外的其他所有类型的对象,方法内部改变对象中的值,外部也会跟着改变
作者: tiuwing    时间: 2014-4-9 14:57
传入到show()方法中的只是变量X的值,在show()方法中,变量x只是用来接收传递进来的变量的值,
其实也就是相当于:   int  x=4;  int y =x;  y=2;
你觉得x的值会变吗?在Java只有按值传递。
作者: 斑驳の记忆    时间: 2014-4-9 16:14
在你的class Cz2类中的main()方法和show()方法中的x是不属于同一个变量的,要注意这个x变量的可用范围;而且你采用show(x)传递给show方法的不是变量X  而是变量X的值4;
作者: Shimano    时间: 2014-4-9 16:43
参数的传递:
        和其他变编程语言一样,在定义方法时,就会有参数的传递,方法参数包括圆括号内的常量值、变量表达式、常量。
        在定义方法时,方法中的参数成为形式参数(形参),是用来反映参数的类型及其个数的;当我们调用该方法时,
        这时的参数成为实际参数(实参)。通过参数的传递,可以将变量的值传递给方法内部进行处理。
        Java中参数的传递有如下两种:
1.值传递:
        基本类型参数所传递的参数都是基本数据类型,包括数值型,布尔型等。在这种情况下,所有参数的传递都采用值传递的方式。
        也就是说,当传递一个参数到方法时,方法获取的只是该参数的一个拷贝,因此方法不会改变参数变量的值,只是使用该变量的值。
2.址传递:
        对象引用型参数如果参数传递的是对象引用型参数(即一个对象),则方法获取的是对象的内存地址,因此方法可以改变该对象
        中的属性,但是不能改变对象本身。
       
这只是Java语言特点中内存管理机制造成的。个人感觉通过下边的代码,对于我们初学者先通过理解后记忆即可,后续随着知识的积累,再理解...
  1. public class Demo
  2. {
  3.         public static void add(int a, int b)
  4.         {
  5.                 int c = a + b;
  6.                 System.out.println("c="+c);
  7.                 a = c;
  8.                
  9.         }
  10.         public static void main(String[] args)
  11.         {
  12.                 //定义并初始化a,b
  13.                 int a = 10;
  14.                 int b = 20;
  15.                
  16.                 //调用方法
  17.                 add(a,b);
  18.                 System.out.println("a="+a);
  19.         }
  20. }
复制代码

打印结果:
c=30
a=10

由此可见,传递的参数是基本变量类型时,方法是不能改变参数变量的值的。
  1. public class Demo
  2. {
  3.         public static void change(String str, char ch[])
  4.         {
  5.                 str = "Changed";
  6.                 ch[0] = 'C';//将字符‘C’赋值给字符数组中第一个元素
  7.         }
  8.         public static void main(String[] args)
  9.         {
  10.                 //创建并初始化字符串对象,及字符数组对象
  11.                 String s = new String("World");
  12.                 char[] ch = {'H','e','l','l','o'};
  13.                
  14.                 System.out.println(s);//打印原始字符串
  15.                 getCharArray(ch);//打印原始字符串中的元素               
  16.                
  17.                 change(s,ch);//调用change()方法

  18.                 System.out.println(s);//打印处理后的字符串
  19.                 getCharArray(ch);//打印处理后字符串中的元素
  20.         }
  21.         public static void getCharArray(char ch[])
  22.         {
  23.                 for(int i=0; i<ch.length; i++)
  24.                 {
  25.                         System.out.print(ch[i]);
  26.                        
  27.                 }
  28.                 System.out.println();
  29.         }
  30. }
复制代码

打印结果:
World
Hello
World
Cello
由此可见,使用字符串对象和字符数组对象作为传递的参数,

方法调用后并不能改变字符串对象,但是可以改变字符数组对象变量的内容。


作者: ok-Prince    时间: 2014-4-9 18:39
大概的意思我懂了,谢谢大家!
作者: luoyilan222    时间: 2014-4-9 19:26
class Cz2 {
        public static void main(String[] args) {
                // 首先确定一下你这事定义的局部变量,局部变量只在当前方法中有效
                // int x = 4 这个x值在main方法中有效
                int x = 4;
                show(x);// 这里只是把4拷贝到show方法中的x
                // 你如果想要你说的那种效果可以这样做
                // 把 show(x);---> x = show(x);同时该show(int x)方法的返回值
                // public static int show(int x){
                //                 x = 2;
                //                 return x;
                // }
                //这样改写之后打印值肯定为2
                System.out.println(x);
        }

        public static void show(int x)// 这个X只在show方法中有效
        {
                x = 2;
        }
}





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