標籤:
物件導向的第三個特徵,多態:
可以理解為事物存在的多種狀態。 1,多態的體現:父類的引用指向了自己的子類,父類的引用可以接收子類對象。Animal c1 = new Cat(); c1.eat(); function(new Dog()); function(new Pig()); public static void function (Animal c) { c.eat(); } 2,多態的前提 必須是類與類之間有關係,要麼是繼承,要麼是實現。 通常還有前提,存在覆蓋。3,多態的應用 4,多態的好處 大大的提高了程式的擴充性 5,弊端 提高了擴充性,但是只能使用父類的引用訪問父類中的成員。 例子程式: class Zx{ public static void main(String []arr) { Animal c1 = new Cat(); c1.eat(); function(new Dog()); function(new Pig()); } public static void function (Animal c) { c.eat(); }} abstract class Animal{ public abstract void eat();} class Cat extends Animal{ public void eat() { System.out.println("吃魚"); } public void catchMouse() { System.out.println("抓老鼠"); } } class Dog extends Animal{ public void eat() { System.out.println("骨頭"); } public void kanjia() { System.out.println("看見"); }} class Pig extends Animal{ public void eat() { System.out.println("飼料"); } public void gongDi() { System.out.println("公地"); }} 修改之前的 class Zx{ public static void main(String []arr) { Cat c = new Cat(); Cat c1 = new Cat(); function(c); function(new Dog()); function(new Pig()); } public static void function (Cat c) { c.eat(); } public static void function (Dog c) { c.eat(); } public static void function (Pig c) { c.eat(); }} abstract class Animal{ public abstract void eat();} class Cat extends Animal{ public void eat() { System.out.println("吃魚"); } public void catchMouse() { System.out.println("抓老鼠"); } } class Dog extends Animal{ public void eat() { System.out.println("骨頭"); } public void kanjia() { System.out.println("看見"); }} class Pig extends Animal{ public void eat() { System.out.println("飼料"); } public void gongDi() { System.out.println("公地"); }} 需求: Animal a= new Cat(); a.eat();想調用貓的特有方法,強制將父類的引用轉成子類的類型,向下轉型。Cat c =(Cat) a;c.catch.Mouse; 但是不可以Animal a = new Animal();Cat c = (Cat)a;多態自始至終都是子類在變化。
關鍵字 instanceof:判斷 對象的引用是否指向某類型 Cat m = new Cat(); m instanceof Cat; truea instanceof Dog; false 多態中成員函數(非靜態)的特點: 在編譯時間期:參閱參考型別所屬的類中是否有調用的方法,如果有,則編譯通過,否則失敗。在運行時期:查閱對象所屬的類中是否有調用的方法。成員函數在多態調用是,編譯看左邊,運行看右邊。 在多態中,成員變數(和靜態方法)特點:無論編譯還是運行,成員變數都參考左邊。 多態的應用舉例: class Zx{ public static void main(String []arr) { MainBoard mb = new MainBoard(); mb.ran(); mb.usePCI(null); mb.usePCI(new NetCard()); mb.usePCI(new MuCard()); }} class MainBoard{ public void ran() { System.out.println("main board ran"); } public void usePCI(PCI P) /*介面型引用指向自己的子類對象,介面不可以建立對象,多態的應用之一, 提高了程式的擴充性,降低了耦合性*/ { if(P!=null) { P.open(); P.close(); } } } interface PCI{ public void open(); public void close(); }class NetCard implements PCI{ public void open() { System.out.println("net open"); } public void close() { System.out.println("net close"); }} class MuCard implements PCI{ public void open() { System.out.println("mu open"); } public void close() { System.out.println("mu close"); }} 擴充性舉例: 需求:資料庫的操作 1,串連資料庫2,操作資料庫3,關閉資料庫連接 下面寫 UserInfoDao ui = new UserInfoByJDBC(); 即可
Object 類: 是所有對象的直接或者間接父類。該類中定義的是所有所有對象都具備的功能。 class Demo //預設 extends Object{} Object.squals(Object obj); //傳回值為 true or false 當二者地址值相同為true Object.toString();//返回該對象的字元表示 返回 “類名@地址值”地址值為16進位Object.hanshCode //返回int 十進位的 地址值
JAVA 8 多態