我们宿舍讨论结果是没有区别。欢迎来喷
只是在显现的使用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
示例二String类:
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操作修改之后的值是不会回传的。
4、java String类与普通类参数传递时没区别,都是值传递
使用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);
}