java中類的多型
阿新 • • 發佈:2018-12-22
多型:將父類引用指向子類物件
是通過子類重寫父類的方法實現
通過多型,可以將子類物件定義為父類型別,如果子類沒有進行方法重寫,則預設呼叫父類方法。
否則呼叫子類重寫父類方法。
也就是說,如果在子類中沒有重寫父類的方法,則不能使用子類的方法。
package myMoreState; public class MoreState { public static void main(String[] args) { // TODO Auto-generated method stub Animal ani1=new Dog(); ani1.eat(); System.out.println("11111"); } } class Animal{ String name; int age; public void eat() { System.out.println("這是Animal的吃的方法"); } } class Dog extends Animal{ String color; // @Override //重寫 // public void eat() { // System.out.println("這個是Dog的吃的方法"); // } }
輸出結果為:
這是Animal的吃的方法
11111
如果將父類中的eat()方法改為靜態的,則子類eat()方法不能被重寫。所以也不能進行多型。
多型後的物件不能直接呼叫子類自己的靜態方法,可以呼叫父類中的靜態方法,但是會被提示警告。
static方法不能被重寫,所以無法進行多型。
如果想要判斷多型後的物件到底是哪個類的例項:使用instanceof關鍵字
使用如下:
package myMoreState; public class MoreState { public static void main(String[] args) { // TODO Auto-generated method stub // Animal ani1=new Dog(); // ani1.eat(); // System.out.println(""); Animal ani =new Dog(); MoreState more=new MoreState(); more.isDog(ani); } public void isDog(Animal ani) { if(ani instanceof Dog) { Dog dog=(Dog)ani; dog.eat(); System.out.println("這是一個轉換的方法"); } } } class Animal{ String name; int age; public void eat() { System.out.println("這是Animal的吃的方法"); } } class Dog extends Animal{ String color; @Override //重寫 public void eat() { System.out.println("這個是Dog的吃的方法"); } }
執行結果為:
這個是Dog的吃的方法
這是一個轉換的方法
使用instanceof可以減少程式碼量,但是並不完整。
下面有另一種判斷的方法
package myMoreState; public class MoreState { public static void main(String[] args) { // TODO Auto-generated method stub // Animal ani1=new Dog(); // ani1.eat(); // System.out.println(""); Animal ani =new Dog(); Animal ani1=new Cat(); ani.name="嘯天"; ani1.name="小花"; MoreState more=new MoreState(); more.isDog(ani); isDog1(ani); isDog1(ani1); } public void isDog(Animal ani) { if(ani instanceof Dog) { Dog dog=(Dog)ani; dog.eat(); System.out.println("這是一個轉換的方法"); } } public static void isDog1(Animal ani) { if(ani.getClass().getName().equals(Dog.class.getName())) { //此處的強制轉換為向下轉換 Dog dog=(Dog)ani; System.out.println(dog.name+"is Dog"); }else { System.out.println(ani.name+"is not Dog"); } } } class Animal{ String name; int age; public void eat() { System.out.println("這是Animal的吃的方法"); } } class Dog extends Animal{ String color; @Override public void eat() { System.out.println("這個是Dog的吃的方法"); } } class Cat extends Animal{ String color; public void eat() { System.out.println("小貓吃魚"); } }
執行結果為: