导语
昨天做了一套笔试题,发现自己对Java语法的掌握还是不够扎实,于是写下这篇文章,来厘清接口、抽象类、实体类之间的关联与差异。包括是否可以继承、多继承,是否可以实现、多实现等等。
基础概念
接口
接口Interface是一个抽象类型(不用显式声明abstract),是抽象方法的集合。
它不是类,也没有构造方法,更不能进行实例化。
但是它描述类要实现的方法(全都是抽象方法 )。
接口内包含抽象方法,都是public的,不用显式声明abstract。
但是不能包含成员变量,除非是static和final变量。
访问权限 interface 接口名 [extends 其他接口(s)]{
//static、final字段
//抽象方法
}
不同于类,接口是支持多继承的。即一个接口可以继承多个接口。
类可以实现接口(而不是继承),但是类要实现接口中所有的方法,除非是抽象类。
类在实现接口的方法时,不能抛出强制性异常,只能在接口、或者继承接口的抽象类中抛出强制性异常。
抽象类
抽象类abstract class不是用来描绘对象的,它表示的是一种继承关系。抽象类可以有构造函数,但不能用于实例化对象,只有被继承,才能使用。
抽象类可以没有抽象方法,但是有抽象方法的类一定是抽象类。
抽象方法要用abstract关键字显式声明。
访问权限 abstract class 类名 [implements 接口1[, 接口2, ...] ]{
//成员变量
//抽象方法和非抽象方法
public abstract 返回类型 方法名();
public 返回类型 方法名(){
//方法体
};
}
抽象类除了不能实例化对象,存在类的其他功能。
比如,抽象类可以继承抽象类,也可以继承实体类。
实体类
不被abstract关键字修饰的类是实体类,可以实例化对象。
实体类可以实现多个接口,但必须实现所有方法。
实体类可以继承一个抽象类,但必须实现抽象方法。
实体类可以继承实体类,但不支持多继承,只能多重继承。
对比分析
接口和抽象类
抽象类可以实现多个接口,不必实现接口内所有抽象方法。
接口不可以继承抽象类,接口只能继承接口,支持多继承。
接口和实体类
实体类可以实现多个接口,但必须实现接口内所有抽象方法。
实体类和抽象类
实体类可以继承抽象类,但必须实现抽象类中所有抽象方法。
抽象类也可以继承实体类。
示例
假如有以下接口:
public interface A (extends B(, C, D)){
public final int m=5;
public static String s="hello";
public void method1();
public int method2();
public String method3();
}
则抽象类实现接口:
public abstract class E implements A(, P, Q){
public abstract void method1();
public int method2(){
return 5;
};
}
而实体类继承抽象类:
public class F extends E{
public void method1(){
system.out.println("Hello!");
}
public String method3(){
return "hello";
}
}
Q&A
Q:抽象类可以实现接口吗?
A:可以。抽象类不必实现接口中的所有方法。
Q:抽象类可以继承实体类吗?
A:可以。抽象类可以继承实体类的所有非抽象方法,然后可以拥有自己的抽象方法。
Q:抽象类可以实例化对象吗?
A:不可以,必须被继承才能被使用
Q:Java中存在多继承吗?
A: 类之间不存在多继承,但是接口之间存在多继承。但是类支持多重继承。
Q:抽象类的方法全都是抽象方法吗?
A:抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。也就是说,只要一个类包含抽象方法,那它就是抽象类。
结束语
写这篇博客的过程中,颠覆了我以前很多错误认识。比如抽象类是可以继承实体类的,再比如抽象类也可以实现接口等等。这是由于对于概念的理解不深所导致的。而写这篇文章的过程,也是我厘清这些概念的过程。