文章目录
接口的组成为什么接口中药增加默认方法和静态方法默认方法:被public default修饰的默认方法静态方法:被public static修饰的静态方法接口易错问题接口和抽象类的区别
接口的组成
在JDK1.8之前,接口中只有两部分内容: (1)常量:固定修饰符public static final (2)抽象方法:固定修饰符public abstract 在JDK1.8之后,接口新增非抽象方法:default方法和static方法
为什么接口中药增加默认方法和静态方法
如果接口中只能定义抽象方法,当修改接口时,该接口的所有实现类都会受到影响,为了减小这种影响,所以才采用了这种方式
默认方法:被public default修饰的默认方法
接口中public修饰符可以省略,default修饰符必须写接口的实现类中可以重写default方法,重写时default修饰符必须不能加接口的默认方法只能通过接口实现类或实现类的实例对象进行调用,调用方式见下面的代码:
@FunctionalInterface
public interface MyInterface {
void go();
default void defaultTest() {
System
.out
.println("default方法");
}
}
class MyInterfaceImpl implements MyInterface {
@Override
public void go() {
System
.out
.println("抽象方法实现");
}
@Override
public void defaultTest() {
System
.out
.println("覆写接口默认方法");
MyInterface
.super.defaultTest();
}
}
public abstract class MainDemo{
public static void main(String
[] args
) {
MyInterface myInterface
=()-> System
.out
.println("122");
myInterface
.defaultTest();
}
}
静态方法:被public static修饰的静态方法
public interface MyInterface {
static void staticTest() {
System
.out
.println("我是接口的静态方法");
}
}
class MyInterfaceImpl implements MyInterface {
static void staticTest() {
System
.out
.println("我和接口的静态方法是两个不同的方法,接口静态方法不能被继承");
}
}
class Demo {
public static void main(String
[] args
) {
MyInterface
.staticTest();
}
}
接口中public修饰符可以省略,static修饰符必须写接口的静态方法不能被接口实现类继承,只能通过如下方式调用:接口名.静态方法接口的实现类中可以写一个与静态方法相同的静态方法,互不影响
注意: (1)方法的重写是对实例方法来说的,静态方法不存在重写的概念,因为静态方法是属于类级别的方法,所有实例对象都拥有该方法。 (2)类的静态方法可以被继承,但接口的静态方法不能被继承,只能通过接口名.静态方名 进行调用
接口易错问题
当继承的父类和接口有相同签名的方法时,优先使用父类的方法,接口实现类中因为继承了父类的方法,甚至都可以不写重写该接口的方法
public interface MyInterface {
void go();
}
class MyInterfaceImpl extends Father implements MyInterface {
}
class Father {
public void go() {
System
.out
.println("我是父类");
}
}
当接口的父接口中也有同样的默认方法时,就近原则调用子接口的方法当多个接口中有相同的方法签名,且被同一个类实现时,必须在实现类中通过重写方法解决冲突问题,重复方法中可以通过 接口名.super.方法名()的方式调用接口中的各默认方法
接口和抽象类的区别
接口使用interface修饰,抽象类使用abstract修饰接口可以继承多个接口,抽象类是单继承
public interface MyInterface extends Runnable, RandomAccess
{
}
一个类可以实现多个接口,但只能继承一个抽象类JDK1.8之前,接口中必须只能有抽象方法,不能有方法体 JDK1.8开始,接口中也可以有静态方法和默认方法,但接口的静态方法不能被继承,而抽象类的静态方法可以被继承