抽象类和接口的区别
抽象类和接口
一、抽象类
1、什么是抽象类?
答:类和类之间具有共同特征,将这些共同特征提取出来,形成抽象类。
2、类可以实例化对象吗?
答:由于类本身不存在,因此抽象类无法创建对象。使用抽象类时,写代码可以使用多态(父类型引用指向子类型对象),这里即抽象类作为父类。
3、抽象类中可以包含什么?
① 一般方法、静态方法和抽象方法,且抽象方法必须在抽象类中
② 静态变量和成员变量
abstract class AbstractTest01{
int a; // 成员变量
static int b; // 静态变量
public abstract void doSome(); // 抽象方法(只有行为的概念,没有具体的行为实现)
public void doAnother(){ // 普通方法
......
}
public static void doOther(){ // 静态方法
......
}
}
4、final 和 abstract 不能联合使用,因为 final 修饰的类无法被继承。
5、一个非抽象的类继承抽象类,必须将抽象类中的抽象方法进行重写。
6、抽象类有构造方法,这个构造方法可以供子类使用。
Exp:子类继承抽象类,子类的无参构造第一行默认是 “super()”,默认调用抽象类的无参构造方法。
二、接口
1、什么是接口?
答:接口可看作特殊的抽象类(接口是完全抽象,抽象类是半抽象)。接口也是一种“引用数据类型”,编译后也是一个 .class 字节码文件。
2、接口可以实例化对象吗?
答:由于接口是抽象类的特例,因此接口中也无法实例化和创建对象。使用接口时,写代码可以使用多态(父类型引用指向子类型对象),这里即接口作为父类。
3、接口中可以包含什么?
答:只能包含抽象方法和常量。
接口中的方法默认是 public abstract 类型,可省略; 接口中的变量默认是 public static final 类型,可省略。
4、当一个非抽象类实现接口,必须将接口中所有的抽象方法全部重写。
5、接口支持多继承,一个接口可以继承多个接口,一个类可以同时实现多个接口。
三、抽象类和接口区别
1、抽象类中有构造方法,接口中无构造方法。
2、接口和接口之间支持多继承,类和类之间只能单继承。
3、一个类可以实现多个接口,但只能继承一个抽象类。
四、何时用抽象类?何时用接口?
* 抽象类一般是对“特征”的抽象。
* 接口一般是对“行为”的抽象。
抽象类表示它是什么,接口表示它能做什么。举一个例子,一个 Person,他有眼睛、肤色,这些描述一个人的特征可以定义在抽象类中,而一个人的行为如打篮球,所以这些可以定义在接口中。
有个俄罗斯人,他会打篮球,这个类可以这样写:
从编程角度看:
1、抽象类适合用来定义某个领域的固有属性,也就是本质,接口适合用来定义某个领域的扩展功能。
2、当需要为一些类提供公共的实现代码时,应优先考虑抽象类。因为抽象类中的非抽象方法可以被子类继承下来,使实现功能的代码更简单。
3、当注重代码的扩展性跟可维护性时,应当优先采用接口。①接口与实现它的类之间可以不存在任何层次关系,接口可以实现毫不相关类的相同行为,比抽象类的使用更加方便灵活;②接口只关心对象之间的交互的方法,而不关心对象所对应的具体类。接口是程序之间的一个协议,比抽象类的使用更安全、清晰。一般使用接口的情况更多。