接口中的默认方法
在JDK 8之前,一个接口不能包含任何实现。接口只包含常量和方法签名。
从JDK 8开始,可以定义接口中方法的默认实现。这些方法称为默认方法。
使用关键字"default"声明一个默认方法,它包含一个方法体。
所有实现类接口的默认方法都可用。如果实现类想要使用它,它可以使用它,或者它可以忽略默认实现并创建自己的实现。
即使接口现在可以定义默认方法,如果要创建实例,接口仍然必须由类实现。
请注意,实现类只需要实现抽象方法。默认方法可以按原样使用,除非实现类要更改行为。
接口的中的默认方法:
public interface MyIntertrce
{
default void show()
{
System.out.println("接口");
}
}
一个类中实现了与接口中完全相同的默认方法:
public class MyClass
{
public void show()
{
System.out.println("类");
}
}
mytest继承了接口和类:
public class mytest extends MyClass implements MyIntertrce{
}
测试:
public class TestMain
{
@Test
void test()
{
mytest m=new mytest();
m.show();
}
}
类优先原则
接口中的静态方法
public interface MyIntertrce
{
static void dhy()
{
System.out.println("静态方法调用");
}
}
测试:
public class TestMain
{
@Test
void test()
{
MyIntertrce.dhy();
}
}
因为一个类是可以实现多个接口的,如果接口中的静态方法的方法前面相同,就会发生继承冲突。所以索性就从继承这个层面阻断冲突的发生。反过来看由于接口中的字段是可以被继承的,所以实际上接口中的字段是存在继承冲突的。
interface TestInterface1 {
String hello="TestInterface1";
}
interface TestInterface1 {
String hello="TestInterface2";
}
public class Test implements TestInterface1,TestInterface2{
public static void main(String[] args) {
System.out.println(Test.hello);//这里会报错
}
}
Java8中接口中静态字段可以被继承(默认用public static final修饰),静态方法不会继承,只能通过接口名调用。
interface TestInterface1 {
static void sayHello(){
System.out.println("TestInterface1 Hello");
}
}
public class Test implements TestInterface1{
public static void main(String[] args) {
TestInterface1.sayHello();
Test.sayHello();//编译报错
}
Java8新特性——接口静态方法