值傳遞和引用傳遞的區別
所謂值傳遞,就是說僅將對象的值傳遞給目標對象,就相當於copy;係統將為目標對象重新開辟一個完全相同的內存空間。
所謂引用,就是說將對象在內存中的地址傳遞給目標對象,就相當於使目標對象和原始對象對應同一個內存存儲空間。此時,如果對目標對象進行修改,內存中的數據也會改變。
值傳遞,例如:
class TestT1
{
public static void main(String[] args)
{
int i = 5;
int j = 6;
System.out.println("before exchange i = "+i);//交換前
exchange(i, j);
System.out.println("after exchange i = "+i);//交換後
}
public static void exchange(int a,int b)
{
int k;
k = a;a = b; b = k;
}
}
程序的結果是5!!!
這說明,原始數據類型是按值傳遞的,這個按值傳遞也是指的是進行賦值時的行為。
Java語言明確說明取消了指針,因為指針往往是在帶來方便的同時也是導致代碼不安全的根源,同時也會使程序的變得非常複雜難以理解,但這隻是在Java語言中沒有明確的指針定義,實質上每一個new語句返回的都是一個指針的引用。
引用傳遞,例如:
class TestT2
{
public static void main(String[] args)
{
StringBuffer s= new StringBuffer("good");
StringBuffer s2=s;
s2.append(" afternoon.");
System.out.println(s);
}
}
對象s和s2指向的是內存中的同一個地址因此指向的是同一個對象。
這裏的意思是進行對象賦值操作是傳遞的是對象的引用,因此對象是按引用傳遞的。
程序運行的輸出是:
good afternoon.
這說明s2和s是同一個對象。
總結:
大家都知道,在JAVA中變量有以下兩種:
基本類型變量,包括boolean、byte、char、short、int、long、float、double。
引用類型變量,包括類、接口、數組(基本類型數組和對象數組)。
對於基本類型和基本類型變量被當作參數傳遞給方法時,是值傳遞。在方法實體中,無法給原變量重新賦值,也無法改變它的值。
而對象作為參數,如果在方法中把對象作為參數,方法調用時,參數傳遞的是對象的引用,即在方法調用時,實際參數把對對象的引用傳遞給形式參數。這是實際參數與形式參數指向同一個地址,即同一個對象,方法執行時,對形式參數的改變實際上就是對實際參數的改變,這個結果在調用結束後被保留了下來。
所謂引用,就是說將對象在內存中的地址傳遞給目標對象,就相當於使目標對象和原始對象對應同一個內存存儲空間。此時,如果對目標對象進行修改,內存中的數據也會改變。
值傳遞,例如:
class TestT1
{
public static void main(String[] args)
{
int i = 5;
int j = 6;
System.out.println("before exchange i = "+i);//交換前
exchange(i, j);
System.out.println("after exchange i = "+i);//交換後
}
public static void exchange(int a,int b)
{
int k;
k = a;a = b; b = k;
}
}
程序的結果是5!!!
這說明,原始數據類型是按值傳遞的,這個按值傳遞也是指的是進行賦值時的行為。
Java語言明確說明取消了指針,因為指針往往是在帶來方便的同時也是導致代碼不安全的根源,同時也會使程序的變得非常複雜難以理解,但這隻是在Java語言中沒有明確的指針定義,實質上每一個new語句返回的都是一個指針的引用。
引用傳遞,例如:
class TestT2
{
public static void main(String[] args)
{
StringBuffer s= new StringBuffer("good");
StringBuffer s2=s;
s2.append(" afternoon.");
System.out.println(s);
}
}
對象s和s2指向的是內存中的同一個地址因此指向的是同一個對象。
這裏的意思是進行對象賦值操作是傳遞的是對象的引用,因此對象是按引用傳遞的。
程序運行的輸出是:
good afternoon.
這說明s2和s是同一個對象。
總結:
大家都知道,在JAVA中變量有以下兩種:
基本類型變量,包括boolean、byte、char、short、int、long、float、double。
引用類型變量,包括類、接口、數組(基本類型數組和對象數組)。
對於基本類型和基本類型變量被當作參數傳遞給方法時,是值傳遞。在方法實體中,無法給原變量重新賦值,也無法改變它的值。
而對象作為參數,如果在方法中把對象作為參數,方法調用時,參數傳遞的是對象的引用,即在方法調用時,實際參數把對對象的引用傳遞給形式參數。這是實際參數與形式參數指向同一個地址,即同一個對象,方法執行時,對形式參數的改變實際上就是對實際參數的改變,這個結果在調用結束後被保留了下來。
轉自:https://hi.baidu.com/_sherry_liu/item/b50c4cfae4c5e4c50dd1c898
最後更新:2017-04-03 12:56:36
上一篇:
NYOJ714-Card Trick
下一篇:
ssh、selinux、防火牆等啟動與停止命令
The Influx of Banking Trojans – A New Variant of BankBot Trojan
[usaco]3.1.5 stamps
Android模擬器emulator基本使用技巧和命令
光伏企業:再出海還需要上兩節課
程序員追求的是什麼?
Java正則表達式(一)、抓取網頁email地址實例
《Hadoop與大數據挖掘》一2.2.5 動手實踐:Hadoop IDE配置
Kafka(Quickstart)
java.util.concurrent包(4)——讀寫鎖ReentrantReadWriteLock
荷蘭研究人員提突破性想法:用紅外線傳輸網絡,比WiFi快100倍