抽象类和接口
引入
在继承关系中,基类作为类生成对象,对程序来说不合理。
动物类作为基类,生成对象显然不合理
由此,我们可以设计定义基类为抽象类
此外,动物经过人类驯化,可以衍生出一些特别的技能
例如马戏团的老虎跳火圈、狗熊自行车等
这种通过训练后天获得的可以通过Java的接口实现
抽象类
abstract
修饰的类是抽象类。
public abstract class Animal{
}
特点
- 抽象类不能实例化对象
- 抽象类中可以定义抽象方法
- 抽象类中可以没有抽象方法
抽象方法
被abstract
修饰的方法是抽象方法。
- 抽象方法只有方法的声明,没有方法的实现,没有方法体。
- 包含抽象方法的类必须是抽象类
public abstract class Animal{
public abstract void eat();
}
抽象类的继承
- 子类继承抽象基类后,必须实现基类中的抽象方法。
- 或自身也定义为抽象类
以Animal
抽象基类为例
public class Cat extends Animal{
//实现抽象方法
public void eat(){
System.out.println("吃饭");
}
}
//或者
public abstract class Cat extends Animal{
//不实现抽象方法
}
接口
Java接口是一系列方法的声明,
接口可以看作是一种特别的抽象类
特点
- 包含常量,常量可以不加
final
修饰符 - 常量必须初始化
- 包含方法的声明,方法可以不加
abstract
修饰符 - 不包含变量
- 不包含方法的实现。(
static
、default
修饰的方法除外) - 接口不能继承类
- 接口不能实例化
interface Train{
void kneading();
}
使用
接口和继承类似,直接在类声明后添加implements
即可。
public class Cat implements Train{
public void kneading(){
System.out.println("踩奶");
}
}
与继承extends
不同,接口有不一样的特性:
- 一个类可以实现多个接口
- 一个接口可以被多个无关类实现
- 一个类实现接口,必须实现接口所以的抽象方法||定义为抽象类
接口的继承
Java接口的继承是多继承机制,一个接口可以同时继承多个接口
Java接口继承父接口后,自动继承父接口的所以方法和属性。
interface Train extends Practice,Drill...{
//接口代码
}
意义
- 补足Java类单继承的缺点
- 接口的抽象方法,可以在不同类中被实现
JDK8接口
随着技术更新,接口也有新的规则。
-
允许定义
static
方法 -
允许定义
default
方法
interface JDK8{
static void method(){
System.out.println("接口静态方法");
}
//在重写中,不能再加default修饰符
default void method(){
System.out.println("接口默认方法");
}
}
因为默认方法不是抽象方法,所以可以不重写
博客相关java项目:查看Github项目
对应github项目:Abstract、Interface
导入项目的方法: Java基础——Java如何导入本地项目