关于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:创建一个引用,相当于栈多一个引用指向堆中的对象,引用的值变换和堆中的对象和这个对象的其他引用不会有影响(有两个指向这个对象的指针)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值