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。
相关文章
|
25天前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
222 0
|
2月前
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
146 1
|
1月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
166 0
|
1月前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
180 7
|
2月前
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
67 5
|
2月前
|
Java
Java基础学习day07-作业
本作业包含六个Java编程案例:1)动物类继承与多态;2)加油卡支付系统;3)员工管理类设计;4)学生信息统计接口;5)USB设备控制;6)家电智能控制。综合运用抽象类、接口、继承、多态等面向对象技术,强化Java基础编程能力。
167 3
|
2月前
|
Java
Java基础学习day06-作业
本内容为Java基础学习作业,涵盖两个案例:一是通过Card类及其子类GoldenCard、SilverCard实现加油卡系统,体现封装与继承;二是通过Shape类及子类Circle、Rectangle演示多态与方法重写,强化面向对象编程理解。
72 1
|
2月前
|
设计模式 存储 Java
Java基础学习day07
本节讲解Java中的final关键字、单例设计模式、枚举类、抽象类与接口。涵盖常量定义、单例写法(饿汉式/懒汉式)、枚举特点及应用场景,以及抽象类与接口的使用与区别,助力掌握核心面向对象编程思想。
131 1
|
2月前
|
算法 Java
Java基础学习day03-作业
本内容包含多个Java编程案例,涵盖条件判断、循环、数组、随机数生成、素数判断等基础算法练习,适用于巩固Java语法与逻辑思维训练。
122 6
|
2月前
|
Java
Java基础学习day05-作业
本文为Java基础学习第五天作业,通过五个案例练习类与对象的定义、构造方法、set/get方法及成员方法的应用。涵盖女友、学生、教师、手机和电影等类的设计与测试,强化面向对象编程基础。
77 2
下一篇