1.抽象类(掌握)
- 引入:
- 动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的
- 我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须是抽象类
- 特点:
- 抽象类和抽象方法必须用abstract关键字修饰
- 抽象类中不一定有抽象方法,但是有抽象方法的类必须定义为抽象类
- 抽象类不能自身实例化,因为它不是具体的:
//Animal是抽象的; 无法实例化 //Animal a = new Animal();
抽象类有构造方法,但是不能实例化,那么构造方法的作用是什么呢?
答:是给子类用的,用于子类访问父类数据的初始化 - 抽象类是靠具体的子类实现实例化的(是多态的方式):
Animal a = new Cat();
- 抽象的子类
a:如果不想重写抽象方法,该子类必须是一个抽象类
b:重写所有的抽象方法,这个时候子类是一个具体的类
abstract class Animal { //抽象类的声明格式
//抽象方法
//public abstract void eat(){} //空方法体,会报错,因为抽象方法不能有方法体
public abstract void eat(); //正确
public Animal(){}
}
2.抽象类的成员特点:
- 构造方法:有,用于子类访问父类数据的初始化
- 成员变量:可以有变量,也可以有常量
- 成员方法:可以有抽象方法,也可以有非抽象方法
- 抽象方法:强制要求子类做的事情
- 非抽象方法:子类继承的事情,提高代码复用性
3.抽象类案例练习
- 猫狗案例练习:
2019-08-19com
和2019-08-19com.aniabstract
- 员工案例练习:
2019-08-19com.empabstract
// 重点
4.抽象类的几个小问题
- 一个类如果没有抽象方法,却定义为了抽象类,有什么用?
为了不让创建对象 - abstract不能和哪些关键字共存
会报错:非法的修饰符组成 - final 冲突
final修饰的不能被重写,abstract修饰又要让子类重写,自然会冲突 - private 冲突
方法用abstract修饰是为了让子类重写,加private子类看不到还怎么重写? - static 无意义
假如存在static abstract void show();
那么我们直接用类名调用它,它没有方法体,调用它也就是什么都没做,所以这么调用无意义
5.接口(掌握)
- 引入:
回顾猫狗案例,它们仅仅提供一些基本功能
猫钻火圈,狗跳高等功能,不是动物本身就具备的,是在后面的培养中训练出来的
这种额外的功能,java提供了接口表示。 - 特点:
//接口并不是实际意义上的一个类,它仅仅表示功能的扩展 - 接口用关键字interface修饰,格式:nterface 接口名 {}
- 类实现接口用implements修饰,格式:class 类名 implements 接口名 {}
- 接口是抽象的,自身不能实例化
但可以按照多态的方式,由具体的子类实例化。其实这也是多态的一种,接口多态 - 接口的实现类
抽象类实现接口(意义不大)
具体类实现接口,那么这个类必须重写接口中的所有抽象方法
6.接口的成员特点:
-
构造方法:没有构造方法
记:
《所有的类都默认继承自Object类》–也就是说,当你没有父类时,你的父类就是Object类
所以,实现接口的具体类要访问父类构造方法时,会去访问Object类的无参构造方法,不必担心没有父类构造方法 -
成员变量:只有常量,默认接口中的成员变量定义中,都隐含了修饰符public static final
-
成员方法:只有抽象方法,默认接口中的成员方法定义中,都隐含了修饰符public abstract(因为,接口中的方法不能带主体)
7.类与类,类与接口,接口与接口
- 类与类
继承关系,只能单继承,可以多层继承 - 类与接口
实现关系,可以单实现,也可以多实现
还可以在继承一个类的同时,实现多个接口 //注意,实现多个接口时,对应的接口实现对应的方法 - 接口与接口
继承关系,可以单继承,也可以多继承
8.抽象类和接口的区别(自己补齐)
-
A:成员区别
-
抽象类:
成员变量:可以有变量,也可以有常量
构造方法:有
成员方法:可以有抽象方法,也可以有非抽象方法 -
接口:
成员变量:只有常量
构造方法:没有
成员方法:只有抽象方法 -
关系区别:(见第7点)
-
类与类
-
类与接口
-
接口与接口
-
设计理念不同
-
抽象类:被继承体现的是:”is a”的关系,抽象类中定义的是该继承体系的共性功能
-
接口:被实现体现的是:”like a”的关系,接口中定义的是该继承体系的扩展功能
9.接口案例练习:
- 学生和老师,加入抽烟接口:
2019-08-19com.perinterface
- 运动员和教练,加入学习英语接口:
2019-08-20motion