String是类似值传递、String数组是引用传递
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Common c=new Common(1);
set(c,3);
c.disp();
}
public static void set(Common c,int a){
c.setA(a);
}
}
解析:引用传递的特点是,对象引用作为参数传递的是地址(相当于C语言中的指针),在调用函数中对引用的改变会反映到该引用对应的地址上。所以本例中在执行完set(c,3)后,c的属性a变成了3。大家应该都很熟悉,不在赘述。
s1[0] = new String("change");
s2="change";
}
}
解析:程序输出的结果将是change和hello,对于为什么输出hello前面已经解释过了,现在解释一下String数组作为参数为什么可以改变其值。大家来看String数组str1,数组元素保存的是String对象的引用,不是String对象本身的内容,那么数组元素就相当于一个指向指针的指针。当程序执行s1[0] = new String("change");的时候,改变的是s1[0]处的String引用(即不是s1[0]="change"),这和String的不可改变的性质并不矛盾,所以调用完change()函数,str[0]的内容已经变为了指向change的引用
String str2 = new String("hello");
chge.change(str1,str2);
System.out.println(str1[0]);
System.out.println(str2);
}
}
class Change {
public static void change(String[] s1,String s2){
示例二:
public class TestConstant{
public static void main(String args[]){
String str=new String("hello");
String str1=str;
str="123";
System.out.println(str);
System.out.println(str1);
}
}
解析:上面的程序会先后输出123和hello,由于str1仍然指向hello,所以hello所在内存没有被回收。
一、普通的类对象作为函数参数是引用传递
示例三:
class Common{
private int a;
public Common(int a){
this.a=a;
}
public void setA(int a){
this.a=a;
}
public void disp(){
System.out.println(a);
}源自文库
}
public class TestCommon{
public static void main(String args[]){
首先、我们必须牢记的一点是:java语言规范规定,String型变量指向的内存空间中的内容是不能被改变的,即String是不可改变的类!
示例一:
public class TestConstant{
public static void main(String args[]){
String str=new String("hello");
三、String数组作为变量作为函数参数是引用传递(即和一般普通类的引用传递相同)
public class TestArray{
public static void main(String[] args){
Change chge = new Change();
String[] str1 = {new String("hello"),new String("world")};
setString(strTest);
System.out.println(strTest);
}
private static void setString(String str){
str=str+"c";
}
}
解析:对于java初学者来说,很多人在执行程序以前一定认为输出的将会是"abc”,但是结果告诉我们输出的会是"ab",这就是String的“类似值传递”(即可以将String看做int,double等基本类型,这些基本类型作为参数是值传递,但String在java规范中又不是基本类型,所以此处称其为“类似值传递”)。在java中是将String看做引用类型的,既然如此,那此处到底是不是引用传递呢?可以明确的告诉大家,这里绝对是引用传递。那既然是引用传递,为什么却时值传递的效果呢?答案其实已经在开篇告诉大家了:java语言规范规定,String型变量指向的内存空间中的内容是不能被改变的。下面来详细解析一下,当我们刚开始调用setString()函数的时候,strTest和str同时指向了"ab”所在的内存单元,然后在setString()中试图改变str的值,根据String的不可改变性,此时系统会分配新的内存并令str指向该内存,该内存的内容为abc;而对于strTest他仍然指向原来的内存单元----即ab所在的内存单元,此处和示例二的道理相同。到这里读者应该明白原因了吧,其实仍然是引用传递,只不过由于String的不可变的性质,导致String变量作为参数的特殊性。
二、String变量作为函数参数是"类似值传递"
public class TestString{
public static void main(String args[]){
String strTest=new String("ab");
//String strTest="ab";这两种形式的定义,输出的都是ab
str="Welcome to Here";
System.out.println(str);
}
}
解析:毋庸置疑,此程序输出的将是“Welcome to Here”,但是给str重新赋值的操作(str="Welcome to Here"),不是简单的将str指向的原内存地址内容改为"Welcome to Here",而是从新分配一块内存用来存放"Welcome to Here",然后将str指向该新分配的内存地址。而原来的"hello"如果没有其他String变量指向它,那么他将被java的垃圾收集器回收;如果有其他的String变量指向它,它将在内存继续存在,比如:
set(c,3);
c.disp();
}
public static void set(Common c,int a){
c.setA(a);
}
}
解析:引用传递的特点是,对象引用作为参数传递的是地址(相当于C语言中的指针),在调用函数中对引用的改变会反映到该引用对应的地址上。所以本例中在执行完set(c,3)后,c的属性a变成了3。大家应该都很熟悉,不在赘述。
s1[0] = new String("change");
s2="change";
}
}
解析:程序输出的结果将是change和hello,对于为什么输出hello前面已经解释过了,现在解释一下String数组作为参数为什么可以改变其值。大家来看String数组str1,数组元素保存的是String对象的引用,不是String对象本身的内容,那么数组元素就相当于一个指向指针的指针。当程序执行s1[0] = new String("change");的时候,改变的是s1[0]处的String引用(即不是s1[0]="change"),这和String的不可改变的性质并不矛盾,所以调用完change()函数,str[0]的内容已经变为了指向change的引用
String str2 = new String("hello");
chge.change(str1,str2);
System.out.println(str1[0]);
System.out.println(str2);
}
}
class Change {
public static void change(String[] s1,String s2){
示例二:
public class TestConstant{
public static void main(String args[]){
String str=new String("hello");
String str1=str;
str="123";
System.out.println(str);
System.out.println(str1);
}
}
解析:上面的程序会先后输出123和hello,由于str1仍然指向hello,所以hello所在内存没有被回收。
一、普通的类对象作为函数参数是引用传递
示例三:
class Common{
private int a;
public Common(int a){
this.a=a;
}
public void setA(int a){
this.a=a;
}
public void disp(){
System.out.println(a);
}源自文库
}
public class TestCommon{
public static void main(String args[]){
首先、我们必须牢记的一点是:java语言规范规定,String型变量指向的内存空间中的内容是不能被改变的,即String是不可改变的类!
示例一:
public class TestConstant{
public static void main(String args[]){
String str=new String("hello");
三、String数组作为变量作为函数参数是引用传递(即和一般普通类的引用传递相同)
public class TestArray{
public static void main(String[] args){
Change chge = new Change();
String[] str1 = {new String("hello"),new String("world")};
setString(strTest);
System.out.println(strTest);
}
private static void setString(String str){
str=str+"c";
}
}
解析:对于java初学者来说,很多人在执行程序以前一定认为输出的将会是"abc”,但是结果告诉我们输出的会是"ab",这就是String的“类似值传递”(即可以将String看做int,double等基本类型,这些基本类型作为参数是值传递,但String在java规范中又不是基本类型,所以此处称其为“类似值传递”)。在java中是将String看做引用类型的,既然如此,那此处到底是不是引用传递呢?可以明确的告诉大家,这里绝对是引用传递。那既然是引用传递,为什么却时值传递的效果呢?答案其实已经在开篇告诉大家了:java语言规范规定,String型变量指向的内存空间中的内容是不能被改变的。下面来详细解析一下,当我们刚开始调用setString()函数的时候,strTest和str同时指向了"ab”所在的内存单元,然后在setString()中试图改变str的值,根据String的不可改变性,此时系统会分配新的内存并令str指向该内存,该内存的内容为abc;而对于strTest他仍然指向原来的内存单元----即ab所在的内存单元,此处和示例二的道理相同。到这里读者应该明白原因了吧,其实仍然是引用传递,只不过由于String的不可变的性质,导致String变量作为参数的特殊性。
二、String变量作为函数参数是"类似值传递"
public class TestString{
public static void main(String args[]){
String strTest=new String("ab");
//String strTest="ab";这两种形式的定义,输出的都是ab
str="Welcome to Here";
System.out.println(str);
}
}
解析:毋庸置疑,此程序输出的将是“Welcome to Here”,但是给str重新赋值的操作(str="Welcome to Here"),不是简单的将str指向的原内存地址内容改为"Welcome to Here",而是从新分配一块内存用来存放"Welcome to Here",然后将str指向该新分配的内存地址。而原来的"hello"如果没有其他String变量指向它,那么他将被java的垃圾收集器回收;如果有其他的String变量指向它,它将在内存继续存在,比如: