之前我写过Java的继承和多态的用处,这次讲讲继承和实现,接口和抽象类的区别,这其实是个很基础的Java知识,但是真的非常重要。特别是在阅读源码的时候,源码里面用了大量的继承和实现,接口以及抽象类,只有弄明白它们的用法,才能在阅读源码的时候体会到“妙啊”的感觉。
简单来说说吧。
1.接口 interface
接口中的字段
接口中的变量使用 public static final 修饰(可以省略),并且需要给出初始值。如果不初始化也会报错。比如:
哪怕你初始化一个null也不报错:
接口中的方法
接口interface里面的方法都是抽象方法,不能有方法体,比如:
只能写成:
并且方法隐式的使用 public abstract 修饰(可以省略,并且只能是 public ,如果是 private,procted,那么就编译报错)。
注意:接口里面abstract可以省略,如果是抽象类里面用抽象方法,abstract是不能省略的。意思是说抽象类里面想定义一个抽象方法(不写方法体)必须带abstract。
2.抽象类 abstract class
相比于接口,抽象类中还可以包含非抽象方法,和字段。抽象方法只能写在抽象类里面,不能写在普通类里面。
所以除接口外,如果你想写一个抽象方法,那就需要定义当前类是抽象类。
3.继承extends和实现implements
继承的好处是代码复用。继承的子类自动拥有父类中的所有属性和方法。所以继承已存在的类就是复用这些类的方法和域。在此基础上,子类还可以添加一些新的方法和域,以满足新的需求。
关于继承的用处,也参考我之前的文章:Java的继承和多态,真的明白它的实际用处吗?
这次我们讲讲继承和实现在语法上有什么区别:
1.extends前后保持一致(接口继承接口,类继承类,除了循环继承),否则报错。
注意:如果是类继承类,只能继承一个,此为单继承;如果是接口继承接口,可以继承多个。
2.implements只能是类实现接口。“类实现接口”,就是说implements前面只能是类,implements后面只能跟接口。
如果implements前面是接口,会报下面这个错:
如果implements后面是类(下面的例子OtherPerson是个类,不是接口),会报这个错: