Java基础-方法的形式参数是类名的时候如何调用

本文深入探讨了Java中对象作为方法参数的使用方式,通过具体示例解释了如何创建对象并将其传递给方法,同时展示了如何在方法内部操作对象属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

答:如果你看到了一个方法的形式参数是一个类 类型(引用类型),这里其实需要的是该类的对象。

public class HelloWorld {
    public static void main(String[] args) {
        print(10);
        Student s1 = new Student(); //创建对象,并将对象的地址值赋值给s1
        print(s1);
    }
    //基本数据类型当做形式参数
    public static void print(int x){
        System.out.println(x);
    }
    public static void print(Student stu1){
        stu1.name = "张三";
        stu1.age =20;
        stu1.speak();
    }
}
class Student{
    String name;
    int age;
    public void speak(){
        System.out.println(name+"今年"+age+"岁。");
    }
}

<think>我们讨论的是Java中的方法引用(MethodReference)规则,具体是“类名::实例方法名”的形式。在Java中,方法引用是Lambda表达式的一种简化写法。当Lambda表达式只是调用一个已存在的方法时,可以使用方法引用。“类名::实例方法名”这种形式,需要满足以下条件:1.它引用的是某个类的实例方法。2.在函数式接口的抽象方法中,第一个参数是调用该实例方法的对象,后面的参数是该实例方法的参数。例如:(args)->obj.instanceMethod(args)可以写成obj.getClass()::instanceMethod或者ObjectType::instanceMethod(当第一个参数是obj,后面是args时)更具体地说,对于“类名::实例方法名”,函数式接口的抽象方法应该有至少一个参数,且第一个参数将作为该方法的目标对象(即调用方法的对象),其余参数将作为该方法的参数。举例说明:String类的实例方法:intcompareTo(StringanotherString)我们可以这样写方法引用:String::compareTo对应的Lambda表达式是:(Stringa,Stringb)->a.compareTo(b)注意:这里函数式接口的抽象方法需要两个参数(例如,Comparator接口的compare方法),第一个参数a作为compareTo方法调用者,第二个参数b作为compareTo方法的参数。另一个例子:BiFunction<String,String,Integer>func=String::compareTo;这等价于:BiFunction<String,String,Integer>func=(s1,s2)->s1.compareTo(s2);因此,规则总结:-使用“类名::实例方法名”时,函数式接口的抽象方法必须至少有一个参数,且第一个参数的类型是该类(或子类),这个参数将作为该实例方法调用者。-抽象方法的其余参数个数和类型必须与实例方法的参数列表匹配(除了缺少的第一个隐含的this参数)。下面我们用一个代码示例来演示:</think>### Java类名::实例方法名的规则解释 在Java方法引用中,`类名::实例方法名` 是一种特殊语法,需满足以下核心规则: 1. **隐含的调用者参数** 函数式接口的首个参数会作为该实例方法调用者(即 `this` 对象),其余参数作为方法的入参。 2. **函数式接口匹配** 目标函数式接口的抽象方法必须满足: - 参数个数 = 实例方法参数个数 + 1 - 首个参数类型 = 方法调用者类型 - 其余参数类型与实例方法参数类型匹配 3. **返回值兼容** 实例方法的返回值类型需兼容函数式接口的返回值类型(自动装箱/类型匹配)。 #### 代码示例 ```java import java.util.function.BiFunction; import java.util.function.Function; public class MethodReferenceExample { public static void main(String[] args) { // 示例1:String::length // 等效于 (String s) -> s.length() Function<String, Integer> lengthFunc = String::length; System.out.println(lengthFunc.apply("Hello")); // 输出 5 // 示例2:String::compareToIgnoreCase // 等效于 (String a, String b) -> a.compareToIgnoreCase(b) BiFunction<String, String, Integer> compareFunc = String::compareToIgnoreCase; System.out.println(compareFunc.apply("Java", "JAVA")); // 输出 0(相等) // 示例3:自定义类 BiFunction<Person, Integer, String> introFunc = Person::introduce; System.out.println(introFunc.apply(new Person("Alice"), 25)); // 输出 "Alice is 25 years old" } } class Person { private final String name; public Person(String name) { this.name = name; } // 实例方法:匹配 BiFunction<Person, Integer, String> public String introduce(int age) { return name + " is " + age + " years old"; } } ``` #### 关键说明 - **`String::length`** `Function<String, Integer>` 的首参数 `String s` 作为 `length()` 的调用者。 - **`String::compareToIgnoreCase`** `BiFunction<String, String, Integer>` 的首参数调用方法,次参数作为方法入参。 - **自定义类方法引用** `Person::introduce` 绑定到 `BiFunction<Person, Integer, String>`,首参数为调用者。 #### 常见错误场景 ```java // 错误:实例方法调用者参数 Function<String, Integer> errorFunc = String::toUpperCase; // 正确写法应为 Function<String, String>,因为 toUpperCase() 不需要额外参数 ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值