Java抽象类与接口的对比-创新互联

  其实说实话,没有多大的可比较性,它们是完全不同的两个东西,它们的抽象不在同一个层级上。但是为了让大家更好的理解,还是做一个比较吧,毕竟它们都很抽象(233)。

成都创新互联-专业网站定制、快速模板网站建设、高性价比镜湖网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式镜湖网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖镜湖地区。费用合理售后完善,10余年实体公司更值得信赖。

首先是语法层面上的对比

1)抽象类跟接口都不能被实例化,因为它们都很虚嘛。但是在访问权限上,两者有一定的区别。

  a、抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。理由很简单,容我慢慢道来。

  抽象方法是没有方法体的,它的目的就是用来继承的,所以如果使用private修饰,不就不能被继承了吗?这就违背了它的设计初衷了,所以不能用private来修饰抽象方法。至于static,用它来修饰的方法可以不实例化就可以直接调用,但是抽象方法没有方法体,使用static修饰就没有意义了。synchronized是用来加锁的,如果修饰类中的方法的话,就相当于用this变量锁,但是抽象类是不能被实例化的,抽象方法也不是在本类中实现而是在子类中实现的,所以锁应该是子类所属,所以抽象方法不能用synchronized关键字修饰;至于native,这个跟abstract关键字本身就是冲突的,abstract声明方法交给子类实现,而native则是交给本地操作系统实现,如果同时出现,那就相当于把实现交给子类,又交给本地操作系统,那最后到底由谁来实现呢?

  综上所述,抽象类中的抽象方法只能用public和protected修饰。

  b.接口中的方法全部为public abstract修饰,不能使用其他修饰符,而且默认情况(不加任何修饰符)下,也是public abstract的,因为接口只能被类实现,不能被类继承,所以不能使用protected修饰,但接口是可以继承接口的。

2)抽象类跟普通类的唯一区别就是不能被实例化,可以有抽象方法,所以它可以有构造函数,静态方法,静态代码块,可以有普通的成员变量和方法。但是接口就不一样了,接口只能声明public abstract的方法和public static final的成员变量。

3)抽象类本质上还是一个类,只能单继承,一个类只能继承一个抽象类,但可以实现多个接口。

其次是概念上的比较

1)抽象类跟接口的抽象角度不一样,抽象类一般是对某些具有相似属性和方法的类进行抽象,抽象出一个统一的父类。而接口则更多的是多一组特定行为的抽象,关注的是行为,而具有这些行为的类之间可能并没有太大的关联性。

  比如说,飞机能上天,鸟能上天,你要是厉害一点,应该也能上天(逃),但显然两者之间的关联度不大,如果硬是要给它们插上一个公共的父类的话,似乎不合情理,看起来就像这样:

public abstract class Flyer {
  public abstract void fly();
}

本文名称:Java抽象类与接口的对比-创新互联
网站链接:http://myzitong.com/article/coeocj.html