Java【14_2】接口(Comparable和Comparator)、内部类

  1. 接口

接口是支持多态的!

JDK1.8之前

① 所有个属性都是公有静态常量

② 所有的方法都是公有的抽象方法

③ 接口是不能实例化对象的,也没有构造器

④ 所以接口只能作为父级使用

⑤ 类可以实现多个接口,但是类需要实现接口中所有的抽象方法

⑥ 接口是可以继承多个接口的

JDK1.8

新增了两种类型的方法(可以有代码体)

a. 静态方法

static void staticMethod(){}

使用方式:接口名.staticMethod(); 一般就是使用在工具方法上

b. 默认方法

default void defaultMethod(){};

使用方式:实现类的对象.defaultMethod();

默认方法是可以被实现类重写!

冲突:

(1)实现类是可以实现接口,同时也可以继承父类

父接口和父类中有相同的方法,默认调用父类的(亲爹优先)

(2) 实现类是可以实现多个接口的

父接口1和父接口2有相同的默认方法!

实现类必须重写该方法!

① 自己真正的重写

② 选择其中的一个、几个或者都选

父接口.super.方法

  1. 经典的接口

2.1 java.lang.Comparable --> 自然排序

抽象方法--> int compareTo(Object obj)

功能:

this和obj比对大小!

返回值:

正数说明this大

负数说明this小

0说明一般大

对比两个对象的大小!(指定根据什么比)

在需要对比的类上实现该接口!

① 在Person类上实现该接口

② 实现该接口的抽象方法

③ 方法体中实现比较规则

2.2 java.util.Comparator --> 定制排序

int compare(Object o1,Object o2)

注意:定制排序的优先级高于自然排序

练习:

创建一个Person类,定义一些属性,然后创建Person数组,存储Person对象

对数组排序(自己定义根据什么排序,自己定义排序规则)

a. Comparable的使用

compareTo方法的功能

b. 理解为何要求排序的类必须实现Comparable接口

c. 体会接口的好处!

  1. 内部类

类的五大成员->成员变量、成员方法、构造器、初始化块、内部类

分类:

成员内部类 ★

静态成员内部类

方法(局部)内部类

匿名内部类 ★

3.1 匿名内部类 (只用一次)

语法:new 类、抽象类、接口(){}

解析:大括号就相当于是类的子类、接口的实现类的大括号

优缺点:

优点:简单一些(省略了创建类)

缺点:复用性很差

JDK1.8 Lambda表达式对部分匿名内部类简化(是一种函数式编程工具)

练习:

创建Person类,创建若干个属性,通过定制排序为Person数组排序!

要求排序规则使用匿名内部类!

3.2 成员内部类

位置:类体中(和其他成员在同级别的位置)

class文件:外部类$内部类.class

语法:【修饰符】 class 类名{}

成员:五大成员都可以存在!但是不可以有静态资源!

修饰符:四个访问修饰符都可以修饰!abstract final都可以单独修饰

abstract final放在一起不能修饰内部类

使用:

a. 内部类如何使用外部类的资源!

完全可以直接访问!

b. 外部类如何使用内部类资源!

需要实例化内部类的对象,使用

c. 外部其它类(测试类)如何使用内部类

需要实例化内部类的对象在使用!

(1)需要外部类对象

Outher outher=new Outher();

(2)在实例化内部类对象

Outher.Inner1 inner1=outher.new Inner1();

冲突问题解决:

外部类和内部类的属性或者方法重名!

this.内容 this是当前对象

Outher.this.内容 Outher.this外部类的对象

this是依赖于Outher.this的!

3.3 静态成员内部类

位置:类体中

class: Outher$Inner2.class

语法:【修饰符】 static class 类名{}

成员:五大成员都可以存在!包括静态资源!

修饰符:四个访问修饰符都可以修饰!abstract final都可以单独修饰

使用:

a. 内部类如何使用外部类的资源!

静态资源可以直接使用,非静态的实例化对象使用

b. 外部类如何使用内部类资源!

如果是静态资源,可以直接使用类名调用

如果是非静态的,实例化对象调用

c. 外部其它类(测试类)如何使用内部类

不在依赖于外部类的对象了

直接实例化对象即可:

Outher.Inner2 inner2=new Outher.Inner2();

冲突问题解决:

外部类的静态资源,和内部类的普通资源如果重复!

有办法区分,静态资源可以通过类名调用!

3.4 方法(局部)内部类

位置:在某个局部(方法内)

class: Outher$1Inner3.class

语法:【修饰符】class 类名{}

成员:五大成员都可以存在!但是不包括静态资源!

修饰符:abstract final可以单独修饰,访问修饰符不可以

使用:

a. 内部类如何使用外部类的资源!

直接使用

b. 外部类如何使用内部类资源!

当前局部,可以通过实例化对象的形式访问

其他地方无法访问!

c. 外部其它类(测试类)如何使用内部类

访问不到

冲突问题:

外部类和内部类属性重名,默认就近原则

this:当前对象

Outher.this 外部类对象

如果当前局部,存在局部变量,在内部类使用该变量的话!

默认会变为常量!

相关推荐
zh_xuan25 分钟前
c++ 单例模式
开发语言·c++·单例模式
coderSong256828 分钟前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
老胖闲聊1 小时前
Python Copilot【代码辅助工具】 简介
开发语言·python·copilot
Blossom.1181 小时前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
Mr_Air_Boy1 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
曹勖之1 小时前
基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
开发语言·python·机器人·ros2
豆沙沙包?2 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
军训猫猫头2 小时前
96.如何使用C#实现串口发送? C#例子
开发语言·c#
年老体衰按不动键盘2 小时前
快速部署和启动Vue3项目
java·javascript·vue
咖啡啡不加糖2 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存