前言:Java程序设计语言中,接口用来对类进行需求描述。它描述了一个类具有的功能。
1、概念:Java中,接口不是类,而是对类的一组需求描述,描述了类具有的功能。接口描述了类所具有的功能,一般不对功能做具体的实现(可以为接口中的方法提供一个默认的实现,使用default修饰符标记方法,Java SE 8允许接口增加静态方法),功能的具体实现由实现接口的类依据各自的需求自行实现。
2、定义和实现接口:
(1)定义:Java中使用interface修饰符标记来定义接口。
(2)实现:一个类可以通过关键字implement实现一个或多个接口。实现了接口的类,必须实现接口中所定义的所有未实现的方法,或者必须将类设计为abstract的。
public interface TestInterfaceA {
void funTestA();
static void funTestB() { //静态方法
System.out.print("Interface Static fun");
}
default void funTestC() { //默认方法
System.out.print("Interface Default fun");
}
}
如上,定义了一个接口TestInterfaceA,在这个接口中,定义了一个未实现的方法funTestA,所有实现了这个接口的非抽象类都须实现funTestA方法;funTestB方法是一个静态方法,这是Java SE 8中新增加的特性;funTestC方法用default标记,说明这是一个默认方法,提供了默认实现。
3、默认方法冲突:
(1)超类优先:如果一个类的超类和它所实现的接口同时定义了一个同样的方法(同名且同参数,且该方法在接口中被定义为默认方法),那么将以超类的方法为准,接口中定义的默认方法会被忽略。
public class STestA {
public void testDefaultFun(){
System.out.print("STestA");
}
}
public interface ITestA {
default void testDefaultFun(){
System.out.print("ITestA");
}
}
public class TestImpl extends STestA implements ITestA {
}
如上,在类STestA和接口ITestA中同时定义一个相同的testDefaultFun方法,类TestImpl继承类STestA并且实现了接口ITestA,此时编译器显示没有问题。当在其他程序中通过TestImpl的一个实例对象调用方法testDefaultFun时,将输出“STestA”。
(2)接口冲突:如果一个类实现了多个接口(未继承其他超类),在每个接口中都提供了一个同样的默认方法,则类必须覆盖这个方法来解决冲突。
public interface ITestA {
default void testDefaultFun(){
System.out.print("ITestA");
}
}
public interface ITestB {
default void testDefaultFun(){
System.out.print("ITestB");
}
}
public class TestImpl implements ITestA ,ITestB{
@Override
public void testDefaultFun() {
ITestA.super.testDefaultFun();
}
}
如上,两个接口ITestA和ITestB同时定义了相同的方法testDefaultFun,类TestImpl实现了接口ITestA和ITestB,此时,如果没有在TestImpl类中覆盖方法testDefaultFun,编译器将会报错,当覆盖了这个方法后,编译器报错消失。
更新时间:2024-08-24
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号