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

本文详细介绍了Java中方法参数传递的方式,包括基本数据类型和引用数据类型的传递特点,并通过实例展示了如何使用类对象作为方法参数。

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

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

class Demo_Student {
    public static void main(String[] args) {
        print(10);

        Student s = new Student();                  //创建对象,并将对象的地址值赋值给s
        print(s);                                   //对象赋值给s的为地址值
    }

    public static void print(int x) {               //基本数据类型当作形式参数
        System.out.println(x);
    }
    //方法的重载
    public static void print(Student stu) {         //引用数据类型当作形式参数
        stu.name = "张三";
        stu.age = 23;
        stu.speak();
    }
}
/*
 * A:方法的参数是类名public void print(Student s){}//print(new Student());
 * 如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象。
 */
class Student {
    String name;                    //姓名
    int age;                        //年龄

    public void speak() {
        System.out.println(name + "..." + age);
    }
}

注意事项:
* 其中stu和s为两个方法里面的局部变量,不能相互访问。则stu和s可以重名,指向同一个对象。
* 基本数据类型当做形式参数给的是值。
* 引用数据类型当做形式参数给的是地址值。

<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
发出的红包

打赏作者

左绍骏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值