Java中接口和抽象类的联系与区别

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/Android_Technology/article/details/81480783

在了解Java中接口与抽象类的区别之前首先我们需要分别了解抽象类和接口到底是什么。

抽象类

  在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:  

abstract void fun();

  抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。

  抽象类是声明抽象的类,它可以包含或不包括抽象方法。抽象类不能实例化,但它可以被其他类继承。

  如果一个类包含抽象方法,则必须声明类本身是抽象的,如:

public abstract class GraphicObject {
   // declare fields
   // declare nonabstract methods
   abstract void draw();
}

  当抽象类为子类时,子类通常为其父类中的所有抽象方法提供实现。如果子类没有提供实现,那么子类也必须声明为抽象。

接口

  接口,英文称作interface,在软件工程中,接口泛指供别人调用的方法或者函数。从这里,我们可以体会到Java语言设计者的初衷,它是对行为的抽象。在Java中,定一个接口的形式如下:

[public] interface InterfaceName {

}

  接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。

要让一个类遵循某组特地的接口需要使用implements关键字,具体格式如下:

class ClassName implements Interface1,Interface2,[....]{
}

  可以看出,允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。
  

抽象类与接口比较

相同点

  1.不能被实例化。
  2.包含未实现的方法声明。
  3.派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员。

不同点

 一、语法层面上的区别 
  1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
  3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
  4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

 二、设计层面上的区别
  1.接口是对动作的抽象,抽象类是对本质的抽象。
  抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它。所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。
  
  2.设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。
  什么是模板式设计?最简单例子,大家都用过ppt里面的模板,如果用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt C进行改动。而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

参考

Java抽象类官方讲解:https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
Java接口官方讲解:https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html
深入理解Java的接口和抽象类:https://www.cnblogs.com/dolphin0520/p/3811437.html
Java 抽象类、普通类、接口的区别:https://blog.csdn.net/csdn_aiyang/article/details/71171886

猜你喜欢

转载自blog.csdn.net/Android_Technology/article/details/81480783