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 方法的實現。這就是比接口實現更有戲的地方。

相關文章
相關標籤/搜索