java接口的继承问题

我们都知道,接口是一种特殊的抽象类。在java语言中,类是单继承的,无法实现有多个父类的情况,但是接口很特殊,可以实现多继承,例如Interface2 extends Interface0, Interface1。
java中不允许类多重继承,这样就不会有如果A同时继承B和C,而B和C同时有一个D方法,那么我们无法确定A到底继承了哪一个方法。

但是难道接口就不会有这样的问题吗?

猜想是因为接口里面都是抽象方法,继承谁都没有很大区别,所以接口可以继承多个接口。

一个类只能extends一个父类,但可以implements多个接口。java通过使用接口的概念来实现多继承。与此同时,一个接口则可以同时extends多个接口,却不能implements任何接口。因而,Java中的接口是支持多继承的。

那会不会有调用冲突的情况呢?这里做了如下测试:

先创建了一个接口InterfaceA:

public interface InterfaceA {
    String pri_key = "guess what the private key is";

    int add(int x, int y);

    String encryt(byte[] result);

    int get();
}

再创建一个接口InterfaceB:

public interface InterfaceB {
    String pub_key = "guess what the public key is";

    int minus(int x, int y);

    byte[] decryt(String src);

    int get();
}

然后接口InterfaceC分别继承他们两个:

public interface InterfaceC extends InterfaceA,
        InterfaceB {
    int num = 1024;

    double divide(int x, int y);

    int get();
}

再创建一个类来实现InterfaceC:

public class InterfaceD implements InterfaceC {

    @Override
    public int add(int x, int y) {
        // TODO Auto-generated method stub
        return x + y;
    }

    @Override
    public String encryt(byte[] result) {
        // TODO Auto-generated method stub
        return Base64.encode(result);
    }

    @Override
    public int minus(int x, int y) {
        // TODO Auto-generated method stub
        return x - y;
    }

    @Override
    public byte[] decryt(String src) {
        // TODO Auto-generated method stub
        try {
            return Base64.decode(src);
        } catch (Base64DecodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public double divide(int x, int y) {
        // TODO Auto-generated method stub
        return x/y;
    }

    @Override
    public int get() {
        // TODO Auto-generated method stub
        return num;
    }
    
    public void print() {
        System.out.println("The public key is: "+pub_key+"\nThe private key is: "+pri_key);
    }

}

在这个类中,只有一个get方法实现了,同时也没有为有多个get要实现而冲突。同时,如果删除了接口InterfaceC.java中的get方法,也只有一个get方法得到了实现并且没有为多个get要实现而出现什么冲突。

所以,我们可以得到一个结论,当编译器在实现接口的时候会依然检查接口InterfaceC.java、InterfaceA.java和InterfaceB.java中的方法声明,如果后两者有与前者相冲突的方法声明,编译器将只要求类实现前者的声明,而后两者中相同的方法声明将自动被忽略。而当只有后两者中有相同的方法声明时,编译器将实现其中的一个即可。就好像是编译器中有一个专门存储方法声明的Set一样,在有继承关系的接口中,只保存一次相同的方法声明。

注意:

1)一个类如果实现了一个接口,则要实现该接口的所有方法。
2)方法的名字、返回类型、参数必须与接口中完全一致。如果方法的返回类型不是void,则方法体必须至少有一条return语句。

3)因为接口的方法默认是public类型的,所以在实现的时候一定要用public来修饰(否则默认为protected类型,缩小了方法的使用范围)。

参考了http://stackoverflow.com/questions/22498245/one-uncertainty-on-multiple-inheritance-in-universal-image-loader上的问答和https://blog.csdn.net/tiantiandjava/article/details/46514783

猜你喜欢

转载自blog.csdn.net/cotria/article/details/80772349
今日推荐