一、抽象类
1. 抽象类和抽象方法
- 抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类。
- 抽象方法:将共性的方法抽取到父类之后,由于每一个子类执行的内容不一样,所以在父类中不能确定具体的方法体,该方法就可以定义为抽象方法。
- 作用:强制让子类按照某种格式重写。
2. 定义格式
public abstract class 类名 {}
public abstract 返回值类型 方法名(参数列表);
3. 注意事项
- 抽象类不能实例化
- 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。
- 可以有构造方法。
- 抽象类的子类,要么重写抽象类中的所有方法,要么是抽象类。
二、接口
1. 接口的定义
public interface 接口名 {}
- 接口不能实例化
- 接口和类之间是实现关系,通过implements关键字表示
public class 类名 implements 接口名 {}
- 接口的子类(实现类),要么重写接口中的所有抽象方法,要么是抽象类。
2. 注意事项
- 接口和类的实现关系,可以单实现,也可以多实现。
public class 类名 implements 接口名1, 接口名2 {}
- 实现类还可以在继承一个类的同时实现多个接口。
public class 类名 extends 父类 implements 接口名1, 接口名2 {}
3. 接口中成员的特点
- 成员变量:只能是常量;默认修饰符:
public static final
- 构造方法:没有
- 成员方法:只能是抽象方法;默认修饰符:
public abstract
- JDK7以前接口中只能定义抽象方法。JDK8接口中可以定义有方法体的方法。JDK9接口中可以定义私有方法。
4. 接口和类之间的关系
- 类与类的关系:继承关系,只能是单继承,不能是多继承,但是可以多层继承。
- 类和接口的关系:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现镀铬接口。
- 接口和接口的关系:继承关系,可以单继承,也可以多继承。
5. 接口中的默认方法(JDK8)
6. 接口中的静态方法(JDK8)
7. 接口中的私有方法(JDK9)
8. 接口的应用
- 接口代表规则,是行为的抽象。想让哪个类拥有一个行为,就让这个类实现对应的接口。
- 但一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称为接口多态。
9. 适配器设计模式
- 适配器设计模式:用于解决接口与接口实现类之间的矛盾问题——当一个接口中抽象方法过多,但是只要使用其中一部分,就可以哟适配器设计模式。
- 书写步骤:
- 编写中间类XXXAdapter,实现对应的接口;
- 对接口中的抽象方法进行空实现;
- 让真正的实现类继承中间类,并重写需要用的方法;
- 为了避免其他类创建适配器类的对象,中间的适配器类用abstract修饰。
三、内部类
1. 概念
- 类的五大成员:属性、方法、构造方法、代码块、内部类。
- 写在一个类里面的类就叫内部类。
- 内部类表示的是事物时外部类的一部分,内部类单独存在没有任何意义。
2. 访问特点
- 内部类可以直接访问外部类的成员,包括私有
- 外部类不能直接访问内部类的成员,必须创建对象
3. 分类
a. 成员内部类
b. 静态内部类
c. 局部内部类(了解)
- 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量。
- 外界是无法直接使用,需要在方法内部创建对象并使用。
- 给类可以直接访问外部类的成员,也可以访问方法内的局部变量。
d. 匿名内部类(重要)
- 匿名内部类本质上就是隐藏了名字的内部类,可以写在成员位置,也可以写在局部位置。
- 格式:
new 类名或接口名(){
重写方法;
};
- 注意事项:
- 包含了继承或实现、方法重写、创建对象。
- 整体就是一个类的子类对象或者接口的实现类对象。
- 使用场景:
- 当方法的参数是接口或者类时,如果接口或类只使用一次,就可以传递这个接口(类)的实现类(子类)对象,简化代码。
public interface Swim {
public abstract void swim();
}
public class Test {
public static void main(String[] args) {
new Swim() {
@Override
public void swim() {
System.out.println("游泳");
}
};
}
}