在Java中,除了方法重载和重写,方法还有许多重要特性,涵盖参数传递、默认行为、特殊用法等方面。以下是核心内容:
一、参数传递机制:值传递
Java中所有参数传递均为值传递(传递副本而非原对象):
- 基本类型:传递具体数值的副本(修改副本不影响原值)。
- 引用类型:传递对象引用的副本(副本与原引用指向同一对象,可通过副本修改对象属性,但无法改变原引用的指向)。
public void demo() {
int num = 10;
changeNum(num); // num仍为10(基本类型值传递)
String str = "abc";
changeStr(str); // str仍为"abc"(字符串不可变,修改引用副本指向新对象)
Person p = new Person("张三");
changePerson(p); // p的name变为"李四"(修改对象属性)
}
void changeNum(int n) { n = 20; }
void changeStr(String s) { s = "def"; }
void changePerson(Person p) { p.name = "李四"; }
二、可变参数(Varargs)
- 语法:参数类型后加 ... ,本质是数组,一个方法最多只能有一个可变参数,且必须位于参数列表末尾。
- 作用:简化方法调用,避免重载大量相似方法。
// 计算任意个数的和
public int sum(int... nums) {
int total = 0;
for (int num : nums) total += num;
return total;
}
// 调用方式
sum(1, 2); // 等价于sum(new int[]{1,2})
sum(1, 2, 3, 4); // 自动封装为数组
三、方法的默认参数与可选参数
Java 8前不支持默认参数,需通过重载实现;Java 8+可通过接口默认方法( default 关键字)实现,但类方法仍不支持。
- 接口默认方法:为接口方法提供默认实现,子类可选择重写。
interface MyInterface {
default void method() { // 接口中定义默认方法
System.out.println("默认实现");
}
}
四、静态方法(Static Method)
- 特点:属于类而非实例,通过 类名.方法名 调用,不能访问非静态成员( this 、 super )。
- 应用场景:工具类方法(如 Math.sqrt() )、单例模式的 getInstance() (常配合 static 字段)。
public class Utils {
public static int calculate(int a, int b) {
return a + b;
}
}
// 调用方式
Utils.calculate(1, 2); // 无需创建对象
五、final方法
- 作用:防止子类重写,常用于保护核心逻辑(如 Object.clone() 是 final 方法)。
class Parent {
final void fixedMethod() { // 子类无法重写此方法
System.out.println("不可重写");
}
}
六、本地方法(Native Method)
- 特点:使用 native 关键字声明,无方法体,通过JNI(Java Native Interface)调用非Java代码(如C/C++)。
- 应用场景:与底层系统交互(如 Thread.start0() 是本地方法)。
public class NativeDemo {
native void nativeMethod(); // 声明本地方法
static {
System.loadLibrary("native-lib"); // 加载本地库
}
}
七、方法引用(Method Reference)
- Java 8 Lambda表达式的简化形式,用于引用已存在的方法,有四种形式:
1. 类名::静态方法(如 Integer::parseInt )
2. 实例::实例方法(如 str::length )
3. 类名::实例方法(如 String::compareTo ,第一个参数作为方法调用者)
4. 构造器引用(如 Person::new )
// 传统Lambda
List<String> list = Arrays.asList("1", "2");
list.forEach(s -> System.out.println(s));
// 方法引用简化
list.forEach(System.out::println);
八、递归方法
- 定义:方法直接或间接调用自身,需设置终止条件(否则栈溢出)。
- 示例:计算阶乘
public int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n-1); // 递归调用
}
总结
Java方法的特性贯穿面向对象编程的核心逻辑,从参数传递机制到静态/动态绑定,再到Lambda时代的方法引用,这些特性共同构成了Java灵活且严谨的方法体系。理解它们能帮助你写出更高效、易维护的代码哦~ 😊