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 外部类对象

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

默认会变为常量!

相关推荐
掘金-我是哪吒几秒前
分布式微服务系统架构第157集:JavaPlus技术文档平台日更-Java多线程编程技巧
java·分布式·微服务·云原生·架构
飞翔的佩奇9 分钟前
Java项目:基于SSM框架实现的忘忧小区物业管理系统【ssm+B/S架构+源码+数据库+毕业论文+开题报告】
java·数据库·mysql·vue·毕业设计·ssm框架·小区物业管理系统
阿蒙Amon9 分钟前
C#扩展方法全解析:给现有类型插上翅膀的魔法
开发语言·c#
RainbowSea26 分钟前
跨域问题(Allow CORS)解决(3 种方法)
java·spring boot·后端
掘金-我是哪吒28 分钟前
分布式微服务系统架构第155集:JavaPlus技术文档平台日更-Java线程池实现原理
java·分布式·微服务·云原生·架构
RainbowSea31 分钟前
问题 1:MyBatis-plus-3.5.9 的分页功能修复
java·spring boot·mybatis
尘浮72833 分钟前
60天python训练计划----day59
开发语言·python
前端 贾公子34 分钟前
monorepo + Turborepo --- 开发应用程序
java·前端·javascript
Chef_Chen1 小时前
从0开始学习R语言--Day39--Spearman 秩相关
开发语言·学习·r语言
不学会Ⅳ1 小时前
Mac M芯片搭建jdk源码环境(jdk24)
java·开发语言·macos