java可以实现“多继承”了

2021-04-12  本文已影响0人  雨中星辰0

总所周知,java中本质上是不支持多继承的,比如下面这样:

class A extends B,C

但其实不能这样写,因为java不支持多继承。
但是你可以像下面这样实现继承多个类

class B extends C
class A extends B

这样C就同时继承了B和A两个类,但是这样方式其实是有问题的,它虽然从某种程度上来说确实达到了多继承的目的,但class Bclass C,本质上是没有继承关系的,我们为了实现多继承的目的,就强迫B继承C,这是不合理的。那还有没有别的办法可以解决呢?有!java中虽然类不可以多继承,但是接口可以,将上面的demo改一下变成了这样。

interface BIntf
interface CIntf 
interface AIntf extends BIntf,CIntf

class A implements AIntf
class B implements BIntf
class C implements CIntf

通过这样的方式,class A也达到了“多继承”的目的。

但这样,仍然是比较麻烦的,还有没有更好的办法呢?有,也没有,在java8以后,接口是可以由默认方法的,那如果我们的接口中的所有方法都有默认实现,那除了不能实例化,从某些角度来说,它是不是就可以看成class了,那java 类实现多个接口,是不是就相当于多继承了呢?
例:

/**
 * @author star
 * @descripton 测试接口
 * @date 2021/4/12
 **/
public interface TestIntf {
    default public void printf(String word) {
        System.out.println("TestIntf:" + word);
    }
}


/**
 * @author star
 * @descripton 多继承测试类
 * @date 2021/4/12
 **/
public class MutiExtendTest implements TestIntf,TestIntf2{
    public static void main(String[] args) {
        MutiExtendTest mutiExtendTest = new MutiExtendTest();
        mutiExtendTest.printf("star");
        mutiExtendTest.print2("star");

    }
}


/**
 * @author star
 * @descripton 测试接口
 * @date 2021/4/12
 **/
public interface TestIntf2 {
    default public void print2(String word) {
        System.err.println("TestIntf:" + word);
    }
}

但通过这种取巧的方式有一个问题,类实现的多个接口中不能有一样的方法,否则就会报错,java它不知道应该用哪个方法实现。

上一篇 下一篇

猜你喜欢

热点阅读