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

相关推荐
界面开发小八哥2 小时前
「Java EE开发指南」如何用MyEclipse创建一个WEB项目?(三)
java·ide·java-ee·myeclipse
董董灿是个攻城狮2 小时前
5分钟搞懂什么是窗口注意力?
算法
Dann Hiroaki2 小时前
笔记分享: 哈尔滨工业大学CS31002编译原理——02. 语法分析
笔记·算法
idolyXyz2 小时前
[java: Cleaner]-一文述之
java
一碗谦谦粉2 小时前
Maven 依赖调解的两大原则
java·maven
netyeaxi3 小时前
Java:使用spring-boot + mybatis如何打印SQL日志?
java·spring·mybatis
收破烂的小熊猫~3 小时前
《Java修仙传:从凡胎到码帝》第四章:设计模式破万法
java·开发语言·设计模式
猴哥源码3 小时前
基于Java+SpringBoot的动物领养平台
java·spring boot
老任与码3 小时前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba
小兵张健3 小时前
武汉拿下 23k offer 经历
java·面试·ai编程