Java中关于方法的其他特性

在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灵活且严谨的方法体系。理解它们能帮助你写出更高效、易维护的代码哦~ 😊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值