2.5.类名引用成员方法


一.格式:

注:这个和引用成员方法中的引用其他类的方法是有区别的,

引用其他类的方法的格式是其他类对象::方法名,其中是需要类对象的,需要new的,

而使用类名引用成员方法的格式是类名::成员方法,这里是不需要类对象的


二.练习:

需求:

集合里面有一些字符串,要求变成大写后进行输出

解答:

未使用方法引用前:
package com.itheima.a02game;
​
import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;
​
public class Main5 {
    public static void main(String[] args) {
        //1.创建集合对象
        ArrayList<String> list=new ArrayList<>();
​
        //2.添加数据
        Collections.addAll(list,"aaa","bbb","ccc","ddd");
​
        //3.操作集合数据->把集合的数据变成大写后进行输出->字符串型转为字符串型->用map方法
        list.stream().map(new Function<String, String>() {
            @Override
            public String apply(String s) { //s依次表示流里面的每一个数据即集合list的每一个元素
                return s.toUpperCase(); //toUpperCase方法可以把字符串的内容全部变成大写
            }
        }).forEach(s -> System.out.println(s));
​
    }
}
使用类名引用成员方法改写后:

map方法的形参Function是一个函数式接口,所以map方法的参数内可以使用方法引用。

使用类名引用成员方法的格式为类名::成员方法,所以直接在map方法的参数内套用这个格式即可:

(需求里要把集合里的字符串的内容全部变成大写,可以使用String类里的toUpperCase方法)

package com.itheima.a02game;
​
import java.util.ArrayList;
import java.util.Collections;
​
public class Main5 {
    public static void main(String[] args) {
        //1.创建集合对象
        ArrayList<String> list=new ArrayList<>();
​
        //2.添加数据
        Collections.addAll(list,"aaa","bbb","ccc","ddd");
​
        //3.操作集合数据->把集合的数据变成大写后进行输出->字符串型转为字符串型->用map方法
        list.stream().map(String::toUpperCase).forEach(s -> System.out.println(s));
​
    }
}
​

但这里和之前有些不同:

首先看String类里的toUpperCase方法:

方法引用的前提条件之一:被引用的方法的形参和返回值,需要和抽象方法的形参和返回值保持一致,

此时的抽象方法是apply方法,形参类型是String型,返回值是字符串,

被引用的toUpperCase方法返回值是字符串,但没有形参,而且没报错,这是为什么呢?

其实这是一种特殊的方法引用->

该方法引用的规则:(该种方法引用特有的规则)

  • 引用处必须是函数式接口

  • 被引用的方法必须已经存在->可以是Java写好的,可以是人为写好的,也可以是第三方写好的

  • 被引用的方法的形参,需要跟抽象方法的第二个形参到最后一个形参保持一致,返回值需要保持一致

  • 被引用的方法的功能需要满足当前的需求

抽象方法的形参的详解:

  • 抽象方法的第一个形参:表示被引用的方法的调用者,决定了可以引用哪些类中的方法,也就是说使用当前方式进行方法引用,不是所有类里的方法都能引用,这个类是有规定的,这个主要决定于第一个形参(在之前学的引用其他类的成员方法中,该方式可以引用所有类的成员方法,只需要获取到那个类的对象,再进行方法引用即可)。例如在stream流当中,第一个参数一般都表示流里面的每一个数据,假设此时流里面的数据是字符串型,那么使用这种方式进行方法引用,只能引用String这个类中的方法

  • 抽象方法的第二个参数到最后一个参数:跟被引用的方法的形参保持一致,如果没有第二个参数,说明被引用的方法需要是无参的成员方法

注:这种方法引用带有局限性,不能引用所有类中的成员方法,能引用的方法和抽象方法的第一个参数有关,第一个参数是什么类型的,那么就只能引用这个类中的方法。

抽象方法apply的第一个参数是字符串,所以此时只能引用String类里的方法。

