java程序String类型作为参数的问题
一般来说,java里面A类调用B类的方法,并传递参数X()类型,因为通常实参是一个对象的引用,所以在B类的方法中修改传来的参数,在A类的原型也会发生变化。但我试过当实参为...
一般来说,java里面A类调用B类的方法,并传递参数X()类型,因为通常实参是一个对象的引用,所以在B类的方法中修改传来的参数,在A类的原型也会发生变化。但我试过当实参为String类型时,在B类修改传入参数不会对A类的原型产生影响。为什么?除了String类型还有其他类型是这样的吗? (谢阅)
第一行X()类型应该是X(类型),开始写错了 展开
第一行X()类型应该是X(类型),开始写错了 展开
展开全部
很高兴看到你的问题,我刚学Java那会也一直有这个疑问,前段时间我写了篇关于String的文章,其中有一段是解释这个问题的,希望你能明白。内容如下:
记得刚学习参数方法的时候有一个问题一直困扰着我:就是引用类
型的参数,经过方法修改后可以保留修改,也许我描述的不是很明确,看看代码:
public static void main(String[] args) {
String str = "abc";
appendStr(str);
System.out.println(str);
}
private static void appendStr(String str){
str += "def";
}
运行结果是“abc”而不是我想要的“abcdef”,不是说String是引用类型吗,怎么会这样?我想是不是String str = "abc"; 的问题,我就换成了这样:String str = new String("abc"); 可还是一样。
解惑:
首先String是一个不可变类型,也就是说从声明那一刻起内存大小是固定的不可改变的,那么str += "def"; 这行代码背后又有什么不可告人的秘密呢?既然说了String是不可变的,你还愣是给加一个“def”,没办法JVM只能再开辟一块新的内存,把“abcdef”放进去,然后把新的地址给了str(appendStr方法中的),如果你在appendStr方法中输出str的值肯定是“abcdef”,也就是说appendStr方法中根本就没有改变初始存放“abc”那块内存的值(当然它想改也改了),当这个方法返回时main方法中的str依然是那个没修改前的引用,当然还是输出“abc”了。
记得刚学习参数方法的时候有一个问题一直困扰着我:就是引用类
型的参数,经过方法修改后可以保留修改,也许我描述的不是很明确,看看代码:
public static void main(String[] args) {
String str = "abc";
appendStr(str);
System.out.println(str);
}
private static void appendStr(String str){
str += "def";
}
运行结果是“abc”而不是我想要的“abcdef”,不是说String是引用类型吗,怎么会这样?我想是不是String str = "abc"; 的问题,我就换成了这样:String str = new String("abc"); 可还是一样。
解惑:
首先String是一个不可变类型,也就是说从声明那一刻起内存大小是固定的不可改变的,那么str += "def"; 这行代码背后又有什么不可告人的秘密呢?既然说了String是不可变的,你还愣是给加一个“def”,没办法JVM只能再开辟一块新的内存,把“abcdef”放进去,然后把新的地址给了str(appendStr方法中的),如果你在appendStr方法中输出str的值肯定是“abcdef”,也就是说appendStr方法中根本就没有改变初始存放“abc”那块内存的值(当然它想改也改了),当这个方法返回时main方法中的str依然是那个没修改前的引用,当然还是输出“abc”了。
展开全部
LS正解,java中都是以传值的方式进行传参的,对于基本数据类型,将其作为参数传递的时候传递的就是这个基本数据类型的值,而对于对象类型,例如:传递的是一个String类型的字符串或者你自己定义的一个类的对象作为参数,这时候传递的是这个对象对应的内存地址,就是它的引用,而你后面的代码对这个参数进行修改的时候,它会先找到他的内存地址,然后修改与内存地址对应的对象,当然也就修改了原先的对象了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
String首先不是基本类型。。。。
你可以查看String得源代码,传递string的时候,实际操作的是char数组,也就是类似str.toCharArray(),这里面生成了新的对象,所以操作string对象对应的数组不会影响到传入的string参数的。
你可以查看String得源代码,传递string的时候,实际操作的是char数组,也就是类似str.toCharArray(),这里面生成了新的对象,所以操作string对象对应的数组不会影响到传入的string参数的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实java中都是传值的,值是这个对象的物理地址,所以会造成传引用这用错觉,
而java的基础类型,如int,float,string 在传进方法后,程序会有一个拷贝,即把原参数拷贝了一份新的,修改的是新的拷贝而不是原参数,所以不会改变。
而java的基础类型,如int,float,string 在传进方法后,程序会有一个拷贝,即把原参数拷贝了一份新的,修改的是新的拷贝而不是原参数,所以不会改变。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Java传的永远都是值,字符串对象一旦创建就不能更改。
void change(String s)
{
s = "456"
}
String b = "123";
change(b);
上面的代码,你是不是认为"123"变为了"456"了呢?
其实没有。调用change(b)时,将b的值的一个副本(假设是b1)传入方法
执行 b1 = "456",其实是让b1指向了一个新的对象"456"
原来的b值没变,原来的b值指向的"123"也没变,依旧是b="123"
记住Java传的是值和字符串对象一旦创建就不可改变,这个问题就好理解了。如果可以,去看看对象和对象引用在内存中的存储方式,你可能会对这个问题理解得更透彻
void change(String s)
{
s = "456"
}
String b = "123";
change(b);
上面的代码,你是不是认为"123"变为了"456"了呢?
其实没有。调用change(b)时,将b的值的一个副本(假设是b1)传入方法
执行 b1 = "456",其实是让b1指向了一个新的对象"456"
原来的b值没变,原来的b值指向的"123"也没变,依旧是b="123"
记住Java传的是值和字符串对象一旦创建就不可改变,这个问题就好理解了。如果可以,去看看对象和对象引用在内存中的存储方式,你可能会对这个问题理解得更透彻
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询