当前位置: 首页 > article >正文

java后端开发day23--面向对象进阶(四)--抽象类、接口、内部类

在这里插入图片描述
(以下内容全部来自上述课程)
在这里插入图片描述
在这里插入图片描述

1.抽象类

父类定义抽象方法后,子类的方法就必须重写,抽象方法在的类就是抽象类。

1.定义

  • 抽象方法
    共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样的,
    所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。

  • 抽象类
    如果一个类中存在抽象方法,那么该类就必须声明为抽象类

2.定义格式

  • 抽象方法
    public abstract 返回值类型 方法名(参数列表); (无{}方法体)

  • 抽象类
    public abstract class 类名{}

3.注意事项

  • 抽象类不能实例化(不能创建对象
  • 抽象类中不一定有抽象方法,有抽象方法的一定是抽象类
  • 可以有构造方法(javabean里的方法)
    作用:当创建子类对象时,给属性进行赋值的。
  • 抽象类的子类:
    要么重写抽象中的所有抽象方法
    要么是抽象类

2.接口

接口就是一种规则,是对行为的抽象。
不是仅自己独有的能力可以定义为接口。
请添加图片描述

1.定义和使用

  • 接口用关键字interface来定义
    public interface 接口名{}

  • 接口不能实例化

  • 接口和类之间是实现关系,通过implements关键字表示
    public class 类名 implements 接口名{}

  • 接口的子类(实现类)
    要么重写接口中的所有抽象方法
    要么是抽象类

注意1:
接口和类的实现关系,可以但单实现,也可以多实现。
public class 类名 implements 接口名1,接口名2{}
注意2:
实现类还可以在继承一个类的同时实现多个接口。
public class 类名 extends 父类 implements 接口名1,接口名2{}

新建接口:
请添加图片描述

2.接口中成员的特点

1.成员变量
  • 只能是常量
  • 默认修饰符:public static final
2.构造方法

没有

3.成员方法
  • 只能是抽象方法
  • 默认修饰符:public abstract
  • JDK7以前:接口中可以定义有方法体的方法
  • JDK8的新特性:接口中可以定义有方法体的方法。
  • JDK9的新特性:接口中可以定义私有方法。

3.接口和类之间的关系

1.类和类的关系

继承关系,只能单继承,不能多继承,但是可以多层继承

2.类和接口的关系

实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口

3.接口和接口的关系

继承关系,可以单继承,也可以多继承
细节:如果实现类实现了最下面的子接口,那么就需要重写所有的抽象方法

4.多学三招

1.JDK8开始接口中新增的方法
  • JDK7以前:接口中只能定义抽象方法
  • JDK8的新特性:接口中可以定义有方法体的方法。(默认,静态)
  • JDK9的新特性:接口中可以定义私有方法。
1.默认方法
  • 允许在接口中定义默认方法,需要使用关键字default修饰
    作用:解决接口升级的问题。

接口中默认方法的定义格式:

  • 格式:public default 返回值类型 方法名(参数列表){ }
  • 范例:public default void show(){ }

接口中默认方法的注意事项:

  • 默认方法不是抽象方法,所以不强制重写。但是如果被重写,重写的时候去掉default关键字
  • public可以省略,default不能省略
  • 如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
2.静态方法

允许在接口中定义定义静态方法,需要用static修饰

接口中静态方法的定义格式:

  • 格式:public static 返回值类型 方法名(参数列表){ }
  • 范例:public static void show(){ }

接口中静态方法的注意事项:

  • 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
  • public可以省略,static不能省略
3.JDK9新增的方法

接口中私有方法的定义格式:

  • 格式1:private 返回值类型 方法名(参数列表){ }
  • 范例1:private void show(){ }
  • 格式2:private static 返回值类型 方法名(参数列表){ }
  • 范例2:private static void method(){ }
2.接口的应用
  • 接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了。
  • 当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态。
3.适配器设计模式

简单来说:设计模式就是各种套路
适配器设计模式:解决接口与接口实现类之间的矛盾问题。
当一个接口中抽象方法过多,但是我要使用其中一部分的时候,就可以用适配器设计模式。

书写步骤:

  • 编写中间类XXXAdapter。实现对应接口
  • 对接口中的抽象方法进行空实现
  • 让真正的实现类继承中间类,并重写需要用的方法
  • 为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修饰

3.内部类

类的五大成员:
属性、方法、构造方法、代码块、内部类

1.定义

在一个类的里面,再定义一个类。
内部类表示的事物是外部类的一部分
内部类单独出现没有任何意义
比如:汽车的发动机,人的心脏等

内部类的访问特点:

  • 内部类可以直接访问外部类的成员,包括私有
  • 外部类要访问内部类的成员,必须创建对象 (new一个)

2.分类

1.成员内部类(了解)

写在成员位置的。属于外部类的成员。
成员内部类可以被一些修饰符所修饰,比如:private、默认、protected、public、static等
在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量

获取成员内部类对象的两种方式:

  1. 外部类编写方法,对外提供内部类对象
  2. 直接创建
  3. 格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
  4. 范例:Outer.Inner oi = new Outer().new Inner();

内存图请添加图片描述

2.静态内部类(了解)

静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象(new一个)

创建静态内部类对象的格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();
调用非静态方法的格式:先创建对象,用对象调用
调用静态方法的格式:外部类名.内部类名.方法名();

3.局部内部类(了解)

将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。
外界是无法直接使用的,需要在方法内部创建对象并使用(new一个)
该类可以直接访问外部类的成员,也可以访问方法内的局部变量

4.匿名内部类(掌握)

匿名内部类本质上就是隐藏了名字(只是不用自己起)的内部类。
可以写在成员位置,也可以写在局部位置。

细节:
包含了继承(类)或实现(接口),方法重写,创建对象。
整体就是一个类的子类对象或者接口的实现类对象。

使用场景:
当方法的参数是接口或者类时,
以接口为例,可以传递这个接口的实现类对象,
如果实现类只要使用一次,就可以用匿名内部类简化代码。
请添加图片描述
格式理解:(很牛,建议亲自去听)
请添加图片描述


http://www.kler.cn/a/565722.html

相关文章:

  • 超市里的货物价调整
  • 自然语言处理NLP入门 -- 第六节命名实体识别
  • C++20新特性:`[[no_unique_address]]`、`[[likely]]`和`[[unlikely]]`的探索与
  • 【新手入门】SQL注入之DNSlog注入
  • JavaScript 系列之:垃圾回收机制
  • RabbitMQ 的介绍与使用
  • 降维攻击!PCA与随机投影优化高维KNN
  • DeepSeek 开源狂欢周(二)DeepEP深度技术解析 | 解锁 MoE 模型并行加速
  • 双向冒泡排序算法
  • 模型的在线量化和离线量化
  • 深入理解分布式系统中的关键概念:三阶段提交、补偿事务、消息队列与Saga事务模型及分布式ID生成方案
  • Qt 中实现两个 QTableView 同步高亮与滚动的方案
  • 每日学习Java之一万个为什么?[MySQL面试篇]
  • 内容中台实战指南:效能提升与体系构建
  • Laravel从入门到精通:开启高效开发之旅
  • spring的15个经典面试题
  • reCAPTCHA v3 实现笔记
  • 第三方应用程序接入DeepSeek服务的安全策略与实践
  • 【分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
  • 数据链路层 ARP 具体过程 ARP 欺骗