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

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

默认会变为常量!

相关推荐
supingemail1 分钟前
面试之 Java 新特性 一览表
java·面试·职场和发展
星星点点洲7 分钟前
【Java】应对高并发的思路
java
LDM>W<10 分钟前
黑马点评-用户登录
java·redis
保利九里16 分钟前
数据类型转换
java·开发语言
Uranus^19 分钟前
使用Spring Boot与Spring Security构建安全的RESTful API
java·spring boot·spring security·jwt·restful api
蚂蚁在飞-20 分钟前
Golang基础知识—cond
开发语言·后端·golang
Aiden Targaryen21 分钟前
Windows/MacOS WebStorm/IDEA 中开发 Uni-App 配置
java·uni-app·webstorm
啾啾Fun31 分钟前
【Java微服务组件】分布式协调P1-数据共享中心简单设计与实现
java·分布式·微服务
Brilliant Nemo32 分钟前
Vue2项目中使用videojs播放mp4视频
开发语言·前端·javascript
TNTLWT1 小时前
Qt控件:交互控件
开发语言·qt