關於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++
- 指標和引用的區別指標
- require和import引用的區別UIImport
- java的引用:用C++/C的引用和指標去理解JavaC++指標
- Java的基本型別和引用型別Java型別
- 關於gcc、make和CMake的區別GC
- C語言include關鍵字和引用.h .c的區別C語言
- c#中值型別和引用型別的區別C#型別
- Java引用型別解析:掌握強引用、軟引用、弱引用和幻象引用的妙用Java型別
- 關於stable_sort()和sort()的區別:
- 關於C++中字串輸入get與getline的區別C++字串
- Java 中的強引用、軟引用、弱引用和虛引用分別是什麼?Java
- Golang的值型別和引用型別的範圍、儲存區域、區別Golang型別
- 關於PHP this 和 self 呼叫類方法的區別PHP
- C++中傳指標和傳引用的區別,各自的使用場景是什麼C++指標
- 從賦值看基本型別和引用型別的區別賦值型別
- Java中的引用型別和使用場景Java型別
- 【Java】equals 和 == 的區別Java
- 關於Java和C#的型別對比JavaC#型別
- js基本型別和引用型別區別JS型別
- C++中的return和exit區別C++
- 關於Ajax和websocket的區別以及使用場景!Web
- 關於CATALINA_HOME 和 CATALINA_BASE 的區別
- java中有哪幾種引用?它們的含義和區別是什麼Java
- 物件與物件引用的區別物件
- 值型別與引用型別的區別型別
- C++中break和continue的用法和區別C++
- 關於mysql設定varchar 欄位的預設值''和null的區別,以及varchar和char的區別MySqlNull
- 理解Java的強引用、軟引用、弱引用和虛引用Java
- java 中equals和==的區別Java
- java yield()和sleep()的區別Java
- Java中方法引用與Lambda區別 - foojayJava
- 關於Vue和React區別的一些筆記VueReact筆記
- C和C++區別C++
- 關於Ae和Pr的的區別,你瞭解對了嗎?
- nginx關於root與alias的區別Nginx