java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java通过方法来交换实参的值

java通过方法来交换实参的值实现方式

作者:月下清融析愿

文章介绍了Java方法参数传递方式以及如何通过数组、自定义包装类或返回结果来实现变量交换,同时,讨论了内部类中static关键字的作用和使用场景

一、代码实例引出

代码输出结果:

我们可以看到,尽管我们写了一个交换方法来交换a与b的值,但是从结果来看好像没有发生交换,这是为什么?如何修改才能使其发生交换?有几种方法能够做到?这就是今天要做的事情

二、为什么无法发生交换?

答:在java中,方法参数的传递方式是值传递(pass by value),这意味着当你将变量传递给方法的时候,实际上传递的是变量的副本,而不是变量本身

在上述代码中,swap方法接受两个int类型的参数x和y.当你在main方式中调用swap(a,b)时,java会将a和b分别复制一份传递给x和y

在swap的方法内部,x和y的值确实被交换了.但这只是交换了x和y的副本值,而不是main方法中a和b的值.当swap方法执行完毕后,x和y的生命周期结束,他们的值不会影响到main方法中的a和b

因此main方法中的a和b的值没有呢发生交换,输出的结果仍然是交换前的值

三、如何修改能使其发生交换?

方法 1:用数组封装(利用引用传递特性)

基本类型本身无法直接通过方法修改外部变量,但可以用数组(引用类型)封装,通过修改数组元素实现交换:

方法 2:用Integer不行?注意!

虽然 Integer 是引用类型,但由于 Integer 内部值是 final 修饰的(不可变) ,直接传递 Integer 对象也无法真正交换。

若想模拟,需自定义一个 “可变” 的包装类(或用 Java 提供的 AtomicInteger 等,不过更推荐简单场景用数组)。

比如自定义一个简单的可变包装类:

方法 3:返回交换后的结果(无需修改外部变量,直接返回新值)

如果不想用数组或自定义类,也可以让 swap 返回交换后的结果数组 / 对象,重新接收赋值:

总结:最简洁的方式是用数组封装基本类型(方法 1),利用引用传递修改内部元素;若追求更面向对象,可自定义可变包装类(方法 2);简单场景也可直接返回交换结果(方法 3)。

当然也可以这样改

当然如果要赋值这样还不够,需要增加一个构造方法来初始化value的值

至于这一块为什么要加static,这就涉及到了之前的模块,内部类.

我们来回顾一下:

四、回顾:内部类

在 Java 中,static class MyValue 这里的 static 是用来修饰内部类的,它的作用和报错原因与 Java 的类加载、内部类访问规则有关,具体可以这么理解:

1. 内部类的“归属”问题

2. static修饰内部类的作用

给内部类加上 static 后,它就变成了静态内部类

3.  不加static会报错的场景

如果去掉 staticMyValue 就是非静态内部类,此时在 main(静态方法)里写 new MyValue() 就会报错,因为:

总结一下:

4. 为什么不能把static全部去掉

如果把全部的 static 都去掉,代码会无法编译运行,因为 Java 程序的入口点 main 方法必须是 static 的。当你去掉所有 static 后,会遇到以下问题:

main方法必须是static

Java 虚拟机(JVM)启动时,会直接调用 public static void main(String[] args) 方法,而不需要创建类的实例。如果去掉 static,JVM 无法直接调用 main 方法,会抛出错误:

静态方法中不能引用非静态成员

如果 main 保持 static,但其他方法 / 类去掉 static,会导致:

必须先创建 Main 的实例,再通过实例调用:

解决方案:保留必要的static

如果你想去掉 static需要重构整个程序结构,例如:

这种重构会让代码变得复杂,通常不推荐更合理的做法是:

总结

不能去掉所有 static,因为 main 必须是 static 的。但可以根据需求调整:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

阅读全文