黑马程序员技术交流社区
标题:
一直纠结的弱智问题
[打印本页]
作者:
zhangx
时间:
2013-4-13 17:58
标题:
一直纠结的弱智问题
本帖最后由 zhangx 于 2013-4-14 09:05 编辑
这应该属于String的堆内存和栈内存的运行过程,一直不懂,而且总是混淆,有没有能分清的好方法。
第一个
public class Demo01{
public static void main(String args[]){
String str1 = "hello" ; // 实例化字符串对象
System.out.println("fun()方法调用之前:" + str1) ;
fun(str1) ; // 调用fun()方法
System.out.println("fun()方法调用之后:" + str1) ;
}
public static void fun(String str2){ // 此处的方法由主方法直接调用
str2 = "world" ;
}
};
第二个:
class Demo{
String temp = "hello" ;
};
public class RefDemo02{
public static void main(String args[]){
Demo d1 = new Demo() ; // 实例化Demo对象
d1.temp = "world" ;
System.out.println("fun()方法调用之前:" + d1.temp) ;
fun(d1) ;
System.out.println("fun()方法调用之后:" + d1.temp) ;
}
public static void fun(Demo d2){
d2.temp = "hello world" ;
}
};
这两个代码是这么运行的,它们有什么区别?
作者:
①人←①城市
时间:
2013-4-13 18:33
两个基本都一样,
这里就说第一个吧.
这应该属于String的堆内存和栈内存的运行过程,一直不懂,而且总是混淆,有没有能分清的好方法。
第一个
public class Demo01{
public static void main(String args[]){
String str1 = "hello" ; // 实例化字符串对象 --
这里不叫实例化, 只是在栈初始化一个属性,而且属于局部变量
System.out.println("fun()方法调用之前:" + str1) ;
fun(str1) ; // 调用fun()方法 --
是值传递,不是引用传递,而str1的值不变,作用域的问题
System.out.println("fun()方法调用之后:" + str1) ; --
打印的还是局部变量中的str1值,也就是hello
}
public static void fun(String str2){ // 此处的方法由主方法直接调用
str2 = "world" ;
}
};
作者:
CrazyProgram
时间:
2013-4-13 18:36
本帖最后由 CrazyProgram 于 2013-4-13 18:39 编辑
class Demo{
String temp = "hello" ;
};
public class Demo2{
public static void main(String args[]){
Demo d1 = new Demo() ; // 实例化Demo对象
d1.temp = "world" ; // 对Demo的temp的值进行覆盖,成为world
System.out.println("fun()方法调用之前:" + d1.temp) ;//打印world
fun(d1) ;//调用下面的函数,传个Demo的对象并修改值为hello world;
System.out.println("fun()方法调用之后:" + d1.temp) ;//打印出hello world
}
public static void fun(Demo d2){
d2.temp = "hello world" ;
}
};
复制代码
public class Demo1{
public static void main(String args[]){
String str1 = "hello" ; // 实例化字符串对象
System.out.println("fun()方法调用之前:" + str1) ;
fun(str1) ; // 调用fun()方法
System.out.println("fun()方法调用之后:" + fun(str1)) ;
}
public static String fun(String str2){ // 此处的方法由主方法直接调用
str2 = "world" ;
return str2;
}
};
复制代码
你写的第一个没意义,打印的都是str1,都帮你改了下,解释都有
区别就是: 一个传入的是字符串,进行覆盖
另一个就是传入一个对象,改变属性的值
作者:
张先龙
时间:
2013-4-13 21:33
我记得老师说过,String str =“XXXXXXX”,这种方式的字符串是常量,,,不太明白1L说的为什么会是局部变量
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2