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

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

默认会变为常量!

相关推荐
咩咩啃树皮15 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
灯澜忆梦15 小时前
GO_并发编程---定时器
开发语言·后端·golang
鱟鲥鳚15 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
-银雾鸢尾-15 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-16 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
大模型码小白17 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司17 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地18 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415918 小时前
TCP超时重传机制是为了解决什么问题?
java
段一凡-华北理工大学19 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化