接口的注意事项

接口中的常量和静态方法可以直接在测试类中通过接口名调用!

接口中只有静态方法不能被实现类继承

接口的定义格式:

public interface 接口名称 {
    // 常量
    // 抽象方法
    // 默认方法
    // 静态方法
}

实现接口:

public interface IA{
    public void show1();
}
public interface IB{
    public void show2();
}
public class Zi implements IA ,IB{
    public void show1(){
    }
    public void show2(){
    }
}
public class Fu{}//有继承的情况
public interface IA{}
public interface IB{}
public class Zi extends Fu implements IA,IB{//一定要先继承,后实现
}

接口中成员的访问特点:

1、接口中的常量:        主要是供接口直接使用

通过接口名直接调用即可
System.out.println(IA.NUM);// 10

2、接口中的抽象方法: 供实现类重写的

供实现类重写的
@Override
    public void method1() {
        System.out.println("重写接口中的method1抽象方法");
    }

3、接口中的默认方法: 供实现类继承的(实现类中可以直接调用,实现类对象也可以直接调用)

(供实现类继承使用)实现类可以直接调用  或者  实现类对象直接调用
public default void method2(){
        System.out.println("默认方法method2");
        method4();
        method5();
    }
非静态的默认方法可以被实现类继承

4、接口中的静态方法: 只供接口直接调用,实现类继承不了

接口中的静态方法只供接口直接调用,不能被继承
// 接口中的静态方法: 只供接口直接调用,实现类继承不了
    public static void method3(){
        System.out.println("静态方法method3");
        method5();
    }
private static void method5(){//
        // 方法体
    }

接口中的私有方法: 只能在接口中直接调用,实现类继承不了

 

多实现时的冲突情况:

1、公有静态常量的冲突:

当一个实现类继承了两个接口,这两个接口中有相同的公有静态常量时测试调用会显示编译错误

interface IA{
    public static final int a = 10;
    public static final int b= 20;
}
interface IB{
    public static final int a = 30;
}
class Zi implements IA,IB{
    //只继承了b,没有继承a,因为a冲突了
}

public class Demo {
    public static void main(String[] args) {
        Zi z = new Zi();
     //   System.out.println(z.a);//编译错误
        System.out.println(z.b);
    }
}

2、公有抽象类的冲突情况:

当一个实现类同时实现两个接口,这两个接口中有同名的公有抽象方法,那么会要求实现类重写一个抽象方法即可。

interface IA{
    public void show();
}
interface IB{
    public void show();
}
class Zi implements IA,IB{
    @Override
    public void show() {//子类只需要重写一个show()即可
        System.out.println("子类的show()...");
    }
}
public class Demo {
    public static void main(String[] args) {
        Zi z = new Zi();
        z.show();
    }
}

3、公有默认方法的冲突:

当一个实现类同时实现两个接口,这两个接口中有同名的公有默认方法,那么实现类必须重写一次该名的默认方法作为最终版本。

interface IA{
    public default void show(){
        System.out.println("IA");
    }
}
interface IB{
    public default void show(){
        System.out.println("IB");
    }
}
class Zi implements IA,IB{
    @Override
    public void show() {//必须重写一次的show()
        System.out.println("Zi的show()....");
    }
}
public class Demo {
    public static void main(String[] args) {
        Zi z = new Zi();
        z.show();
    }
}

4、静态方法时直接属于接口的,不能被继承到实现类,所以不存在冲突的情况

5、私有方法只能在自己本身所在的接口中使用,不存在冲突。

 

实现类继承父类又实现接口时的冲突

1、父类和接口的公有静态常量的冲突:

因为实现类会继承接口的静态常量也会继承父类的静态常量,当两个常量同名时,测试类就会报错。

class Fu{
public static final int a = 10;
}
interface IA{
public static final int a = 20;
}
class Zi extends Fu implements IA{//没有继承a变量
}
public class Demo {
public static void main(String[] args) {
System.out.println(Zi.a);//编译错误
}
}

2、父类和接口的抽象方法冲突:重写即可

3、父类和接口的公有默认方法的冲突:优先继承关系

4、父类和接口的公有静态方法:接口的静态方法不能被继承,所以测试类输出的是父类的静态方法

 

posted @ 2020-09-08 20:29  化蛹  阅读(250)  评论(0编辑  收藏  举报