接口与抽象类的区别
1、抽象类:是从多个类中抽象出来的模板,是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。将这种抽象更彻底进行,可以得到一种特殊的抽象类——>接口<——没有继承关系的类,也可以有共有的行为。
抽象类以JDK中的GenericServlet为例:
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
// abstract method
abstract void service(ServletRequest req, ServletResponse res);
void init() {
// Its implementation
}
// other method related to Servlet
}
接口——》定义使用关键字是
interface
接口名字往往叫做**able,代表了具有什么样的能力
访问修饰符只能是 public ,就算不写也是默认为public而不是包。
在多个具体类中的共性行为,放到作为父类的抽象类中实现;而具体类中不同的行为,在抽象类中用抽象方法的形式定义,在具体的子类实现。
2、 接口中全部是抽象方法,所以不能实例化。类不能继承接口,只能实现接口所定义的方法。
3、接口与类的关系叫做:实现。
4、 一个类在声明的最后用关键字 implements,后面接上接口的名字即可。
这个类就被称为***接口的实现类。
5、一个类可以在继承父类的同时,又实现接口(一个或多个接口)。
6、一个类如果实现了接口,必须实现该接口中所有的抽象方法,否则这个类就是抽象类。
7、类从接口中获取的方法会参与到继承中去。
语法: 先写继承,再写实现,如果没有写继承则默认继承Object;
public abstract class newCar extends Object implements Serviable,Wearable{
}
动态绑定方式:接口的引用可以指向实现类的对象;接口的引用只能看到对象身上来自于这个接口的行为
一、接口与类的相似之处:
- 接口可以有任意数量的方法;
- 接口保存为以“java”为后缀名的文件,接口需要与文件名一致;
- 接口编译后是class文件
- 在包中的接口,其相应的字节码文件必须放置在和包名称一致的一个目录结构中。
二、 接口与类的不同之处:
- 接口不能实例化;
- 接口不包含任何构造器,不能构造方法,不能产生对象,不能单独去用,必须绑定在类身上用;
- 接口中的所有方法都是抽象的;
- 接口中不能包含实例成员变量。唯一可以出现在接口中的成员变量必须是同时声明为static和 final;
- 接口不能被一个类继承,只能被一个类来实现;
6.接口可以继承接口, 一个接口能够继承多个接口。
重点:接口不是类。类描述了对象的属性和行为,而接口包含了一个类需要实现的行为
接口的属性——:只能是公共的、静态、常量。
其中修饰符关键字全部可以省略,但是省略后也是默认为: 公共静态长量。
public static final int A= 100;
public final int B= 200;
final int C = 300;
int D = 400;
JDK1.8的java运行当中允许实现方法,但要用default声明
特殊点:用default声明,虽然有这个功能,但是接口最大的意义还是写抽象方法,让没有没有继承关系的类可以共享行为,但又可以各有各的实现。
default void wear();
system.out.println("穿");
public default void test(){
system.out.println(" JDK1.8的java运行当中允许实现方法,但要用default声明 ")
}
三、接口和抽象类都具有的特征:
- 二者都不能被实例化,他们都位于继承树的顶端,用于被其它类实现或者继承。
- 二者都可以包含抽象方法,实现接口或者继承抽象类的子类都必须实现这些抽象方法。
四、接口和抽象类的差异性:
1. 设计目的上的差别:
抽象类通常是作为多个子类的共同父类,实现部分功能,其他的功能交给不同的子类完成,体现的是一种模板式设计;而接口体现的是一种规范,接口规定了实现者必须向外提供什么,规定了调用者可以调用那些,以及如何调用。
2. 用法上的差别:
1、接口只能包含抽象方法,访问修饰符只能是public,可以省略public abstract,但是不写也默认为公共、抽象;而抽象类中可以包含普通方法;
2、接口中不能定义静态方法;而抽象类可以定义静态方法;
3、接口中只能定义静态常量属性,不能定义普通属性;而抽象类即可以定义普通属性,也可以定义静态常量属性;
4、接口不包含构造器;而抽象类中可以包含构造器。(抽象类中的构造器并不是用于创建对象,而是让子类调用这些构造器来完成属于抽象类的初始化工作。)
5、接口中不包含初始化块,不管是实力还是静态初始化块;而抽象类可以包含初始化块;
6、一个类最多有一个父类,包括抽象类;但是一个类可以直接实现多个接口,通过实现多个接口来弥补Java单继承的不足,更加丰富起来。