背景
抽象类
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
对比
抽象类 | 接 口 | |
---|---|---|
构造器 | 有构造器 | 不能构造器 |
实例化 | 可以实例化对象 | 无法实例化对象 |
实现 | 子类extends继承抽象类,并实现抽象类中声明的所有方法 | 类implements实现接口,需要提供其中声明的所有方法 |
访问修饰符 | 无限制 | 默认且必须是public static final |
继承 | 类无法多继承,但是可以继承多个接口 | 接口可以继承接口, |
速度 | 更快 | 因为需要寻找实现方法,比较慢 |
更新 | 如果要在抽象类中添加新方法,你可以给他提供默认的实现,因此不需要改变其他代码 | 若要在接口中添加方法,那么必须在所有引用该接口的类中实现 |
样例
//定义的抽象类“建筑”
abstract class Architecture{
protected String name;
protected double area;
public Architecture(String name,double area){
this.name=name;
this.area=area;
}
public void show() {
System.out.println("Name: "+name);
System.out.println("Area Coveredx: "+area+" square meter");
}
}
//接口“学校”,为实现这个接口的类确定规范
interface school
{
void ShowSchoolMotto();
}
//另一个接口“地址”
interface Location
{
//default关键词修饰非抽象方法
default void ShowSchoolLocation() {
System.out.println("Location: NONE");
};
}
//可以看到这个类继承了Architecture ,并实现了school,Location接口
class HZNU extends Architecture implements school,Location{
int age;
String motto;
String Location;
public HZNU(String name,double area,int age,String schoolmotto,String Location) {
super(name, area);
this.age=age;
this.motto=schoolmotto;
this.Location=Location;
}
public void ShowSchoolMotto() {
System.out.println("School Motto : "+motto);
}
public void show() {
super.show();
System.out.println("Age: "+age+" years");
ShowSchoolMotto();
ShowSchoolLocation();//因为default 关键词修饰,不需要实现
}
}
public class text_1
{
public static void main(String[] args)
{
HZNU myCollege=new HZNU("Hangzhou Normal University",2000000,114,"勤慎诚恕·博雅精进","");
myCollege.show();
}
}
程序输出:
Name: Hangzhou Normal University
Area Coveredx: 2000000.0 square meter
Age: 114 years
School Motto : 勤慎诚恕·博雅精进
Location: NONE
反思
在写文章时查阅的资料上说,存在着一种争论,就是“多态究竟是应该通过抽象继承实现还是通过实现接口实现”,教科书上的说是多态必须有继承,但是现在接口实现多态正在成为一种潮流。
接口作为一种类似模板的作用,限制更少,相对抽象类更加灵活,并且接口可以支持多继承,更加方便地实现一些功能。但是相对的,因为接口只是一种模板,当中没有提供完整的实现方法,需要对每一个实现该接口的类单独实现,并且当你需要修改更新时还要对每一个进行修改。
可以看出,抽象类和多态的引用场景不尽相同,我们在设计程序时要深入思考程序的维护和修改需求,再编写代码。毕竟程序员不是打字员。