当前位置: 代码网 > it编程>编程语言>Java > java通过方法来交换实参的值实现方式

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

2025年12月26日 Java 我要评论
一、代码实例引出代码输出结果:我们可以看到,尽管我们写了一个交换方法来交换a与b的值,但是从结果来看好像没有发生交换,这是为什么?如何修改才能使其发生交换?有几种方法能够做到?这就是今天要做的事情二、

一、代码实例引出

代码输出结果:

我们可以看到,尽管我们写了一个交换方法来交换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会报错的场景

如果去掉 staticmyvalue 就是非静态内部类,此时在 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
  • 对象相关的成员(如实例变量、方法)保持非静态。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com