java通过方法来交换实参的值实现方式
作者:月下清融析愿
一、代码实例引出

代码输出结果:

我们可以看到,尽管我们写了一个交换方法来交换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. 内部类的“归属”问题
- 我们写的
MyValue是定义在另一个类(假设是Main类,因为有main方法)里面的内部类。 - 内部类默认是 “依赖外部类对象” 存在的(非静态内部类),它需要先有外部类的实例,才能创建自己的实例。(也就是说,如果把不加static,将这段代码放到外面,这串代码也是正确的)

- 但你的
main方法是static的(静态方法),静态方法里不能直接创建 “非静态内部类” 的对象 ,因为静态方法不依赖外部类实例,而非静态内部类却依赖,两者矛盾。
2. static修饰内部类的作用
给内部类加上 static 后,它就变成了静态内部类:
- 静态内部类不再依赖外部类的实例,”相当于和外部类 “平级,可以直接在静态方法(比如
main)里创建对象。 - 简单说:
static让内部类脱离了 “必须依附外部类对象” 的限制,能在静态环境(如main)里直接用。
3. 不加static会报错的场景
如果去掉 static,MyValue 就是非静态内部类,此时在 main(静态方法)里写 new MyValue() 就会报错,因为:
- 静态方法
main执行时,可能还没有外部类的实例。 - 非静态内部类需要外部类实例才能创建,Java 不允许这种 “无依赖创建”,所以会提示类似 “无法从静态上下文引用非静态内部类” 的错误。
总结一下:
- 加
static是为了把内部类变成静态内部类,让它可以在静态方法(比如main)里直接使用 。如果不加static,非静态内部类依赖外部类实例,而静态方法里没法保证有外部类实例,就会报错~ - 那么这时候就有聪明的小猪要问了,"同学同学,那我把static全都删掉不就好了"
- 很遗憾的说,这样是不行的
4. 为什么不能把static全部去掉
如果把全部的 static 都去掉,代码会无法编译运行,因为 Java 程序的入口点 main 方法必须是 static 的。当你去掉所有 static 后,会遇到以下问题:
main方法必须是static
Java 虚拟机(JVM)启动时,会直接调用 public static void main(String[] args) 方法,而不需要创建类的实例。如果去掉 static,JVM 无法直接调用 main 方法,会抛出错误:

静态方法中不能引用非静态成员
如果 main 保持 static,但其他方法 / 类去掉 static,会导致:
- 静态方法
main无法直接调用非静态方法(如swap)或创建非静态内部类(如MyValue)的实例 例如:

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

解决方案:保留必要的static
如果你想去掉 static,需要重构整个程序结构,例如:
- 将
main改为非静态(但 JVM 无法直接启动,需通过其他类调用)。 - 创建类的实例来调用方法(违背 Java 程序的常规写法)。
这种重构会让代码变得复杂,通常不推荐。更合理的做法是:
- 保留
main和工具方法(如swap)的static,确保程序可运行。 - 仅在需要对象状态时使用非静态成员(如实例变量、方法)。
总结
不能去掉所有 static,因为 main 必须是 static 的。但可以根据需求调整:
- 工具类方法(如
swap)通常设为static,方便直接调用。 - 内部类若需在静态环境使用,需声明为
static。 - 对象相关的成员(如实例变量、方法)保持非静态。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
