Java参数值传递

Java参数值传递

参数是基本类型

场景:通过方法,对传入的实参进行值修改

例如,Java冒泡排序

java 复制代码
public class Test {
    public static void main(String[] args) {
        int[] arr = {1,8,5,6,4,9,3};

        for (int i = 0; i < arr.length - 1; i++) {
            // 每一轮比较,将最大的元素"浮"到数组末尾
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    // 交换相邻元素
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

运行正常,能否把交换过程抽取成方法?

java 复制代码
public class Test {
    public static void main(String[] args) {
        int[] arr = {1,8,5,6,4,9,3};

        for (int i = 0; i < arr.length - 1; i++) {
            // 每一轮比较,将最大的元素"浮"到数组末尾
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    // 交换相邻元素,使用抽取方法
                    swapValue(arr[j],arr[j+1] );
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
	// 交换方法抽取
    public static void swapValue(int a, int b){
        int temp = a;
        a = b;
        b = temp;
    }
}

结果发现数组没有排序,原样输出,swapValue没有发生作用

原因:++Java中的参数是值传递,尽管方法体对参数进行各种操作,使用方法时,传入了实参,也不影响实参变量的值,只是复制了实参的值供方法使用++

java 出于安全考虑,放弃了C\C++的直接操作内存的能力(指针、取地址)

C++的指针变量与各种变量的取地址运算混杂,程序逻辑代码庞大之后,稍不注意就会出现野指针(指针悬空),内存泄漏等问题,维护麻烦

逻辑不负责情况子啊指针或者取地址还是好用的,例如

C++函数实现两变量值交换,形参变量 &取地址,也就是引用传递 ,直接操作内存地址的值

void swapValue(int& a, int& b) {

int temp = a;

a = b;

b = temp;

}

参数是引用类型

++对象作为参数,也是值传递++

误区:引用类型就是引用传递

本质Java不允许获取地址值,直接输出对象变量,得到一个内存地址经过计算得来的哈希字符串

java 复制代码
public class Test {
    public static void main(String[] args) {
        int[] arr = {1,8,5,6,4};
        changObject(arr);
        // 并没有被改变
        System.out.println(Arrays.toString(arr));
        System.out.println(arr);

    }
    public static void changObject(int[] arr){
        arr = new int[]{1,2,3,4,5}; // 无效的操作
    }
}

Java是完全面向对象的,如果需要改变对象,可以通过定义成员方法,由对象调用方法实现

相关推荐
行者全栈架构师几秒前
【共创稿事节】双引擎智能相册:HarmonyOS 7(API 26)文搜图 × 图像超分端侧 AI 联动实战
前端·算法·架构
知守观9 分钟前
从 4 套 PDF 库的混战,聊聊老项目的依赖管理与“静默失败”
java·后端·设计模式
深盾科技_Virbox11 分钟前
换机或重装后软件许可怎么恢复:先核对哪四项
java·服务器·数据库
Zhuo1Joy11 分钟前
中间件挂了怎么办:兜底的边界与取舍
java
用户0723670666013 分钟前
基于 JavaAgent 的无侵入 Mock:让联调和链路测试不再等下游
java·后端
小蒜学长13 分钟前
基于SpingBoot+Vue的定向越野赛事管理系统的设计与开发(代码+数据库+LW)
java·前端·spring boot·后端·前后端分离·定向越野赛事
海岳云舟14 分钟前
spring自带线程池使用不当导致的死锁问题
java·后端
yuzhiboyouye18 分钟前
Optional和Stream经典丰富的用法demo,以及相关的详细介绍
java
小蒋观天下18 分钟前
【无标题】红外补光近距过曝、远距欠曝:导致车牌AI识别失效调试
人工智能·深度学习·数码相机·算法·机器学习·ai大模型
小蒜学长31 分钟前
基于过程性评价的ai助学平台(代码+数据库+LW)
java·spring boot·后端·微信小程序·过程性评价