总所周知,java中本质上是不支持多继承的,比如下面这样:
class A extends B,C
但其实不能这样写,因为java不支持多继承。
但是你可以像下面这样实现继承多个类
class B extends C
class A extends B
这样C就同时继承了B和A两个类,但是这样方式其实是有问题的,它虽然从某种程度上来说确实达到了多继承的目的,但class B
与class 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它不知道应该用哪个方法实现。
网友评论