Java传参还在瞎传?这3个进阶基础技巧少走1年弯路

大家好,我是掘金打码仔~Java传参看着简单,实则藏着不少坑,新手容易懵、老鸟偶尔踩,今天分享3个进阶偏基础的传参技巧,实用性拉满,代码短小精悍,看完就能用!

1. 分清值传递vs引用传递,告别传参玄学

Java只有值传递!很多人搞混引用类型传参,误以为是引用传递,其实本质是传引用的副本,记住2个核心结论不踩坑。

✅ 核心结论

  • 基本类型:传副本,方法内修改不影响原变量
  • 引用类型:传地址副本,改对象属性影响原对象,改引用指向不影响
java 复制代码
// 示例1:基本类型(值传递,互不影响)
public static void changeInt(int num) {
    num = 100; // 改的是副本
}
int a = 10;
changeInt(a);
System.out.println(a); // 输出10,不变

// 示例2:引用类型(改属性影响原对象)
class Student {String name;}
public static void changeName(Student stu) {
    stu.name = "掘金"; // 改对象内容,影响原对象
}
Student s = new Student();
s.name = "小白";
changeName(s);
System.out.println(s.name); // 输出掘金

// 示例3:引用类型(改指向不影响原对象)
public static void changeStu(Student stu) {
    stu = new Student(); // 改引用指向,和原对象无关
    stu.name = "大佬";
}
changeStu(s);
System.out.println(s.name); // 还是掘金

2. 可变参数:告别数组传参,灵活又优雅

Java5+支持可变参数,用 ... 表示,适配参数个数不固定的场景,替代数组传参更简洁,底层还是数组,但写法更舒服。

✅ 核心用法&注意事项

  • 格式:类型... 参数名,必须放参数列表最后
  • 调用:可传多个同类型参数,也可传数组
  • 取值:按数组方式取值即可
java 复制代码
// 传统数组传参(麻烦)
public static int sumArr(int[] nums) {
    int sum = 0;
    for (int num : nums) sum += num;
    return sum;
}

// 可变参数写法(简洁)
public static int sum(int... nums) { // 可变参数放最后
    int sum = 0;
    for (int num : nums) sum += num; // 按数组遍历
    return sum;
}

// 调用超灵活
int s1 = sum(1,2,3); // 传多个参数
int s2 = sum(1,2,3,4,5); // 个数随意
int[] arr = {6,7,8};
int s3 = sum(arr); // 传数组也能行
System.out.println(s1+s2+s3); // 输出45

3. 传参兜底:默认参数这么写,优雅不啰嗦

Java没有原生默认参数,但2种替代方案超实用,不用写重载方法也能实现参数兜底,进阶基础必备小技巧。

✅ 2种实用方案

  • 方案1:方法内三元运算符兜底(简单场景)
  • 方案2:重载方法+this调用(复杂场景)
java 复制代码
// 方案1:三元运算符兜底(简单好用)
public static void printMsg(String msg) {
    // 传null/空字符串,兜底给默认值
    String finalMsg = (msg == null || msg.isEmpty()) ? "默认消息" : msg;
    System.out.println(finalMsg);
}

// 调用
printMsg("掘金干货"); // 输出掘金干货
printMsg(null); // 输出默认消息

// 方案2:重载+this调用(多参数场景)
public static void add(int a) {
    add(a, 0); // 调用下面的方法,给b默认值0
}

public static void add(int a, int b) {
    System.out.println(a + b);
}

// 调用
add(5); // 传1个参数,默认b=0,输出5
add(5,3); // 传2个参数,输出8
相关推荐
saber_andlibert9 分钟前
TCMalloc底层实现
java·前端·网络
wangjialelele13 分钟前
平衡二叉搜索树:AVL树和红黑树
java·c语言·开发语言·数据结构·c++·算法·深度优先
m0_4811473318 分钟前
拦截器跟过滤器的区别?拦截器需要注册吗?过滤器需要注册吗?
java
Coder_Boy_21 分钟前
基于SpringAI的在线考试系统-相关技术栈(分布式场景下事件机制)
java·spring boot·分布式·ddd
独自破碎E22 分钟前
【BISHI15】小红的夹吃棋
android·java·开发语言
冻感糕人~24 分钟前
【珍藏必备】ReAct框架实战指南:从零开始构建AI智能体,让大模型学会思考与行动
java·前端·人工智能·react.js·大模型·就业·大模型学习
啦啦啦_999929 分钟前
Redis实例-2
java
alice--小文子34 分钟前
cursor-mcp工具使用
java·服务器·前端
进阶小白猿35 分钟前
Java技术八股学习Day33
java·开发语言·学习
程序员敲代码吗41 分钟前
如何通过命令行启动COMSOL的参数化、批处理和集群扫描
java·c#·bash