接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。
人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.
所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。
抽象类
定义:包含一个抽象方法的类就是抽象类。
- l 抽象方法:只声明而未实现的方法称为抽象方法,抽象类和抽象方法必须使用abstract修饰。
- l 抽象类不能直接实例化。抽象类必须有子类,子类必须覆写抽象类的抽象方法,如果不覆写抽象方法,子类还是抽象类。
- l 抽象类可以有构造方法,但构造方法不能被声明为抽象。
- l 抽象类不能被实例化,即不能用new去产生对象,但可声明对象。所以抽象类的引用可以作为方法的参数。
接口
定义:接口是抽象方法和常量值(static final修饰)的定义的集合,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
- l Java接口不能有构造函数(构造器),不能被实例化。(区别:抽象类可以有构造方法)
- l Java接口中的成员常量默认是用public static final标识的(可省略),都是全局静态常量,必须被显示初始化。
1 public interface AA { 2 static final String AUTHOR = "weller"; 3 abstract void print(); 4 abstract String getInfo(); 5 }
- l Java接口中的方法默认都是public abstract类型的(可省略),没有方法体。
- l 接口中不能包含静态方法。
- l 当一个类实现某个接口时,它必须定义这个接口的所有抽象方法(包括这个接口的父接口中的方法),否则这个类必须声明为抽象的,即可以定义一个抽象类去实现一个接口中定义的部分方法。
- l 一个接口不能实现(implements)另一个接口,但可继承(extends)多个其它的接口。
- l 一个类在继承一个父类的同时,可实现一个或多个接口,但extends关键字必须位于implements关键字之前。例:public class A extends B implements C, D {...}
- l 接口和抽象类都不允许实例化对象,但都可以通过子类利用多态性向上转型完成实例化
抽象类和接口的区别(面试重点)