java 接口能够多继承,类为何不能够多继承

java 是不容许使用 extends 去继承多个类的。java

  • 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=?
不容许继承多类,就是为了不继承多父类,在调用相同方法或者构造函数时赋值同一个成员变量时出现此类问题ide

 

接口是能够多继承的。接口(jdk 1.7 如下版本)里面的方法并有实现,即便接口之间具备相同的方法仍然是能够的,几个接口能够有相同的实现类和实现方法。并且接口的成员变量都是 static final的,有本身静态域,只能本身使用。函数

 另外,接口的实现类能够有多个 。(java bean 注解注入) 一个接口(用多个实现类)被注入进来。调用方法的时候,会先依据bean 查找那个同样的bean ,调用该实现类的方法。其次,如过实现类上都没有注解的 bean ,会按照加载的前后顺序去调用的。 测试

例子  code

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();
    }
}

结果 io

test test interface

若是没有 @Service("testService") 的注解class

会输出 test

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 方法的实现。这就是比接口实现更有戏的地方。

相关文章
相关标签/搜索