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

相关推荐
云飞云共享云桌面9 分钟前
东莞精密机械制造工厂如何10个SolidWorks共用一台服务器资源
java·运维·服务器·网络·数据库·电脑·制造
毕设源码-赖学姐15 分钟前
【开题答辩全过程】以 网络药店管理系统为例,包含答辩的问题和答案
java·eclipse
努力也学不会java16 分钟前
【Java并发】揭秘Lock体系 -- 深入理解ReentrantReadWriteLock
java·开发语言·python·机器学习
埃泽漫笔28 分钟前
消息队列延迟与过期问题的实战解决
java·mq
花花无缺1 小时前
资源泄露问题
java·后端·http
爱敲代码的TOM1 小时前
深入剖析Java通信架构下的三种IO模式2
java·开发语言·架构
杨DaB1 小时前
【JavaSE】JVM
java·jvm
lang201509281 小时前
掌握MyBatis Java API:高效操作数据库
java·数据库·mybatis
晨晖21 小时前
将聚合工程的ssm项目部署到本地tomcat
java·tomcat
Z_z在努力1 小时前
【杂类】理解 @Repository 和 Mapper 的关系
java·tomcat·mybatis