在Java中,子類別只能繼承一個父類別,繼承除了可避免類別間重複的實作定義外,還有個重要的關係,那就是子類別與父類別間會有is a的關係,中文稱為「是一種」的關係,SwordsMan繼承了Role,SwordsMan是一種Role,Magician繼承了Role,Magician 是一種 Role。
為何要知道繼承時,父類別與子類別間會有「是一種」的關係?因為要開始理解多型(Polymorphism),必須先知道你操作的物件是哪一種東西。
編譯器就是語法檢查器,要知道以上程式片段為何可以通過編譯,為何無法通過編譯,就是將自己當作編譯器,檢查語法的邏輯是否正確,方式是從 = 號右邊往左讀:右邊是不是一種左邊呢(右邊型態是不是左邊型態的子類別)。
SwordsMan swordsMan = new Role(); // Role 是不是一種 SwordsMan?
Magician magician = new Role(); // Role 是不是一種 Magician?
編譯器認為第一行,Role不一定是一種SwrodsMan,編譯失敗,對於第二行,編譯器認為Role不一定是一種Magician,編譯失敗。
Role role1 = new SwordsMan();
SwordsMan swordsMan = role1;
這個程式片段最後會編譯失敗,先從第一行看,SwordsMan是一種Role,這行可以通過編譯。編譯器檢查這類語法,一次只看一行,就第二行而言,編譯器看到role1為Role宣告的名稱,於是檢查Role是不是一種SwordsMan,答案是不一定,所以編譯失敗在第二行!