抽象类和接口的孰是孰非

背景

抽象类

接口(英文: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

反思

在写文章时查阅的资料上说,存在着一种争论,就是“多态究竟是应该通过抽象继承实现还是通过实现接口实现”,教科书上的说是多态必须有继承,但是现在接口实现多态正在成为一种潮流。

接口作为一种类似模板的作用,限制更少,相对抽象类更加灵活,并且接口可以支持多继承,更加方便地实现一些功能。但是相对的,因为接口只是一种模板,当中没有提供完整的实现方法,需要对每一个实现该接口的类单独实现,并且当你需要修改更新时还要对每一个进行修改。

可以看出,抽象类和多态的引用场景不尽相同,我们在设计程序时要深入思考程序的维护和修改需求,再编写代码。毕竟程序员不是打字员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值