package com.aaa.zxf.ajax.test; /** 一、java中的 抽象 Animal這個類 存在的意義是什么? (動物園真的有一個動物叫Animal嗎?沒有 但是你為了某種操作創建了Animal 那么此時程序就有一個bug 分析: 1 Animal這個來存來僅僅是用來產生多態,但是為了多態而導致能創建Animal對象這顯然是不合理的, 所以我們希望:Animal這個類得存在,但是不能通過new 創建對象 2 Animal的eat有用,在編譯的時候 如果Animal沒有eat函數 編譯不會通過,但是我們運行的時候 是調用的真實類型的eat()所以Animal的eat不會被調用。 Animal的eat方法得有 但是方法體沒什么用。 所以我們希望:Animal中的eat函數 只聲明 不寫實現(因為沒必要寫)。 3 Animal的子類必須要有各自的eat函數,但是我們做的練習 eat可以不寫,此時會去調用父類的eat函數。所以我們希望:子類必須實現eat()函數 解決方案:將Animal這個類變成抽象類 二、聲明一個抽象類 三、java中抽象類中構造函數使用 1. 構造函數是對象的基本,沒有構造函數就沒有對象。 2. 父類抽象類中寫了有參數的構造函數,子類繼承是就必須寫一個構造函數來調用父類的構造函數 四、匿名內部類 */ public class JavaDuoTai { public static void main(String[] args) { // 繼承多態 Animal02 h = new Hourse(); // h 代表了兩個對象。 h.sleep(); // 調用父類抽象類中的普通方法 sleep h.eat(); // 調用子類中的方法 eat。 Hourse hourse = new Hourse("張三", 45); System.out.println(" name="+hourse.name +" age="+ hourse.age); /** * 抽象類無法通過new 來創建對象。 因為是抽象的。 * 我是匿名內部類 實現它的抽象方法。 * 這種寫法 */ Animal02 animal02 = new Animal02() { @Override public void eat() { System.out.println("我是匿名內部類"); //多一個T$1.class,這個class就是匿名內部類的原型, // 所以new針對的還是普通的class(雖然內部類和普通類有很大不一樣),只不過這個class的寫法稍有不同,它是編譯器幫我們從匿名內部類中提取的。 System.out.println("獲得class的對象"+this.getClass()); } }; //執行 匿名內部類 animal02.eat(); } } class Animal01{ public int id; public String name; private int age; void run(){ System.out.println("動物要吃飯"); } } class Dog01 extends Animal01{ public String food; @Override void run(){ System.out.println("狗吃骨頭"); } } class Cat01 extends Animal01{ public String color; @Override void run(){ System.out.println("貓吃魚"); } } /** * 二、 聲明一個抽象類 * * 1. 關鍵字 abstract 用來修飾類 和 方法。 * * * 2. 抽象類的特征? * A 抽象方法不需要寫方法體 * B 抽象方法必須在抽象類中 * The type Animal must be an abstract class to define abstract methods * C 抽象類中不一定要有抽象方法 (抽象類可以有抽象方法 普通方法 成員方法) * D 子類繼承了一個抽象父類並且父類中有抽象方法 那么子類必須去重寫抽象方法----》抽象方法由子類負責實現 * E 抽象類不能通過new創建對象 但是 有構造函數 ( * 這個構造函數是用來讓子類調用的 * */ // 定義一個抽象類。 abstract class Animal02{ public String name; public int age; public Animal02() { } //有參數的構造函數 這個構造函數是用來讓子類調用的 public Animal02(String name, int age) { this.name = name; this.age = age; } public abstract void eat(); //1.抽象方法不需要寫方法體 2.抽象方法必須在抽象類中 //抽象類中不一定要有抽象方法 普通方法 public void sleep(){ System.out.println("睡覺!"); } } //子類 繼承抽象類 需要重寫父類的方法 class Hourse extends Animal02{ public Hourse() { } // 讓子類調用父類的 構造函數 關鍵字 super public Hourse(String name, int age) { super(name, age); } @Override public void eat() { System.out.println("馬飛飛。"); } }