赞
踩
存在这样一种情况,有一个类实现了两个接口,在这两个接口当中有相同的方法(同名同参),那么类中的该实现方法属于哪个接口的呢?
- public interface InterfaceA {
- void method();
- void methodA();
- }
-
- public interface InterfaceB {
- void method();
- void methodB();
- }
-
- public class Subject implements InterfaceA, InterfaceB {
-
- @Override
- public void method() {
-
- }
-
- @Override
- public void methodB() {
-
- }
-
- @Override
- public void methodA() {
-
- }
- }
Subject类实现了InterfaceA和InterfaceB两个接口的方法,其中method是InterfaceA和InterfaceB共用的相同方法,那么Subject类中实现的该方法是属于哪个接口的呢?
答案是既是InterfaceA的也是InterfaceB的,什么意思?就是说此时的Subject类你既可以把它当做InterfaceA来使用其中的method方法,也可以把它当做InterfaceB来使用其中的method方法。
Java对于implements的要求是只要在接口中声明的方法,在实现类中必须要实现它,单看Subject 类,它里面具有method和methodA两个方法,因此它就是实现了InterfaceA接口所有方法的实现类,同时它里面具有method和methodB两个方法,因此它也是实现了InterfaceB接口所有方法的实现类。
因此,在使用Subject 类的时候,如果你认为它是InterfaceA,那它就是InterfaceA,如果你为它是InterfaceB,那它就是InterfaceB。
所以可以像下面这样去使用它,完全没有问题:
- public class Main {
-
- public static void main(String[] args) {
- //我现在认为它是一个InterfaceA实现类, 就把它当做一个InterfaceA接口来使用
- InterfaceA interfaceA = new Subject();
- interfaceA.method();
- interfaceA.methodA();
-
- test(interfaceA);
-
- //我现在认为它是一个InterfaceB实现类, 就把它当做一个InterfaceB接口来使用
- InterfaceB interfaceB = new Subject();
- interfaceB.method();
- interfaceB.methodB();
-
- //下面都是完全没问题的
- Subject subject = new Subject();
- subject.myMethod();
- //当成InterfaceA用
- interfaceA = subject;
- interfaceA.method();
- interfaceA.methodA();
- //当成InterfaceA用的过程中又可以当成InterfaceB用
- interfaceB = subject;
- interfaceB.method();
- interfaceB.methodB();
- //当成InterfaceB用的过程中又可以再当成InterfaceA用
- interfaceA = (InterfaceA) interfaceB;
- interfaceA.method();
- interfaceA.methodA();
- //...随便用...
- }
-
- private static void test(InterfaceA interfaceA){
- //如果我知道InterfaceA的实现类同时也implements了InterfaceB
- // 那么我就可以把它当做InterfaceB的实现类来使用
- InterfaceB interfaceB = (InterfaceB) interfaceA;
- interfaceB.method();
- interfaceB.methodB();
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。