MST

星途 面试题库

面试题:Java接口多重继承下的方法冲突处理

假设存在接口A、接口B,都定义了同名且参数列表相同的方法void method()。现在有一个类C同时实现接口A和接口B,请问如何处理这种方法冲突?请给出至少两种解决方式并详细说明。
15.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

方式一:在类C中直接实现该方法

在类C中直接编写method方法的具体实现。此时,类C对接口A和接口B中method方法的实现进行了统一,两个接口共用这一个实现。例如:

class C implements A, B {
    @Override
    public void method() {
        // 具体的业务逻辑代码
        System.out.println("This is the implementation of method in class C.");
    }
}

方式二:使用默认方法(Java 8及以上)

如果接口A和接口B是在Java 8及以上版本环境下定义,可以通过在接口中使用默认方法来解决部分冲突情况。可以在其中一个接口中定义默认实现,另一个接口保持抽象,类C继承默认实现的同时可按需重写。例如:

interface A {
    default void method() {
        System.out.println("Default implementation in interface A.");
    }
}

interface B {
    void method();
}

class C implements A, B {
    // 这里可以不重写,使用接口A的默认实现
    // 如果有特殊需求,也可以重写
    @Override
    public void method() {
        A.super.method(); // 调用接口A的默认实现
        // 也可以添加自己的业务逻辑
    }
}

方式三:通过内部类委托方式

类C不直接实现method方法,而是在类C内部创建两个内部类,分别实现接口A和接口B的method方法,然后在类C的method方法中根据具体逻辑选择调用内部类的方法。例如:

class C implements A, B {
    private class AImpl implements A {
        @Override
        public void method() {
            // 接口A的method方法实现
            System.out.println("Implementation of method in AImpl.");
        }
    }

    private class BImpl implements B {
        @Override
        public void method() {
            // 接口B的method方法实现
            System.out.println("Implementation of method in BImpl.");
        }
    }

    @Override
    public void method() {
        // 根据业务逻辑选择调用AImpl或BImpl的method方法
        boolean condition = true; 
        if (condition) {
            new AImpl().method();
        } else {
            new BImpl().method();
        }
    }
}