本文已收录《Java常见面试题》:https://gitee.com/mydb/interviewJava是一门面向对象的编程语言,具有抽象、封装、继承、多态四个特性。本文介绍的接口和抽象类是面向对象编程中“抽象”的具体实现,也就是说,接口和抽象类都是用来定义实体类的公共行为的,是更高层次的实体类(对象)的实现。抽象。注:本文以下内容基于JDK8版本。接口接口是Java语言中的一种抽象类型,它定义了对象的公共行为。它的创建关键字是interface。方法和常量可以在接口的实现中定义。它的普通方法无法通过具体代码实现。JDK8之后,接口中可以创建static和default方法,这两个方法可以有一个默认方法实现,如下代码所示:publicinterfaceInterface_1{intcount=1;voidsayHi();//默认方法defaultvoidprint(){System.out.println("Doprintmethod.");}//静态方法staticvoidsmethod(){System.out.println("执行静态方法。");}}接下来,创建一个类来实现上面的接口:}publicstaticvoidmain(String[]args){InterfaceImpl_1inter=newInterfaceImpl_1();inter.sayHi();//调用接口中的静态方法InterfaceExample.smethod();//调用接口中的常量countSystem.out.println(InterfaceExample.count);}}上面程序的执行结果如下:通过上面的代码和执行结果,我们可以得出如下结论:JDK8中的接口可以定义静态方法和默认方法,这两个方法可以包含具体的代码实现。要实现接口,请使用implements关键字。接口不能直接实例化。接口中定义的变量默认为publicstaticfinal类型。子类不需要重写接口中的静态方法和默认方法。如果不重写,默认调用接口的方法实现。抽象类抽象类类似于接口。它还用于定义对象的公共行为,不能直接实例化。抽象类的实现关键字是abstractclass,子类通过extends关键字继承父类。抽象类的使用如下:publicabstractclassAbstractExample{//定义普通变量intcount=2;//定义私有变量privatestaticinttotal=10;//定义抽象方法publicabstractvoidmethodA();//定义普通方法publicvoidmethodB(){System.out.println("Hi,methodB.");}}接下来用一个普通的类继承上面的抽象类:publicclassAbstractSonextendsAbstractExample{@OverridepublicvoidmethodA(){System.out.println("嗨,方法A。");}publicstaticvoidmain(String[]args){AbstractSonabs=newAbstractSon();//抽象类中的变量重新赋值abs.count=666;系统。out.println(abs.count);//抽象类中的抽象方法abs.methodA();//抽象类中的普通方法abs.methodB();}}上面程序的执行结果如下:通过上面的代码和执行结果可以得出以下结论:抽象类是使用abstract关键字声明的。抽象类可以包含普通方法和抽象方法,抽象方法不能有具体的代码实现。抽象类需要使用extends关键字来实现继承。抽象类不能直接实例化。抽象类中的属性控制器没有限制,可以定义私有类型的属性。接口和抽象类的区别主要体现在以下七个方面。区别一:不同的接口是使用关键字interface来定义关键字。抽象类是使用关键字abstract定义的。区别二:继承或实现的关键字不同。接口使用implements关键字来定义它们的特定实现。抽象类使用extends关键字实现继承。区别三:子类扩展的数量不同。接口的实现类可以有多个,如下图:而一个抽象类的子类只能继承一个抽象类,如下图,继承多个抽象类会报错:在在Java语言中,一个类只能继承一个父类(单继承),但可以实现多个接口。区别四:属性访问控制字符不同接口中属性的访问控制字符只能是public,如下图:接口中的属性默认被publicstaticfinal修饰。抽象类中的属性访问控制符不受限制,可以是任意控制符,如下图:区别5:方法控制符不同接口中的方法默认控制符是public的,不能定义为其他控制符,如下图注意:抽象类中方法控制字符没有限制,抽象方法不能用private修饰,如下代码:区别六:方法实现不同接口中的公用方法不能有特定的方法实现。JDK8之后,static和default方法必须有方法实现,如下代码所示:从上面的结果可以看出,如果static或者default方法没有方法实现,就会报错,如果公共方法有方法实现,会报错。抽象类中的普通方法可以通过方法实现,但是抽象方法不能通过方法实现,如下代码所示:从上面的结果可以看出,如果抽象类中的普通方法没有方法实现,会报错,如果抽象方法有methodsImplementation会报错。区别七:静态代码块不能用在不同的接口中,如下代码:静态代码块可以用在抽象类中,如下代码:summaryinterface和abstractclass用于定义的公共行为objects,但两者有以下七点不同:定义的关键字不同。子类以不同方式继承或实现关键字。类型扩展不同:抽象类是单继承,而接口是多继承。方法访问控制器:对抽象类没有限制,但是抽象类中的抽象方法不能被private修饰;而接口是有限制的,默认接口是publiccontroller。属性方法控制器:抽象类没有限制,但是接口有限制。默认接口是公共控制器。方法实现不同:抽象类中的普通方法必须有实现,抽象方法不能有实现;接口中的普通方法不能有实现,但JDK8中的静态和默认方法必须有实现。静态代码块的使用方式不同:抽象类可以有静态代码块,而接口不能。你也知道接口和抽象类的区别吗?欢迎在评论区留言补充。判断是非在己,名誉在人,得失在数。公众号:Java面试真题解析
