關於java的引用和c++的區別

chychy37發表於2020-11-01

首先看一下用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:建立一個引用,相當於棧多一個引用指向堆中的物件,引用的值變換和堆中的物件和這個物件的其他引用不會有影響(有兩個指向這個物件的指標)

相關文章