关于基本数据类型的生命周期 public class Test{ public static void mian(String args[]){ String str=""; test(i); System.out.println(i);//输出结果是空值。 } public static void test(String str){ str = "string"; }}我的理解是应该输出“string”。求这位大侠解释。越详细越好。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不好意思写错了。是这样的:public class Test{ public static void mian(String args[]){ String str=""; test(str); System.out.println(str);//输出结果是空值。 } public static void test(String str){ str = "string"; }} 代码写错了吧,我想你应该是写下面这种的:public class Test{ public static void mian(String args[]){ String str=""; test(str); System.out.println(str);//输出结果是空值。 } public static void test(String str){ str = "string"; }}执行的结果仍然是打印了一个空,这和变量的生命周期无关,是java中方法参数传递的问题,你把str传递给test(),实际上是把str先拷贝一份,再传递给形参去执行方法,原来的str没有发生任何改变... public static void test(String str){//传递的是实参的拷贝 str = "string";//改变的是局部变量的值 } String 对象时值类型,而不是引用类型。值怎么会改变了。结果任然为空。你可以吧String 换成数组类型。保证就改变了。 http://blog.csdn.net/zwnylsf/article/details/7385348,我也在学习java,自己总结的,关于参数传递 举个例子给你看看吧String str="ddd";String a=str;a="yyy";你输出str的时候,并不是yyy再来一个ArrayList d=new ArrayList();ArrayList c = d;c.add("dd");这时候d.size()是1,通过c改变了d.而String是一个不可变的对象,改了a的引用而已.再一个再来一个ArrayList d=new ArrayList();-->这里有一个ArrayList对象ArrayList c = d;-->这里c和d都是引用同一个对象c=new ArrayList();-->这里c引用了新的对象.c.add("dd");这时候d.size()是0,c引用了新的对象,与d无关了. public class Test{ public static void mian(String args[]){ String str=""; test(i); System.out.println(i);//输出结果是空值。 } public static void test(String str){ str = "string"; }}你这个代码的效果和下面代码的效果是一样的public class Test{ public static void mian(String args[]){ String str=""; test(i); System.out.println(i);//输出结果是空值。 } public static void test(String s){ //该s只是一个局部变量而已 s= "string"; }} 我也是新手,我是这么理解的 :你在main中定义了一个String str 是吧?然后在test方法中又定义了一个String str对吧? 我个人认为只要一带数据类型 就相当于这个新的和原来的根本不是一个东西,这压根就是俩个str 只不过是变量作用域不同。不知道理解的有没有错?欢迎高手拍砖~ 这样理解好理解:比如你的方法test(String str1),事实上它是直接在这方法域里面new的一个String。然后通过克隆的方式把test(str2)里str2的值克隆到str1中。无论你怎么改变str1的值,它始终在此方法域中。并不是改变了str2的值。但如果你test(String str1)要返回ste1,然后赋值给str2,那str2就会变了,因为str2又指向被把别的str1的值了。如:public class Test{ public static void mian(String args[]){ String str=""; str = test(str); System.out.println(str);//输出结果是string。 } public static String test(String str){ str = "string"; return str; }} 我来回答吧,首先,String是引用类型的,但因为String是final(即不可变的),所以,在方法中的str=“string”的结果是把str指向了新的对象,而main方法中的str并没有变,仍指向“”;另外,传递的时候的确是把str的引用copy给了新的str;不知道解释的明白不??? 这就涉及到值参数还是引用参数了,String是值参数,所以生命周期只在方法体内。而比如数组,集合类的是引用参数就不一样了。 public static void main(String args[]) { String[] str = new String[1]; test(str); System.out.println(str[0]);//输出结果是string。 } public static void test(String[] str) { str[0] = "string"; } 主方法 main()都拼错了 请问你的编译能通过?还有这个事作用域的问题,str只是作为test()的参数,不管在test()方法里你做了什么是不会影响到main()方法里str的值。你可以这样理解,参数只是被利用的 swing添加和关闭类似位置的按钮并且响应事件 如何用java来读取数学方程和非线性函数 GM你出来,为什么我下载后评分也不把分补回来。 请问怎样用Applet Tree上的节点来连接到不同的页面? 还是这个问题,问了好多人了也没懂,所以另起一页。 【好东西,大家来看啊~!(绝非广告)】 intValue()方法调用问题 一个简单输出的问题~~为什么呢~~~ 紧急求助!难倒了好多大牛了! 我用Jar打包为什么不能正常显示? 插入一条有语句 SSH 一个struts2中pojo奇怪的问题.
public static void mian(String args[]){
String str="";
test(str);
System.out.println(str);//输出结果是空值。
}
public static void test(String str){
str = "string";
}
}
public static void mian(String args[]){
String str="";
test(str);
System.out.println(str);//输出结果是空值。
}
public static void test(String str){
str = "string";
}
}执行的结果仍然是打印了一个空,这和变量的生命周期无关,是java中方法参数传递的问题,你把str传递给test(),实际上是把str先拷贝一份,再传递给形参去执行方法,原来的str没有发生任何改变...
str = "string";//改变的是局部变量的值
}
你可以吧String 换成数组类型。保证就改变了。
String a=str;a="yyy";你输出str的时候,并不是yyy
再来一个
ArrayList d=new ArrayList();
ArrayList c = d;c.add("dd");
这时候d.size()是1,通过c改变了d.
而String是一个不可变的对象,改了a的引用而已.
再一个
再来一个
ArrayList d=new ArrayList();-->这里有一个ArrayList对象
ArrayList c = d;-->这里c和d都是引用同一个对象
c=new ArrayList();-->这里c引用了新的对象.
c.add("dd");
这时候d.size()是0,c引用了新的对象,与d无关了.
public static void mian(String args[]){
String str="";
test(i);
System.out.println(i);//输出结果是空值。
}
public static void test(String str){
str = "string";
}
}
你这个代码的效果和下面代码的效果是一样的
public class Test{
public static void mian(String args[]){
String str="";
test(i);
System.out.println(i);//输出结果是空值。
}
public static void test(String s){ //该s只是一个局部变量而已
s= "string";
}
}
你在main中定义了一个String str 是吧?
然后在test方法中又定义了一个String str对吧?
我个人认为只要一带数据类型 就相当于这个新的和原来的根本不是一个东西,这压根就是俩个str 只不过是变量作用域不同。不知道理解的有没有错?欢迎高手拍砖~
比如你的方法test(String str1),事实上它是直接在这方法域里面new的一个String。然后通过克隆的方式把test(str2)里str2的值克隆到str1中。
无论你怎么改变str1的值,它始终在此方法域中。并不是改变了str2的值。
但如果你test(String str1)要返回ste1,然后赋值给str2,那str2就会变了,因为str2又指向被把别的str1的值了。如:public class Test{
public static void mian(String args[]){
String str="";
str = test(str);
System.out.println(str);//输出结果是string。
}
public static String test(String str){
str = "string";
return str;
}
}
String是值参数,所以生命周期只在方法体内。
而比如数组,集合类的是引用参数就不一样了。
public static void main(String args[]) {
String[] str = new String[1];
test(str);
System.out.println(str[0]);//输出结果是string。
} public static void test(String[] str) {
str[0] = "string";
}
你可以这样理解,参数只是被利用的