Java基础学习day08

简介: 本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。

Java基础学习day08

代码块

定义

  • 代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)。

静态代码块:

格式

  • static { }

特点

  • 类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次。

作用

  • 完成类的初始化,例如:对静态变量的初始化赋值。

实例代码块:

格式

  • { }

特点

  • 每次创建对象时,执行实例代码块,并在构造器前执行。

作用

  • 和构造器一样,都是用来完成对象的初始化的,例如:对实例变量进行初始化赋值。

内部类

定义

  • 如果一个类定义在另一个类的内部,这个类就是内部类。
  • 当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以把这个事物设计成内部类。
public class Car{
    // 内部类
    public class Engine{
    }
}

成员内部类

定义

  • 就是类中的一个普通成员,类似前面我们学过的普通的成员变量、成员方法。
public class Outer {
    // 成员内部类
    public class Inner {
        
    }
}

创建对象的格式:
外部类名.内部类名 对象名 = new 外部类(...).new 内部类(...);
Outer.Inner in =  new Outer().new  Inner();

访问特点

  • 1、成员内部类种可以直接访问外部类的实例成员、静态成员。
  • 2、成员内部类的实例方法中,可以直接拿到当前外部类对象,格式是:外部类名.this 。

静态内部类

定义

  • 有static修饰的内部类,属于外部类自己持有。
public class Outer{
    // 静态内部类
    public static class Inner{

    }
}

外部类名.内部类名 对象名 = new 外部类.内部类();
Outer.Inner in =  new Outer.Inner();

访问特点

  • 可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员。

局部内部类(了解)

定义

  • 局部内部类是定义在在方法中、代码块中、构造器等执行体中。

匿名内部类

定义

  • 是一种特殊的局部内部类;
  • 所谓匿名:指的是程序员不需要为这个类声明名字,默认有个隐藏的名字。
new  类或接口(参数值…) {
    类体(一般是方法重写)
    };

new Animal(){
    @Override
    public void cry() {
    }
};

特点

  • 匿名内部类本质就是一个子类,并会立即创建出一个子类对象。

作用

  • 用于更方便的创建一个子类对象。

常见方式

  • 通常作为一个对象参数传输给方法。

应用场景

  • 调用别人提供的方法实现需求时,这个方法正好可以让我们传输一个匿名内部类对象给其使用。

案例

public class Test {
    public static void main(String[] args) {
        Student[] students = new Student[3];
        students[0] = new Student("玛卡巴卡", 16, 170.1);
        students[1] = new Student("唔西迪西", 12, 158.2);
        students[2] = new Student("依古比古", 18, 168.5);
        Arrays.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getAge() - o2.getAge();
            }
        });

        System.out.println(Arrays.toString(students));
    }
}

函数式编程

认识Lambda

定义

  • 此“函数”类似于数学中的函数(强调做什么),只要输入的数据一致返回的结果也是一致的

解决问题

  • 使用Lambda函数替代某些匿名内部类对象,从而让程序代码更简洁,可读性更好。

Lambda表达式

  • JDK 8开始新增的一种语法形式,它表示函数。
  • 可以用于替代某些匿名内部类对象,从而让程序更简洁,可读性更好。
(被重写方法的形参列表) -> {
    被重写方法的方法体代码。
    }

函数式接口

  • 有且仅有一个抽象方法的接口。

注意事项

  • Lambda表达式只能替代函数式接口的匿名内部类!!!
  • 将来我们见到的大部分函数式接口,上面都可能会有一个@FunctionalInterface的注解,该注解用于约束当前接口必须是函数式接口。

案例

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();
});

省略规则

作用

  • 用于进一步简化Lambda表达式的写法。

具体规则

  • 参数类型全部可以省略不写。
  • 如果只有一个参数,参数类型省略的同时“()”也可以省略,但多个参数不能省略“()” 。
  • 如果Lambda表达式中只有一行代码,大括号可以不写,同时要省略分号“;”如果这行代码是return语句,也必须去掉return。
相关文章
|
8天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1192 4
|
7天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
950 12
|
6天前
|
机器学习/深度学习 物联网
Wan2.2再次开源数字人:Animate-14B!一键实现电影角色替换和动作驱动
今天,通义万相的视频生成模型又又又开源了!Wan2.2系列模型家族新增数字人成员Wan2.2-Animate-14B。
536 11
|
17天前
|
人工智能 运维 安全
|
8天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
339 0
|
8天前
|
消息中间件 Java Apache
SpringBoot集成RocketMq
RocketMQ 是一款开源的分布式消息中间件,采用纯 Java 编写,支持事务消息、顺序消息、批量消息、定时消息及消息回溯等功能。其优势包括去除对 ZooKeeper 的依赖、支持异步和同步刷盘、高吞吐量及消息过滤等特性。RocketMQ 具备高可用性和高可靠性,适用于大规模分布式系统,能有效保障消息传输的一致性和顺序性。
463 2
|
15天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
8天前
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
1563 12