Java中的值傳遞以及引用傳遞和數(shù)組傳遞詳解
與其他語言不同,Java不允許程序員選擇按值傳遞還是按引用傳遞各個參數(shù),基本類型(byte–short–int–long–float–double–boolean–char)的變量總是按值傳遞。
就對象而言,不是將對象本身傳遞給方法,而是將對象的的引用或者說對象的首地址傳遞給方法,引用本身是按值傳遞的
也就是說,講引用的副本傳遞給方法(副本就是說明對象此時有兩個引用了),通過對象的引用,方法可以直接操作該對象(當操作該對象時才能改變該對象,而操作引用時源對象是沒有改變的)。
現(xiàn)在說說數(shù)組:
如果將單個基本類型數(shù)組的元素傳遞給方法,并在方法中對其進行修改,則在被調用方法結束執(zhí)行時,該元素中存儲的并不是修改后的值,因為這種元素是按值傳遞,如果傳遞的是數(shù)組的引用,則對數(shù)組元素的后續(xù)修改可以在原始數(shù)組中反映出來(因為數(shù)組本身就是個對象,int[] a = new int[2];,這里面的int是數(shù)組元素的類型,而數(shù)組元素的修改是操作對象)。
對于單個非基本類型數(shù)組的元素在方法中修改,則在被調用方法結束執(zhí)行時,該元素中存儲的是修改后的值,因為這種元素是按引用傳遞的,對象的改動將在源數(shù)組的數(shù)組元素中反映出來。
下面看個小程序:
public class Test{
String str = new String("good");
char[] ch = {'a','b','c'};
int i = 10;
public void change(String str,char[] ch,int i){
str = "test ok";
ch[0] = 'g';
i++;
}
public static void main(String[] args){
Test tt = new Test();
tt.change(tt.str,tt.ch,tt.i);
System.out.println(tt.i);
System.out.print(tt.str+" and ");
System.out.println(tt.ch);
}
}str是String類型的引用,i是基本類型變量,ch是數(shù)組名,也是數(shù)組對象的引用
在chang()方法里,str=”test ok”,是一個新的對象把首地址放在引用變量str上;
而ch[0]=’g’;因為傳的是數(shù)組的引用,而此時ch[0]=’g’;是對數(shù)組元素的操作,能修改源數(shù)組的內容;
i是整型值,只是把值copy了一份給方法,在方法的變化是不改變的源i的。
所以結果是:
10
good and gbc
現(xiàn)在咱們把代碼變化一下:
public class Test{
String str = new String("good");
char[] ch = {'a','b','c'};
int i = 10;
public void change(String str,char ch,int i){
str = "test ok";
ch = 'g';
this.i = i+1;
}
public static void main(String[] args){
Test tt = new Test();
tt.change(tt.str,tt.ch[0],tt.i);
System.out.println(tt.i);
System.out.print(tt.str+" and ");
System.out.println(tt.ch);
}
}仔細觀察下實參以及入?yún)⒂泻巫兓?/p>
change()方法里的入?yún)har[] ch變成————–char ch;
這次傳遞的是個char值的單個數(shù)組元素,按照上面的解析,此時ch=’9’;是不影響源數(shù)組元素的。
this.i = i+1;這里面等號左邊的i是屬性i,等號右邊的i是局部變量(入?yún)⒗锏膇);
此時i+1后賦值給屬性的i,自然會改變屬性i的值,同時17行,tt.i又是調用屬性的i,這次的結果是:
11
good and abc
現(xiàn)在是不是有點明白了?
那好再看下面一個小程序
public class Test{
public void change(StringBuffer x,StringBuffer y){
x.append(y);
y=x;
}
public static void main(String[] args){
StringBuffer buffA = new StringBuffer("a");
StringBuffer buffB = new StringBuffer("b");
new Test().change(buffA,buffB);
System.out.println(buffA+","+buffB);
}
}這次傳遞的是兩個對象的引用的值,
在方法change()里 的x.append(y), 其中引用x調用api方法append()修改了new StringBuffer(“a”);的內容。
y=x;是一個修改內容的對象把首地址賦值給引用變量y了,此時操作的是引用,而先前y是new StringBuffer(“b”);的引用變量,所以輸出結果是:
ab,b
下面是個稍難的小程序,先自己用筆畫畫過程,寫出自己的結果,而后再上機操作下
如果自己的結果和在電腦上的結果一樣,那么再碰到這類題就不難了,如果不一樣,回頭仔細體會下我前面的講解,找找原因。
public class Test{
private String nn = new String("1");
private String[] mm = {"2","5"};
void test(String nn,String[] mm){
nn = new String("3");
this.nn = "9";
mm[0] = "4";
System.out.println("in test(),mm[0]: "+mm[0]);
mm = new String[]{"8","7"};
System.out.println("in test(),nn: "+nn);
System.out.println("this.nn: "+this.nn);
System.out.println("mm[0]: "+mm[0]);
}
public static void main(String[] args){
Test s = new Test();
s.test(s.nn,s.mm);
System.out.println(s.nn+" "+s.mm[0]);
}
}到此這篇關于Java中的值傳遞以及引用傳遞和數(shù)組傳遞詳解的文章就介紹到這了,更多相關Java值傳遞引用傳遞和數(shù)組傳遞內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
logback如何去掉DubboMonitor煩人的INFO日志
這篇文章主要介紹了logback如何去掉DubboMonitor煩人的INFO日志方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Java統(tǒng)計英文句子中出現(xiàn)次數(shù)最多的單詞并計算出現(xiàn)次數(shù)的方法
這篇文章主要介紹了Java統(tǒng)計英文句子中出現(xiàn)次數(shù)最多的單詞并計算出現(xiàn)次數(shù)的方法,涉及java針對英文句子的字符串遍歷、轉換、正則替換、計算等相關操作技巧,需要的朋友可以參考下2018-01-01
一文詳解Elasticsearch和MySQL之間的數(shù)據(jù)同步問題
Elasticsearch中的數(shù)據(jù)是來自于Mysql數(shù)據(jù)庫的,因此當數(shù)據(jù)庫中的數(shù)據(jù)進行增刪改后,Elasticsearch中的數(shù)據(jù),索引也必須跟著做出改變。本文主要來和大家探討一下Elasticsearch和MySQL之間的數(shù)據(jù)同步問題,感興趣的可以了解一下2023-04-04
spring使用aspect注解切面不起作用的排查過程及解決
這篇文章主要介紹了spring使用aspect注解切面不起作用的排查過程及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Java數(shù)據(jù)結構之雙向鏈表的實現(xiàn)
相較單鏈表,雙向鏈表除了data與next域,還多了一個pre域用于表示每個節(jié)點的前一個元素。這樣做給雙向鏈表帶來了很多優(yōu)勢。本文主要介紹了雙向鏈表的實現(xiàn),需要的可以參考一下2022-10-10
SpringBoot2.1.3修改tomcat參數(shù)支持請求特殊符號問題
最近遇到一個問題,比如GET請求中,key,value中帶有特殊符號,請求會報錯。接下來通過本文給大家分享解決SpringBoot2.1.3修改tomcat參數(shù)支持請求特殊符號 ,需要的朋友可以參考下2019-05-05