抽象方法apply,apply方法此时只有一个形参,并没有第二个形参,所以被引用的方法需要是无参的成员方法,所以引用toUpperCase方法是合理的,而且apply方法的返回值和toUpperCase方法的返回值一致,toUpperCase方法的功能也满足了当前的需求。

所以上述例子中map(String::toUpperCase)就可以理解为拿着流里面的每一个数据,去调用String类里的toUpperCase方法,toUpperCase方法的返回值就是转换之后的结果。


关于下面的类描述中正确的是: class Test{ void test(int i){ System.out.println("I am an int."); } void test(String s){ System.out.println("I am a char"); } public static void main(String args[]){ Test t=new Test(); t.test('a'); } } A. 编译出错 B. 编译通过,运行出错 C. 编译通过,运行时输出“I am an int” D. 编译通过,运行时输出“I am a char" 分数 2 作者 周雪芹 单位 山东理工大学 关于类和对象的关系,下列说法哪种说法是错误的? A. 类和对象都是具体的。 B. 类是抽象的,对象是具体的。 C. 一般情况下,在定义类之后,能创建无数个对象,可以说,类能化身千万。 D. 类是引用型数据类型。 分数 2 作者 周雪芹 单位 山东理工大学 关于构造方法定义与作用,下列说法错误的是:( )。 A. 用来创建类的实例时调用的方法 B. 调用该方法时,对实例变量赋值 C. 定义时,方法名称与类名相同,返回值类型可以不写,也可以写成void D. 一个类的构造方法可以定义多个,多个构造方法的参数有明显区别。 分数 2 作者 周雪芹 单位 山东理工大学 以下有关构造方法的说法,正确的是: ____。 A. 一个类的构造方法可以有多个 B. 构造方法在类定义时被调用 C. 构造方法只能由对象的其它方法调用 D. 构造方法可以和类同名,也可以和类名不同 分数 2 作者 周雪芹 单位 山东理工大学 关于以下代码的说明,正确的是( )。 class Main { static int x = 10; static { x += 5; System.out.println("x=" + x); } public static void main(String args[ ]) { System.out.println("x=" + x); } static { x /= 3; System.out.println("x=" + x); } } A. 不能通过编译,因为缺少方法名和返回类型 B. 不能通过编译,因为只能有一个静态初始化器 C. 编译通过,执行结果为: x=15 x=5 x=5 D. 编译通过,执行结果为: x=3 x=8 x=8 分数 2 作者 周雪芹 单位 山东理工大学 在Java中,针对类和成员提供了4种访问级别,以下控制级别由小到大的顺序是:( )。 A. private< 默认 < protected < public B. 默认 < private< protected < public C. protected < 默认 < private < public D. protected < private< 默认 < public 分数 2 作者 周雪芹 单位 山东理工大学 在成员方法的访问控制修饰符中,规定访问权限只包含该类自身作用域和同包作用域的修饰符是( )。 A. protected B. public C. 默认 D. private 分数 2 作者 周雪芹 单位 山东理工大学 下列关于修饰符使用的说法,错误的是( )。 A. abstract不能与final并列修饰同一个类 B. abstract类中可以有private的成员 C. abstract方法必须在abstract类中 D. static方法中能访问非static的属性 分数 2 作者 周雪芹 单位 山东理工大学 在非静态成员方法中,可以使用关键字( )指代当前对象,访问类的其他非静态成员。 A. this B. super C. static D. public 分数 2 作者 周雪芹 单位 山东理工大学 有如下程序代码,哪处出现编译错误?( ) class Father { int a = 100; // A final public void print() { // B System.out.println(a); } } class Child extends Father { int a = 200; // C public void print() { // D System.out.println(a); } } A. A处 B. B处 C. C处 D. D处
最新发布
10-29
### 方法重载调用结果 方法重载是指在一个类中定义多个同名的方法,但这些方法的参数列表不同(参数的类型、个数或顺序不同)。调用时,Java 会根据传入的实参类型、个数和顺序来决定调用哪个重载方法。例如: ```java class Calculator { public int add(int a, int b) { return a + b; } public double add(double a, double b) { return a + b; } } // 在调用时 Calculator calc = new Calculator(); int result1 = calc.add(1, 2); // 调用第一个 add 方法 double result2 = calc.add(1.5, 2.5); // 调用第二个 add 方法 ``` ### 类和对象关系判断 类是对象的抽象描述,是一种自定义的数据类型,它定义了对象的属性和行为。对象是类的具体实例,是根据类创建出来的实体。例如,`Student` 是一个类,而具体的“小明”“小李”就是 `Student` 类的对象。可以通过 `new` 关键字来创建对象,如 `Student s = new Student();` [^2]。 ### 构造方法定义与作用正误判断 构造方法是一种特殊的方法,用于创建对象并初始化对象的属性。它的名称必须与类名相同,且没有返回类型(连 `void` 也没有)。构造方法的作用是在创建对象时进行一些必要的初始化操作。例如: ```java class Person { String name; int age; // 构造方法 public Person(String name, int age) { this.name = name; this.age = age; } } ``` 这里 `Person` 类的构造方法用于初始化 `name` 和 `age` 属性。构造方法定义正确时,能在创建对象时正确初始化属性;若定义错误,如方法名与类名不一致、有返回类型等,会导致编译错误。 ### 构造方法特点判断 构造方法具有以下特点: - 方法名与类名相同。 - 没有返回类型,连 `void` 也不能有。 - 可以有参数,也可以无参数(无参构造方法)。 - 构造方法可以重载,利用不同的构造方法创建出不同需求的对象,因为重载构造方法的参数不一样,使用不同参数的构造方法创建出来的对象可能具有不同的初始状态 [^2]。 ### 静态代码块执行结果判断 静态代码块是用 `static` 关键字修饰的代码块,它在类加载时执行,且只执行一次。例如: ```java class StaticBlockExample { static { System.out.println("静态代码块执行"); } public static void main(String[] args) { System.out.println("主方法执行"); } } ``` 程序运行时,会先输出“静态代码块执行”,再输出“主方法执行”。 ### Java 访问控制级别顺序 Java 有四种访问控制级别,从高到低依次为: 1. `public`:可以被任何类访问。 2. `protected`:可以被同一包内的类以及不同包中的子类访问。 3. 默认(没有修饰符):只能被同一包内的类访问。 4. `private`:只能在本类内部访问。 ### 成员方法访问控制修饰符作用范围 - `public`:成员方法可以被任何类调用。 - `protected`:在同一包内的类可以调用,不同包中的子类也可以调用。 - 默认(无修饰符):只能被同一包内的类调用。 - `private`:只能在本类内部调用。 ### 修饰符使用规则正误判断 不同的修饰符有不同的使用规则,例如: - `static` 修饰的成员属于类,而不是对象,可以通过类名直接访问。 - `final` 修饰的类不能被继承,修饰的方法不能被重写,修饰的变量是常量,一旦赋值不能再修改。 - `abstract` 修饰的类是抽象类,不能实例化,抽象类中可以有抽象方法,抽象方法必须在子类中实现。 ### 非静态成员方法指代当前对象的关键字 在非静态成员方法中,使用 `this` 关键字来指代当前对象。例如: ```java class Dog { String name; public Dog(String name) { this.name = name; // this 指代当前创建的 Dog 对象 } } ``` ### 代码编译错误位置判断 判断代码编译错误位置需要仔细检查代码的语法、逻辑和访问权限等方面。常见的编译错误包括: - 语法错误,如缺少分号、括号不匹配等。 - 类型不匹配,如将 `int` 类型的值赋给 `String` 类型的变量。 - 访问权限问题,如试图访问 `private` 成员。 - 未定义的变量或方法,如调用一个不存在的方法。 例如: ```java class Test { public static void main(String[] args) { int num = "abc"; // 类型不匹配,编译错误 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值