1. 程式人生 > >java 介面可以多繼承,類為什麼不可以多繼承

java 介面可以多繼承,類為什麼不可以多繼承

開發十年,就只剩下這套架構體系了! >>>   

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