抽象类与接口
抽象类和接口似乎在功能上没什么区别,主要作用都是为了规范类的行为。然而,既然同时存在这两种概念,那必然有其不同之处。
抽象类
什么是抽象类?用abstract关键字修饰的类即为抽象类。其特点是不能创建类的对象,可以包含抽象方法和非抽象方法,抽象方法同样用abstract关键字修饰,且不可以有方法的实现。而衍生类中必须实现抽象方法。
上代码:
抽象类
public abstract class CoderClass { protected void normalMethod(){ System.out.println("我是抽象类的一般方法"); } //抽象方法不能具体实现 protected abstract void codeSkill(); }
衍生类
public class JavaClass extends CoderClass { //非抽象方法可重写可不重写 //抽象方法必须实现 protected void codeSkill() { System.out.println("我会用Java搬砖"); } } public class JavascriptClass extends CoderClass { //非抽象方法可重写可不重写 //抽象方法必须实现 protected void codeSkill() { System.out.println("我会用JavaScript搬砖"); } }
接口
什么是接口?接口可以看作是抽象类的延伸,接口完全禁止方法的实现,仅仅是声明方法。
上代码:
接口
public interface ISkill { public void english(); }
实现接口类
public class HrClass implements ISkill { public void english() { System.out.println("我是hr,我会英语"); } } public class CoderClass implements ISkill { public void english() { System.out.println("我是程序猿,我也会英语"); } }
二者的区别
抽象类与接口主要的区别在于使用的情景上,抽象类是同类型对象的行为抽象,接口是不同类型对象的相同行为抽象。并且对于抽象类是采取继承的方式来使用,为单继承,而对于接口来说则是可以同时接入多个接口的。
例如代码中的例子,对于程序员这一类人来说,都具备编码能力,但是程序员有因为有人是用Java,有人是用Javascript等等不同的语言编码。所以可以将程序员看作抽象类,而编码能力作为抽象方法。Java程序员,Javascript程序员为衍生类,而用Java或Javascript编码的能力作为抽象方法的实现。
再例如,对于程序员和Hr这两类人来说,双方的工作不同,但是都具备有英语能力,而双方的英语侧重点有有所不同。所以我们将英语能力抽象称为接口方法,不同类的人均可以具备此能力。
ps:以上为个人见解,如果对读者能有所帮助那真是荣幸之至。如有错误,疏漏之处欢迎批评指正,谢谢。
网友评论