发布:2023/12/7 15:49:12作者:大数据 来源:大数据 浏览次数:432
一、抽象类
在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为抽象方法,抽象方法只有方法的声明,没有方法体。抽象类是用来捕捉子类的通用特性的 。它不能不能使用new关键字来实例化对象,只能被继承,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。
二、接口类型
Java中接口使用interface关键字修饰。接口是抽象方法的集合,比抽象类更抽象。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。
对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更,都具有此方法,就像ppt母板一样。;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动,即都需要实现新增的这个方法,也就是契约。
抽象类主要用于对一些事物公共属性或通用方法进行抽象,而接口主要实现了功能的拓展。
门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念
open() close()
比如,门可以有开门、关门,可以抽象出来,但有些门比如报警门,他不具有开和关,但具有报警功能,而如果将报警方法写到抽象类里,那所有有继承的门都具有报警、开、关了。但这样肯定不符合需要,这种情况就需要用接口来实现,可以定义一个报警门接口类型,对于需要的门可以实现这个接口就有报警功能了,如果这个门需要开、关,可以继承抽象对象,这样可以根据需要进行自由组装了。
具体可以参考如下代码:
abstract Door{
abstract void open();
abstract void close();
}
interface AlarmDoor{
void alarm();
}
普通门
public class MyDoor extends Door{
@Override
void open(){
//...
}
@Override
void close(){
//...
}
}
报警门
public class MyAlarmDoor implements AlarmDoor{
@Override
public void alarm(){
//...
}
}
既有开关,又有报警功能
public class MyDoor extends Door implements AlarmDoor{
//...
}
都不能直接被实例化,必须由子类(继承的抽象类或实现接口的类)进行实例化
类型 | abstract class | Interface |
---|---|---|
定义 | abstract class关键字 | Interface关键字 |
继承 | 抽象类可以继承一个类和实现多个接口;子类只可以继承一个抽象类 | 接口只可以继承接口(一个或多个);子类可以实现多个接口 |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可以使用其它修饰符 |
方法实现 | 可定义构造方法,可以有抽象方法和具体方法 | 接口完全是抽象的,没构造方法,且方法都是抽象的,不存在方法的实现 |
实现方式 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
作用 | 了把相同的东西提取出来,即重用 | 为了把程序模块进行固化的契约,是为了降低偶合 |
三、抽象类和接口的应用场景
1、如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
2、如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
3、如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
© Copyright 2014 - 2024 柏港建站平台 ejk5.com. 渝ICP备16000791号-4