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

相关推荐
minji...1 分钟前
Linux 线程同步与互斥(六) 线程安全与重入问题,死锁,线程done
linux·运维·开发语言·数据库·c++·算法·安全
wayz111 分钟前
Day 16 编程实战:PCA主成分分析与技术指标降维
人工智能·算法·机器学习
佳xuan2 分钟前
QA与RAG检索
java·服务器·前端
探序基因2 分钟前
单细胞转录组Seurat去批次-RPCA算法
算法
yuanyuan2o23 分钟前
GDB 调试指南
c语言·c++·算法
流年如夢6 分钟前
算法效率:复杂度原理解析
c语言·数据结构·算法
cpp_25012 小时前
P1024 [NOIP 2001 提高组] 一元三次方程求解
数据结构·c++·算法·题解·二分答案·洛谷·csp
半瓶榴莲奶^_^3 小时前
jvm java虚拟机
java·jvm
田梓燊9 小时前
力扣:23.合并 K 个升序链表
算法·leetcode·链表
invicinble9 小时前
这里对java的知识体系做一个全域的介绍
java·开发语言·python