java 是不允许使用 extends 去继承多个类的。
- java 如果出现多继承、父类中都有相同的属性和,子类如果使用父类的属性,无法确定是哪一个父类的属性
- 父类中如果有相同的方法,并且子类并没有覆盖该方法。子类调用父类的时候 无法判断是那个父类的方法
public Class A 有 public int i=0, some() {i=1;}
public Class B 有 public int i=0, some() {i=2;}
public Class C 有 public int i=0, extends A,B
现在C实例化c,执行c.some(), i=?
不允许继承多类,就是为了避免继承多父类,在调用相同方法或者构造函数时赋值同一个成员变量时出现此类问题
接口是可以多继承的。接口(jdk 1.7 以下版本)里面的方法并有实现,即使接口之间具有相同的方法仍然是可以的,几个接口可以有相同的实现类和实现方法。而且接口的成员变量都是 static final的,有自己静态域,只能自己使用。
另外,接口的实现类可以有多个 。(java bean 注解注入) 一个接口(用多个实现类)被注入进来。调用方法的时候,会先依据bean 查找那个一样的bean ,调用该实现类的方法。其次,如过实现类上都没有注解的 bean ,会按照加载的先后顺序去调用的。
例子
public interface TestService {
public void a();
}
实现
@Slf4j
@Service("testService")
public class TestInterfase implements TestService {
@Override
public void a() {
log.info("test test interface");
}
}
@Slf4j
public class HealthBillCashServiceImpl implements TestService {
@Override
public void a() {
log.info("test cash healthbillCash");
}
}
测试
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@Slf4j
public class TestHealthPolicyService {
private TestService testService;// 查找bean 的唯一性
@Test
public void testASD() {
HealthPolicyDO optionDO = new HealthPolicyDO();
testService.a();
}
}
结果
test test interface
如果没有 @Service("testService") 的注解
会输出
test cash healthbillCash
如果想多继承,怎么实现呢?
- class A extends B,class C extends A,这样C就同时继承了B和A两个类了。
- 引入内部类
使用接口有时候有很多不方便的地方。比如我们实现一个接口就必须实现它里面的所有方法。而有了内部类就不一样了。它可以使我们的类继承多个具体类或抽象类。如下面这个例子:
//类一
public class ClassA {
public String name(){
return "liutao";
}
public String doSomeThing(){
// doSomeThing
}
}
//类二
public class ClassB {
public int age(){
return 25;
}
}
//类三
public class MainExample{
private class Test1 extends ClassA{
public String name(){
return super.name();
}
}
private class Test2 extends ClassB{
public int age(){
return super.age();
}
}
public String name(){
return new Test1().name();
}
public int age(){
return new Test2().age();
}
public static void main(String args[]){
MainExample mi=new MainExample();
System.out.println("姓名:"+mi.name());
System.out.println("年龄:"+mi.age());
}
}
复制代码
上边这个例子可以看出来,MainExample 类通过内部类拥有了 ClassA 和 ClassB 的两个类的继承关系。 而无需关注 ClassA 中的 doSomeThing 方法的实现。这就是比接口实现更有戏的地方。