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

请教一个值传递的问题,请千万要教教我代码在

public class N9{
    String str=new String("good");
    char[]ch={'a','b','c'};
    public static void main(String args[])
    {
        N9 ex=new N9();
        ex.change(ex.str,ex.ch);
        System.out.print(ex.str+" and ");
        System.out.print(ex.ch);
        }
    public void change(String str,char ch[]){
        str="test ok"; ch[0]='g';
    }
    
}
为什么结果是good  and gbc这个传递是怎么传的  为什么用数组就变了?

太感谢了 --------------------编程问答-------------------- 数组传的是 ch的首地址 会改变ch指向内存的值 --------------------编程问答-------------------- 传的是地址值 --------------------编程问答-------------------- java用类名声明的变量实际上是对象的引用,引用做参数实际上会复制引用变量,change方法中的str和ch分别是和main中的str、ch指向同一对象的引用,str="test ok";执行之后str指向了新的对象"test ok",main中的str不变; ch[0]='g';这句话直接操作数组对象,main中的ch也改变,如果改成ch=new char[]{'g'},main中ch就不变了 --------------------编程问答-------------------- lz学习java没有多久吧,这个问题是很多爱思考的初学者遇到的一个问题,我想lz很明白后面的数组值被换的原理吧,而是不明白String类型的却没有改变值吧:
1.先说说数组变的原因,因为传的是指向一个堆地址的引用,你在change方法内利用指向这个堆地址的引用向堆发出命令修改了堆中的值,所以另一指向这个堆的引用读取到的值是修改后的。
2.至于String没有变,楼主听过String类型是不可变的字符串对吧,就是这个不变导致这个"幻想",针对这个问题,String str=new String("good");str引用指向堆中存放new String("good")这个对象的地址,但是String类型跟别的引用类型有一个区别,就是"good"是存放在字符串常量池中的,一旦在字符串常量池中创建了,就会固定在常量池里面,然后调用change(str)方法时,会在方法内创建一个引用,也指向方法外创建的对象在堆中的地址,这个时候在方法内部的代码:str="test ok";的作用是在常量池中初始化一个字符串"test ok",然后将方法内部的这个引用指向常量池中的"test ok",而方法外部的引用还是指向原来对象在堆中的地址,所以是没有改变外部的str的。

记住一点:
引用类型传的是引用没有错,本质上是会在方法内部创建一个新引用,这个引用存放在栈中,这个新的引用和外部传进来的引用在栈中是两个不同的值,但是他们指向堆中同一块地址,当用一个引用调用方法时,另一个引用获取值时能改变的前提是这个堆中的值改变了,如果仅仅是将一个引用指向另一个地址,另外一个引用是不会受影响的,这个String类型就是这个原理。

不知道我将清楚没有,希望lz学习进步~ --------------------编程问答-------------------- change()中间的str覆盖了域中间的str啊,修改为this.str="test ok" 即可,与string是否是可变无关啊。
膜拜一下楼上的大神OTZ --------------------编程问答-------------------- ffff

引用 5 楼 u012220365 的回复:
change()中间的str覆盖了域中间的str啊,修改为this.str="test ok" 即可,与string是否是可变无关啊。
膜拜一下楼上的大神OTZ

同意楼上 --------------------编程问答-------------------- 4楼说的很详细,简单的说其实就是String的特殊性,《Java编程思想》关于String那一章的开头说的很清楚了:
String对象是不可修改的对象,一起看起来会修改String的方法其实都是创建了新的String对象 --------------------编程问答--------------------
引用 7 楼 lg1544650023 的回复:
4楼说的很详细,简单的说其实就是String的特殊性,《Java编程思想》关于String那一章的开头说的很清楚了:
String对象是不可修改的对象,一起看起来会修改String的方法其实都是创建了新的String对象

与String是否可变无关好不 --------------------编程问答-------------------- String 默认是final修饰的不可改变变,ch传递的是数组的引用(相当于一个临时的ch指向了原来的ch的地址并改了它的第一个值); --------------------编程问答-------------------- 数组是地址传递就像传递对象一样你把堆里的内存改了所以指向地址的值都变成改后的那个值了
字符串是值传递只有当前类中变了原来的类里值没变
你可以多了解一下内存! --------------------编程问答-------------------- 9 楼讲的final 与String 是不可变类没有关系,final 只是表示String 类不可被继承。

请讲讲 change()中间的str覆盖了域中间的str啊,这个域指的是?   灰常感谢
引用 5 楼 u012220365 的回复:
change()中间的str覆盖了域中间的str啊,修改为this.str="test ok" 即可,与string是否是可变无关啊。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,