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是完全面向对象的,如果需要改变对象,可以通过定义成员方法,由对象调用方法实现

相关推荐
Einsail4 分钟前
天梯赛题解(3-6)
算法
杜子不疼.5 分钟前
【LeetCode 852 & 162_二分查找】山脉数组的峰顶索引 & 寻找峰值元素
算法·leetcode·职场和发展
是一个Bug7 分钟前
如何阅读JDK源码?
java·开发语言
山楂树の9 分钟前
搜索插入位置(二分查找)
数据结构·算法
Ledison716 分钟前
Springboot 3.5.7 + Springcloud 2025 升级记录
java
helloyangkl19 分钟前
Draco——参数说明
算法
没有bug.的程序员22 分钟前
熔断、降级、限流:高可用架构的三道防线
java·网络·jvm·微服务·架构·熔断·服务注册
派大鑫wink23 分钟前
【Day15】集合框架(三):Map 接口(HashMap 底层原理 + 实战)
java·开发语言
派大鑫wink31 分钟前
【Day14】集合框架(二):Set 接口(HashSet、TreeSet)去重与排序
java·开发语言
weixin_5150696632 分钟前
BeanToMapUtil-对象转Map
java·工具类·java常用api