当前位置:编程学习 > JAVA >>

问一道引用变量的题

public class Example {                
             String str = "hello,java";               
              char[] ch ={'a','b','c'};                
  public void change(String str,char ch[]){                     
            str = "test ok";                    
             ch[0]='G';                 
}
 public static void main(String[] args){             
                Example ex = new Example();             
                ex.change(ex.str,ex.ch);            
                 System.out.println(ex.str+"....");             
                System.out.println(ex.ch);
请问,为什么结果 ex.ch变成了GBA而ex.str却还是 "hello,java"呢?

打印结果是
hello,java....
Gbc java 引用变量 --------------------编程问答-------------------- str,ch都是形参
更确切的说他们都是引用,引用不代表对象,但是通过引用可以操作对象。
str = "test ok";这句是对形参进行从新复制,学过c语言都知道,这是不可能改变实参的值的,因为java全部都是值传递,而不是对象传递,你传给函数一个实参,其实只是传递了实参的引用。
 ch[0]='G';就不一样了,这里ch指向了实参引用的对象,所以通过对引用的操作会影响到对象的状态,如果这里改成ch=new String[]{'G','b','c'};将改变不了实参的值,输出依然是abc --------------------编程问答-------------------- str = "test ok";  是创建新对象,而不是改变原有的值,String实例一旦生成就不会改变. --------------------编程问答-------------------- String类型创建的实例,内容是不可改变的,str = "test ok";是创建了一个新的String对象,内容为“test ok”,而原来的对象的内容并没有改变,所以调用change方法后还是原来的内容,不会改变 --------------------编程问答-------------------- 楼主的这个问题很好,让人更深刻的思考java的方法调用,我觉得可以这样解释:

在这个方法调用的过程中,有两个引用,一个就是调用时的实参,类成员ex.str,另一个当然是change方法里面的str,关键是这个str的作用域仅限于方法内。

那么,当方法调用发生时,通过参数传递,使方法内的str也指向了"hello,java",而在方法内,又
对方法内的str重新赋值,使其指向"test ok",而对象的成员变量ex.str不会因此受影响,仍然指向"hello,java".

我觉得理解这个问题的关键在于方法外部和方法内部两个引用变量的认识,外面的也就是实参,方法内的是形参。

而字符数组的元素,是基本类型数据,基本类型数据不存在引用,它的赋值操作也就不是引用的重定向,而是直接对数据存放地址中的值做改变。不知大家觉得对不。 --------------------编程问答-------------------- 我是来学习的~~~~~~~~~~ --------------------编程问答-------------------- 首先你得明白两个str的作用域。第一个是全局变量,而后一个str是函数内部的变量,作用域只在函数内部。你的这道题根本就没有改变过全局变量str的值,你的第一个输出语句输出的也是全局变量str的值,所以当然输出hellojava啦。但是,你把char数组的第一个元素赋值为G,这是对数组进行操作,结果当然会变啦!java的参数传递方式只有值传递。那么对于基本类型的参数传递则是变量值的复制。也就是对G的复制,然后用G覆盖a的值。说的有点啰嗦,还望见谅 --------------------编程问答-------------------- 因为str是常量对象。
str1 ="abc";
str2 = str1;
str2 ="bcd";

这样,str1="abc";
LS那些说值传递和引用传递的什么意思呢。
这里全部都是对象了,String ,数组 都是对象,都是传递引用了吧。
! --------------------编程问答-------------------- 这个跟c里面的指针和指向指针的指针有点像

str 就是个指针 
char[] 是指向指针的指针

change里改为
ch ={'e','f','g'};  输出也不会变
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,