- 接口
接口是支持多态的!
JDK1.8之前
① 所有个属性都是公有静态常量
② 所有的方法都是公有的抽象方法
③ 接口是不能实例化对象的,也没有构造器
④ 所以接口只能作为父级使用
⑤ 类可以实现多个接口,但是类需要实现接口中所有的抽象方法
⑥ 接口是可以继承多个接口的
JDK1.8
新增了两种类型的方法(可以有代码体)
a. 静态方法
static void staticMethod(){}
使用方式:接口名.staticMethod(); 一般就是使用在工具方法上
b. 默认方法
default void defaultMethod(){};
使用方式:实现类的对象.defaultMethod();
默认方法是可以被实现类重写!
冲突:
(1)实现类是可以实现接口,同时也可以继承父类
父接口和父类中有相同的方法,默认调用父类的(亲爹优先)
(2) 实现类是可以实现多个接口的
父接口1和父接口2有相同的默认方法!
实现类必须重写该方法!
① 自己真正的重写
② 选择其中的一个、几个或者都选
父接口.super.方法
- 经典的接口
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. 体会接口的好处!
- 内部类
类的五大成员->成员变量、成员方法、构造器、初始化块、内部类
分类:
成员内部类 ★
静态成员内部类
方法(局部)内部类
匿名内部类 ★
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 外部类对象
如果当前局部,存在局部变量,在内部类使用该变量的话!
默认会变为常量!