關於java的引用和c++的區別
首先看一下用cpp的引用(別名)
注意點:
- cpp的引用相當於給值多取一個變數名(別名)
- cpp的引用一定要初始化,且指向不能改變,但值可以變
- 形參為實參的一個引用,所以對形參的修改就是對實參的修改
cpp引用實現swap
#include <iostream>
void mySwap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int a = 10;
int b = 20;
mySwap(a, b);
std::cout << a << std::endl;
std::cout << b << std::endl;
return 0;
}
輸出:
20
10
再看下java的引用(控制程式碼)
注意點:
- java的基本型別是沒有引用的,直接存放值在棧空間,而物件會先在堆空間建立物件,然後在棧空間建立一個引用指向這個物件
- int a = 10; 代表在棧空間開闢一個空間存放a的數值10
- A a = new A(10); 代表在堆空間建立一個A物件,並在棧空間建立一個引用指向堆中的A
java把基本物件傳入方法實現swap
package Demo;
public class Demo02 {
public static void main(String[] args) {
int a = 10;
int b = 20;
swap(a, b);
System.out.println(a);
System.out.println(b);
}
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
}
輸出:
10
20
可以看出java對於基本物件是值傳遞,對形參的操作不會影響到實參
看下把物件傳入方法實現swap
package Demo;
public class Demo01 {
public static void main(String[] args) {
A a1 = new A(10);
A a2 = new A(20);
swap(a1, a2);
System.out.println(a1.getA());
System.out.println(a2.getA());
}
public static void swap(A x, A y){
A temp = x;
x = y;
y = temp;
}
}
輸出:
10
20
可以看出實參也沒有變化,這是為什麼呢?
1.java物件傳入方法的是物件的引用
2.A temp = x; temp就是a1的引用
3.x = y; x就是a2的引用
4.y = temp; y就是a1的引用
可以看出方法內引用交換了,但方法外引用沒交換
cpp和java的引用的區別
- cpp的引用就是別名
- java的引用則是一個控制程式碼指向堆中的物件(除基本物件)
可以看下圖解:
cpp:建立一個引用相當於,多一個別名,相當於多一個變數名(一個物件有兩個變數名)
java:建立一個引用,相當於棧多一個引用指向堆中的物件,引用的值變換和堆中的物件和這個物件的其他引用不會有影響(有兩個指向這個物件的指標)
相關文章
- c++中指標和引用的區別?C++指標
- C++中指標和引用的區別C++指標
- 關於C與C++的區別C++
- C++指標與引用的區別C++指標
- 引用的例子 C C++ 中區別C++
- C++和java多型的區別C++Java多型
- require和import引用的區別UIImport
- 指標和引用的區別指標
- C/C++引用和指標的聯絡和區別C++指標
- 關於HashMap和Hashtable的區別HashMap
- 對於java中的"\"和"/" 區別Java
- java的引用:用C++/C的引用和指標去理解JavaC++指標
- Java的基本型別和引用型別Java型別
- JAVA 與 C++ 的區別JavaC++
- 關於C++引用的一些注意點C++
- C語言include關鍵字和引用.h .c的區別C語言
- Java引用型別解析:掌握強引用、軟引用、弱引用和幻象引用的妙用Java型別
- 關於stable_sort()和sort()的區別:
- JAVA 基本型別與 引用型別區別Java型別
- Golang的值型別和引用型別的範圍、儲存區域、區別Golang型別
- 詳解C++中指標(*)、取地址(&)、解引用(*)與引用(&)的區別 (完整程式碼)C++指標
- 關於C/C++/Java的比喻C++Java
- 從賦值看基本型別和引用型別的區別賦值型別
- Python引用型別和值型別的區別與使用Python型別
- Java中的引用型別和使用場景Java型別
- js基本型別和引用型別區別JS型別
- C++中運算子 &和&&、|和|| 的區別C++
- 【Java】equals 和 == 的區別Java
- Java和Javascript的區別JavaScript
- java和html的區別JavaHTML
- 關於Java和C#的型別對比JavaC#型別
- C++引用的作用和用法C++
- 關於Ajax和websocket的區別以及使用場景!Web
- 關於記憶體中棧和堆的區別記憶體
- java 方法修改主函式裡基本資料型別和引用資料型別的區別Java函式資料型別
- C++中的return和exit區別C++
- C++中 struct 和 class 的區別C++Struct
- C++中struct 和 class的區別C++Struct