首先,我们先了解一下Java中抽象类与继承。
abstract
可以定义抽象类,extends
可以定义继承。但是对于Java这个语言,它的继承相对与CPP它舍弃了多继承,防止关系太多耦合,易混淆。
多继承会造成
1、若子类继承的父类中拥有相同的成员变量,子类在引用该变量时将无法判别使用哪个父类的成员变量
2、若一个子类继承的多个父类拥有相同方法,同时子类并未覆盖该方法(若覆盖,则直接使用子类中该方法),那么调用该方法时将无法确定调用哪个父类的方法。
Java里面,是不可以多继承的!
Java实现“多继承”的三种方式
但是我们有时候也是需要多继承的。
于是我们可以使用某些方法替代多继承。
- 多层继承:实际就是多个单继承累积,最下面的子类可以具备前几个父类的特征,但这样的多继承会造成代码冗余,可读性较差,一般的开发同学都不会这样浪费时间。
- 内部类:通过成员内部类实现多继承。
- 接口:多继承机制实现优先使用接口,接口使用比较灵活,在企业级项目编程是最推荐的方式
一般都是接口来实现多继承。
接口
那说了这么多,啥是接口?
接口与抽象类有几个共同的,与继承也有类似之处。
接口与抽象类
- 都是上层的抽象层。
- 都不能被实例化。
- 都能包含抽象的方法,这些抽象方法用于描述类具备的功能,但是不提供具体的实现。
何为接口
接口在JAVA编程语言中是一个抽象类型,是抽象方法的集合。
我们先来看看网上的说法:
接口可以理解为一种特殊的类,里面全部是由*全局常量*和公共的抽象方法所组成。接口是解决*Java无法使用多继承*的一种手段,但是接口在实际中更多的作用是*制定标准*的。或者我们可以直接把接口理解为*100%的抽象类*,既接口中的方法*必须全部*是抽象方法。
官方的解释是这样的:
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)
接口的优势
- 接口被用来描述一种抽象。
- 因为Java不像C++一样支持多继承,所以Java可以通过实现接口来弥补这个局限。
- 接口也被用来实现解耦。
- 接口被用来实现抽象,而抽象类也被用来实现抽象,为什么一定要用接口呢?接口和抽象类之间又有什么区别呢?原因是抽象类内部可能包含非
final
的变量,但是在接口中存在的变量一定是final
,public
,static
的。
定义接口
声明一个接口,我们使用interface
这个关键字
定义了接口之后,我们需要注意:
JDK 1.8 以后,接口里可以有静态方法和方法体了。
JDK 1.8 以后,接口允许包含具体实现的方法,该方法称为"默认方法",默认方法使用 default 关键字修饰。
JDK 1.9 以后,允许将方法定义为
private
,使得某些复用的代码不会把方法暴露出去。
这样我们就可以定义一个方法,在IDEA中我们可以直接创建!
在接口中,我们用implements
关键词来对接接口。假设我们定义一个接口类叫Text,普通类叫Demo。
定义接口
public interface Text { //下面定义了两个方法 //没有方法体哦!!! String getName(); void show(); }
接入接口
public class Demo implements Text { }
使用接口中的方法
public class Demo implements Text { //在子类Demo中重写Text就可以 @Override public String getName() { return "我被重写了"; } @Override public void show() { System.out.println("Hello Word"); } }
调用输出
public class ShowDemo { public static void main(String[] args) { Text text = new Demo(); test.getName(); text.show(); } }
这样我们就调用了这个接口的方法。
注意:必须要重写接口里面的方法哦!