1,代码块
内部类
成员内部类是什么? 如何创建其对象?
就是类中的一个普通成员,类似前面我们学过的普通成员变量、成员方法
外部类名.内部类名 对象名 = new 外部类(...).new 内部类(…);
成员内部类的实例方法中,访问其他成员有啥特点?
可以直接访问外部类的实例成员、静态成员
可以拿到当前外部类对象,格式是:外部类名.this。
静态内部类
什么是静态内部类?如何创建对象? 有啥特点?
有static修饰的内部类。
外部类名.内部类名 对象名 = new 外部类.内部类(…);
可以直接访问外部类的静态成员,不能直接访问外部类的实例成员。
局部内部类(了解)
匿名内部类
- package com.jinhei.demo;
- public class Test {
- public static void main(String[] args) {
- // 目标:搞清楚匿名内部类的使用形式(语法): 通常可以做为一个对象参数传输给方法使用。
- // 需求:学生,老师都要参加游泳比赛。
- Swim s1 = new Swim() {
- @Override
- public void swimming() {
- System.out.println("学生🏊贼快~~~~");
- }
- };
- start(s1);
- System.out.println("====================================");
- start(new Swim() {
- @Override
- public void swimming() {
- System.out.println("老师🏊贼溜~~~~");
- }
- });
- }
- // 设计一个方法,可以接收老师,和学生开始比赛。
- public static void start(Swim s) {
- System.out.println("开始。。。。");
- s.swimming();
- System.out.println("结束。。。。");
- }
- }
- interface Swim {
- void swimming(); // 游泳方法
- }
复制代码
Lambda表达式
使用Lambda简化comparator接口的匿名内部类
什么是函数式接口?
有且仅有一个抽象方法的接口。
注意:将来我们见到的大部分函数式接口,上面都可能会有一个@FunctionalInterface的注解,该注解用于约束当前接口必须是函数式接口。
- package com.jinhei.demo;
- public class Test {
- public static void main(String[] args) {
- // 目标:认识Lambda表达式:搞清楚其基本作用。
- Animal a = new Animal() {
- @Override
- public void cry() {
- System.out.println("🐱是喵喵喵的叫~~~~");
- }
- };
- a.cry();
- // 错误示范:Lambda并不是可以简化全部的匿名内部类,Lambda只能简化函数式接口的匿名内部类。
- // Animal a1 = () -> {
- // System.out.println("🐱是喵喵喵的叫~~~~");
- // };
- // a1.cry();
- System.out.println("=====================================================");
- /* Swim s1 = new Swim() {
- @Override
- public void swimming() {
- System.out.println("学生🏊贼快~~~~");
- }
- }; */
- // Lambda只能简化函数式接口的匿名内部类。
- Swim s1 = () -> {
- System.out.println("学生🏊贼快~~~~");
- };
- s1.swimming();
- }
- }
- abstract class Animal{
- public abstract void cry();
- }
- // 函数式接口:只有一个抽象方法的接口。
- @FunctionalInterface // 声明函数式接口的注解。
- interface Swim{
- void swimming();
- }
复制代码 1、什么是函数式编程?有是好处?
使用Lambda函数替代某些匿名内部类对象,从而让程序代码更简洁,可读性更好。
2、Lambda表达式是啥?有什么用?怎么写?
JDK8新增的一种语法,代表函数;可以用于替代并简化函数式接口的匿名内部类。
3、什么样的接口是函数式接口?怎么确保一个接口必须是函数式接口?
只有一个抽象方法的接口就是函数式接口。
在接口上加上@FuncationalInterface注解即可。
- package com.jinhei.demo;
- import javax.swing.*;
- import java.util.Arrays;
- public class Test {
- public static void main(String[] args) {
- // 目标:用Lambda表达式简化实际示例。
- test1();
- test2();
- }
- public static void test1(){
- Student[] students = new Student[6];
- students[0] = new Student("殷素素", 35, 171.5, '女');
- students[1] = new Student("杨幂", 28, 168.5, '女');
- students[2] = new Student("张无忌", 25, 181.5, '男');
- students[3] = new Student("小昭", 19, 165.5, '女');
- students[4] = new Student("赵敏", 27, 167.5, '女');
- students[5] = new Student("刘亦菲", 36, 168, '女');
- // 需求:按钮年龄升序排序。可以调用sun公司写好的API直接对数组进行排序。
- // Arrays.sort(students, new Comparator<Student>() {
- // @Override
- // public int compare(Student o1, Student o2) {
- // return o1.getAge() - o2.getAge(); // 按照年龄升序!
- // }
- // });
- // Arrays.sort(students, (Student o1, Student o2) -> {
- // return o1.getAge() - o2.getAge(); // 按照年龄升序!
- // });
- // Arrays.sort(students, (o1, o2) -> {
- // return o1.getAge() - o2.getAge(); // 按照年龄升序!
- // });
- Arrays.sort(students, (o1, o2) -> o1.getAge() - o2.getAge());
- // 遍历数组中的学生对象并输出
- for (int i = 0; i < students.length; i++) {
- Student s = students[i];
- System.out.println(s);
- }
- }
- public static void test2(){
- JFrame win = new JFrame("登录窗口");
- win.setSize(300, 200);
- win.setLocationRelativeTo(null); // 居中显示。
- win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- JPanel panel = new JPanel();
- win.add(panel);
- JButton btn = new JButton("登录");
- panel.add(btn);
- // java要求必须给这个按钮添加一个点击事件监听器对象,这样就可以监听用户的点击操作,就可以做出反应。
- // 开发中不是我们要主动去写匿名内部类,而是用别人的功能的时候,别人可以让我们写一个匿名内部类吗,我们才会写!!
- // btn.addActionListener(new ActionListener() {
- // @Override
- // public void actionPerformed(ActionEvent e) {
- // System.out.println("登录成功!");
- // }
- // });
- // btn.addActionListener((ActionEvent e) -> {
- // System.out.println("登录成功!");
- // });
- // btn.addActionListener((e) -> {
- // System.out.println("登录成功!");
- // });
- // btn.addActionListener(e -> {
- // System.out.println("登录成功!");
- // });
- btn.addActionListener(e -> System.out.println("登录成功!"));
- win.setVisible(true);
- }
- }
复制代码
Lambda表达式的省略规则
作用:用于进一步简化Lambda表达式的写法。
具体规则
参数类型全部可以省略不写。
如果只有一个参数,参数类型省略的同时“()”也可以省略,但多个参数不能省略“()”
如果Lambda表达式中只有一行代码,大括号可以不写,同时要省略分号“;”如果这行代码是return语句,也必须去掉return。
|
|