一. 抽象类
抽象类为什么无法实例化,无法创建对象?
抽象类是:类和类之间有共同特征,将这些具有共同特征的类再进一步形成了抽象类。由于类本身是不存的,所以抽象类无法创建对象
1、什么是抽象类
类和类之间有共同特征,将这些具有共同特征的类再进一步形成了抽象类。由于类本身是不存的,所以抽象类无法创建对象【无法实例化】
2、抽象类属于什么类型?
抽象类也属于引用数据类型
3、抽象类怎么定义?
语法:
[修饰符列表] abstract class 类名{
类体;
}
4、抽象类是无法实例化的,无法创建对象的,所以抽象类是用来被子类继承的。
5、final 与 abstract 不能联合使用,这两个关键字是对立的
6、抽象类的子类可以是抽象类
7、抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。
8、抽象类关联到一个概念:抽象方法。
抽象方法表示没有实现的方法,没有方法体的方法。
例如:public abstract void doSome (); 没有花括号
抽象方法特点是:
- 特点 1:没有方法体,以分号结尾。
- 特点 2:前面修饰符列表中有 abstract 关键字
9、抽象类中不一定有抽象方法,抽象方法必须在抽象类中。
重要结论:【必须背会】
一个非抽象的类继承抽象类,必须将抽象类中的抽象方法实现了。 这是 java 语法上强行规定的,必须的,否则编译器报错。 抽象类则不需要。
这里的覆盖或者重写,也可以叫做实现。(对抽象)
面向抽象编程
面向抽象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力 这种编程思想符合 OCP 原则。
二. 接口
- 接口也是一种引用数据类型。
- 接口是完全抽象的。(抽象类是半抽象。)或者也可以说接口是特殊的抽象类。
1. 接口的基础语法
1.1. 接口的语法
[修饰符列表] interface 接口名 {
}
[修饰符列表] class 类名{
}
1.2. 接口支持多继承,一个接口可以继承多个接口
interface A{
}
interface B{
}
interface C extends A,B{
}
1.3. 接口中只包含两部分内容
- 常量(不能修改)
- 抽象方法
接口没有其它内容,只有以上两部分。
1.4. 接口中的所有元素都是 public 修饰的
1.5. 接口中的抽象方法定义时 :public abstract 修饰符可以省略
1.6. 接口中的方法都是抽象方法,所以接口中的方法不能有结构体和方法体
1.7. 接口中的常量的 public 、static、final 可以省略。
1.8. 类实现接口实现方法
基础语法: 类和类之间叫做继承,类和接口之间叫做实现。
语法结构:
- 继承使用
extends关键字完成。 - 实现使用
implements关键字完成。
interface MyMath{
double PI=3.1415;
int sum(int a,int b);
int sub(int a,int b);
}
//正确写法
abstract class MyMathImp1 implements MyMath{
}
错误:MyMathImp1不是抽象的,并且未覆盖MyMath中的抽象方法
/*class MyMathImp1 implements MyMath{
}*/
修正:
class MyMathImp1 implements MyMath{
public int sum(int a,int b){
return a + b;
}
public int sub(int a,int b){
return a - b;
}
}
1.9. 当一个非抽象的类实现接口的话,必须将接口中所有的抽象方法全部实现(重点)
1.10. 面向接口的编程
//多态:父类型引用指向子类型的对象
//调用接口里面的方法(面向接口的编程)
MyMath mm = new MyMathImp1();
mm.sum(10,20);
1.11. 一个类可以实现多个接口
这种机制弥补了 java 中的一个缺陷:java 中的类和类只支持单继承。实际上单继承是为了简单而出现的,现实世界中存在多继承,java 中的接口弥补了单继承带来的缺陷。
1.12. 继承和实现同时存在 (extends 和 implements)
Extends 关键字在前,implements 关键字在后。
public class Test()
{
public static void main(String[] args){
Flyable f = new cat();//多态
f.fly();//输出结果:***
}
class Animal{
}
interface Flyable{
void fly();
}
class Cat extends Animal implements Flyable{
public void fly(){
System.out.println("***")
}
}
1.13. 使用接口写代码时,可以使用多态(父类型引用指向子类型对象)
2. 接口在开发中的作用(解耦合)
注意:接口在开发中的作用,类似于多态在开发中的作用。
多态:面向抽象编程,不要面向具体编程。降低程序的耦合度,提高程序的扩展力。
接口是不是完全的?
是的,而我们以后正好要求面向抽象编程。 面向抽象编程这句话以后可以修改为:面向接口编程。有了接口就有了可插拨。可插拔表示扩展力很强。不是焊接死的。
面向接口编程,可以降低程序的耦合度,提高程序的扩展力。符合 OCP 开发原则。 接口的使用离不开多态机制。(接口+多态才可以达到降低耦合度)
接口可以解耦合,解开的是调用者和实现者的耦合, 任何接口都有调用者和实现者。
- 调用者面向接口调用。
- 实现者面向接口编写实现。
三. 接口和抽象类的区别
1. 方法实现
- 抽象类:可以包含抽象方法和非抽象方法(有实现体的方法)
- 接口:在Java 8之前只能包含抽象方法;Java 8后可以包含默认方法(default)和静态方法;Java 9后还可以有私有方法
2. 继承关系
- 抽象类:只支持单继承,一个类只能继承一个抽象类
- 接口:支持多实现,一个类可以实现多个接口
3. 成员变量
- 抽象类:可以包含实例变量和常量
- 接口:只能包含常量(public static final)
4. 构造方法
- 抽象类:可以有构造方法
- 接口:不能有构造方法
5. 访问修饰符
- 抽象类:成员可以使用各种访问修饰符(public、protected、private)
- 接口:成员默认都是public的
6. 使用目的
- 抽象类:强调的是”是什么”(is-a)关系,表示类之间的继承关系
- 接口:强调的是”能做什么”(can-do)关系,表示类具有某种能力
7. 设计层次
- 抽象类:对类的抽象,是一种模板设计
- 接口:对行为的抽象,是一种行为规范
8. 使用场景选择
- 当你拥有一些方法并且想要让它们中的一些有默认实现,同时又需要子类必须实现其他方法,使用抽象类
- 当你想要定义一个契约/规范,而不关心实现细节,使用接口
- 当你需要支持多继承关系时,使用接口






