返回信息流我们宿舍讨论结果是没有区别。欢迎来喷
只是在显现的使用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);
}
这是一条镜像帖。来源:北邮人论坛 / java / #53078同步于 2016/9/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[问题][讨论]java String类与普通类参数传递时是否有区别,区别
liuzc
2016/9/20镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
不要把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++的引用传递其实还有点区别
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 一个新地址块,那新在方法中的新对象变量就指向了新的对象地址。所以修改效果并不能带到方法入参对象指向的对象地址内容。
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");
: ...................
我C++学得不好,还是请暖神来解答一下吧@nuanyangyang
【 在 liuzc 的大作中提到: 】
:
: 1、把C/C++的引用传递、值传递带到Java里面来,只是对比的理解一个过程。
:
【 在 dss886 的大作中提到: 】
: 我C++学得不好,还是请暖神来解答一下吧@nuanyangyang
: :
String就是普通的对象。没区别。
【 在 panshanwhut 的大作中提到: 】
: 不看了,天天这种题好累
就是的,累。
根本问题根本不是String,而是局部变量和类成员变量的区别。懒得解释了。
2333,看来是我找工作太闲了,刷题去了[ema1]
【 在 nuanyangyang 的大作中提到: 】
:
: 就是的,累。
: 根本问题根本不是String,而是局部变量和类成员变量的区别。懒得解释了。