BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #53078同步于 2016/9/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

[问题][讨论]java String类与普通类参数传递时是否有区别,区别

liuzc
2016/9/20镜像同步10 回复
我们宿舍讨论结果是没有区别。欢迎来喷 只是在显现的使用String类时和普通类表达不一样,给人感觉不一样。 示例一: class Demo{ int temp = 30 ; // 此处为了方便,属性暂时不封装 }; public class RefDemo01{ public static void main(String args[]){ Demo d1 = new Demo() ; // 实例化Demo对象,实例化之后里面的temp=30 d1.temp = 50 ; // 修改temp属性的内容 System.out.println("fun()方法调用之前:" + d1.temp) ; fun(d1) ; System.out.println("fun()方法调用之后:" + d1.temp) ; } public static void fun(Demo d2){ // 此处的方法由主方法直接调用 d2.temp = 1000; // 修改temp值 } }; 结果 fun()方法调用之前:50 fun()方法调用之后:1000 示例二: public class RefDemo02{ public static void main(String args[]){ String str1 = new String(); str1 = "hello" ; System.out.println("fun()方法调用之前:" + str1) ; fun(str1) ; System.out.println("fun()方法调用之后:" + str1) ; } public static void fun(String str2){ str1 = "MLDN" ; } }; 结果: fun()方法调用之前:hello fun()方法调用之后:hello 再看一个示例: final class Demo{ int temp = 30 ; String aa= "1"; }; public class Hello{ public static void main(String args[]){ Demo d1 = new Demo() ; d1.temp = 10; System.out.println("fun()方法调用之前:" + d1.aa) ; fun(d1) ; System.out.println("fun()方法调用之后:" + d1.aa) ; } public static void fun(Demo d2){ d2 = new Demo(); } }; 结果: fun()方法调用之前:10 fun()方法调用之后:10 查看String源友之后,讨论结果: 1、String对象的任何修改操作都是一个new 操作。 2、java参数传递只有值传递。 3、任何类在子函数里使用new操作修改之后的值是不会回传的。 使用C指针说明: #include <stdio.h> #include <stdlib.h> #include <string.h> void fun(int *fp) { //问题就在这里边 *fp=2; //这时,变量 fp, ap 指向的是同一个堆空间,修改的是同一个内容。 } void fun_new(int *fp) { fp = (int *)malloc(sizeof(int)); *fp = 3; //问题就在这里边 ,上边的操作就是一个new的操作。入参指向已经改变为另一个堆空间。 //这个 fp变量是属于当前函数的栈空间的,在函数返回时就销毁了。 //出现不理解的情况就是String类的new操作的重载 /* eg: String a="aaaa"; String a = new String("aaaa"); 这两个操作是一样的效果, 如果使用第二种更好理解些(String类的任何修改串操作都是一个new) */ } int main() { int a=1; int *ap=&a; printf("%d\n", *ap); fun(ap); printf("%d\n", *ap); printf("-----------------------\n"); printf("%d\n", *ap); fun_new(ap); printf("%d\n", *ap); }
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
panshanwhut机器人#1 · 2016/9/20
不看了,天天这种题好累
dss886机器人#2 · 2016/9/20
不要把C/C++的引用传递、值传递带到Java里面来,可以简单理解为:Java里面没有值传递,全部都是引用传递(只不过基本类型拷贝了一下) Demo1的fun,参数d2是d1的引用,改变d2的对象属性值,d1也会变; Demo2的fun,参数str2是str1的引用,把str2指向另外一个对象("MLDN"),str1还是指向原来的对象("hello"); Demo3的fun,参数d2是d1的引用,把d2指向一个新的对象,d1还是指向的原来的对象; 这里没有涉及到String不可变的问题,任意一个对象都是这样的行为。 实际上对Java来说,因为没有指针(或者说所有引用都是指针),引用存放在栈内,对象存放在堆上,参数行为跟C/C++的引用传递其实还有点区别
liuzc机器人#3 · 2016/9/20
那是讲解,不是题 【 在 panshanwhut 的大作中提到: 】 : 不看了,天天这种题好累
liuzc机器人#4 · 2016/9/20
1、把C/C++的引用传递、值传递带到Java里面来,只是对比的理解一个过程。 2、关于没有涉及到String不可变的问题,任意一个对象都是这样的行为。 我不认为这事,如果String可变的话,那么 String a = "123456" 改成 a = "789" 的时候,就可能会出现"789"所在地址应该和"123456"是一个地址 存的内容为 “789\056” 比如C/C++就是这样。所以在java 中有一个StirngBuffer类实现这个类似的功能。 3、关于Java里面没有值传递,全部都是引用传递(只不过基本类型拷贝了一下) java里总是按值传递的,并没有使用引用传递。 java 对象看起来像引用传递,实际上并不是值传递,传递的这个值是对象的地址。如果在方法中new 一个新地址块,那新在方法中的新对象变量就指向了新的对象地址。所以修改效果并不能带到方法入参对象指向的对象地址内容。
liuzc机器人#5 · 2016/9/20
1、把C/C++的引用传递、值传递带到Java里面来,只是对比的理解一个过程。 2、关于没有涉及到String不可变的问题,任意一个对象都是这样的行为。 我不认为这事,如果String可变的话,那么 String a = "123456" 改成 a = "789" 的时候,就可能会出现"789"所在地址应该和"123456"是一个地址 存的内容为 “789\056” 比如C/C++就是这样。所以在java 中有一个StirngBuffer类实现这个类似的功能。 3、关于Java里面没有值传递,全部都是引用传递(只不过基本类型拷贝了一下) java里总是按值传递的,并没有使用引用传递。 java 对象看起来像引用传递,实际上并不是值传递,传递的这个值是对象的地址。如果在方法中new 一个新地址块,那新在方法中的新对象变量就指向了新的对象地址。所以修改效果并不能带到方法入参对象指向的对象地址内容。 【 在 dss886 的大作中提到: 】 : 不要把C/C++的引用传递、值传递带到Java里面来,可以简单理解为:Java里面没有值传递,全部都是引用传递(只不过基本类型拷贝了一下) : Demo1的fun,参数d2是d1的引用,改变d2的对象属性值,d1也会变; : Demo2的fun,参数str2是str1的引用,把str2指向另外一个对象("MLDN"),str1还是指向原来的对象("hello"); : ...................
dss886机器人#6 · 2016/9/20
我C++学得不好,还是请暖神来解答一下吧@nuanyangyang 【 在 liuzc 的大作中提到: 】 : : 1、把C/C++的引用传递、值传递带到Java里面来,只是对比的理解一个过程。 :
nuanyangyang机器人#7 · 2016/9/20
【 在 dss886 的大作中提到: 】 : 我C++学得不好,还是请暖神来解答一下吧@nuanyangyang : : String就是普通的对象。没区别。
nuanyangyang机器人#8 · 2016/9/20
【 在 panshanwhut 的大作中提到: 】 : 不看了,天天这种题好累 就是的,累。 根本问题根本不是String,而是局部变量和类成员变量的区别。懒得解释了。
dss886机器人#9 · 2016/9/20
2333,看来是我找工作太闲了,刷题去了[ema1] 【 在 nuanyangyang 的大作中提到: 】 : : 就是的,累。 : 根本问题根本不是String,而是局部变量和类成员变量的区别。懒得解释了。