学习c,c++特别是经常看过国内c,c++,java书籍的朋友们肯定知道值传递和引用传递的概念,我们必须知道的就是java中只有值传递,引用(指针)也是一种值,值传递就是将值拷贝一份传入方法的对应的形参中:
首先来看这个代码:
[color=red]首先要知道的是JAVA中只有值传递.
注意:经常会听到引用传递的说法,实际上引用传递就是值传递,就是将栈中引用(指针)复制一份传递到方法中[/color]
str1变量:
str1是String类型,采用值传递将String类型的引用复制一份传给doString方法的形参,String是继承final,String类型数据是不可以改变的,因此对String的操作实际上是在指向新建的地址空间。方法中的str1的引用只是一个拷贝,因此方法中的操作不会对原来的str1指向的地址空间进行更改:
//输出 "犀利"
str2变量:
str2变量是StringBuilder类型,采用值传递将StringBuilder类型的引用str2复制一份传给doStringBuilder1方法的形参,方法中新建StringBuilder,即拷贝的引用指向了新建的StringBuilder对象地址,对新地址的操作不会改变外部的引用指向的原地址的数据:
//输出 "犀利"
str3变量:
str3变量是StringBuilder类型,采用值传递将StringBuilder类型的引用str2复制一份传给doStringBuilder1方法的形参,方法中对StringBuilder对象进行操作,因为原引用和拷贝的引用都指向同一个StringBuilder对象地址,通过拷贝的引用对地址进行操作意味着改变了原引用所指向的地址的数据:
//输出 "犀利哥"
首先来看这个代码:
package test;
public class Test {
public static String doString(String str)
{
str += "哥" ;
return str ;
}
public static StringBuilder doStringBuilder1(StringBuilder str)
{
str = new StringBuilder() ;
str.append("新犀利哥");
return str ;
}
public static StringBuilder doStringBuilder2(StringBuilder str)
{
str.append("哥") ;
return str ;
}
public static void main(String[] args) {
String str1 = new String("犀利") ;
doString(str1) ;
System.out.println(str1) ;
StringBuilder str2 = new StringBuilder() ;
str2.append("犀利");
doStringBuilder1(str2) ;
System.out.println(str2) ;
StringBuilder str3 = new StringBuilder() ;
str3.append("犀利");
doStringBuilder2(str3) ;
System.out.println(str3) ;
}
}
//输出结果为:
"犀利"
"犀利"
"犀利哥"
[color=red]首先要知道的是JAVA中只有值传递.
注意:经常会听到引用传递的说法,实际上引用传递就是值传递,就是将栈中引用(指针)复制一份传递到方法中[/color]
str1变量:
str1是String类型,采用值传递将String类型的引用复制一份传给doString方法的形参,String是继承final,String类型数据是不可以改变的,因此对String的操作实际上是在指向新建的地址空间。方法中的str1的引用只是一个拷贝,因此方法中的操作不会对原来的str1指向的地址空间进行更改:
//输出 "犀利"
str2变量:
str2变量是StringBuilder类型,采用值传递将StringBuilder类型的引用str2复制一份传给doStringBuilder1方法的形参,方法中新建StringBuilder,即拷贝的引用指向了新建的StringBuilder对象地址,对新地址的操作不会改变外部的引用指向的原地址的数据:
//输出 "犀利"
str3变量:
str3变量是StringBuilder类型,采用值传递将StringBuilder类型的引用str2复制一份传给doStringBuilder1方法的形参,方法中对StringBuilder对象进行操作,因为原引用和拷贝的引用都指向同一个StringBuilder对象地址,通过拷贝的引用对地址进行操作意味着改变了原引用所指向的地址的数据:
//输出 "犀利哥"