59_Java_面向對象5_abstract_interface_代理_工廠模式_內部類
抽象類 Abstract
abstract關鍵字的使用 :?子類定義越來越具體,父類更像一個通用類,為了保證父類/子類共享特征,將父類抽象化,父類不能實例化
1? abstract:抽象的
2? abstract可以用來修飾的結構:類、方法
3? abstract修飾類:抽象類
> 此類不能實例化??abstract class Creature{ public abstract void breath(); }
> 抽象類中一定有構造器,便于子類實例化時調用(涉及:子類對象實例化的全過程)
> 開發中,都會提供抽象類的子類,讓子類對象實例化,完成相關的操作
4. abstract修飾方法:抽象方法
> 抽象方法只有方法的聲明,沒有方法體;??public abstract void eat();
> 包含抽象方法的類,一定是一個抽象類。反之,抽象類中可以沒有抽象方法的。
> 若子類重寫了父類中的所有的抽象方法后,此子類方可實例化?若子類沒有重寫父類中的所有的抽象方法,則此子類也是一個抽象類,需要使用abstract修飾
5 abstract使用上的注意點:
1.abstract不能用來修飾:屬性、構造器等結構;?構造器本身不能重寫?只能重載;
2.abstract不能用來修飾私有方法、靜態方法、final的方法、final的類
Note:?抽象必須重寫,私有方法無法重寫;方法重寫前提是?非static的,final不能重寫方法,類不能繼承?和抽象相對存在
abstract class Creature{ public abstract void breath(); } abstract class Person extends Creature{ // 沒有重寫父類的 breath() 所以是abstract 修飾 String name; int age; public Person(){ } public Person(String name,int age){ this.name = name; this.age = age; // 抽象方法 public abstract void eat(); public void walk(){ System.out.println("人走路"); } } class Student extends Person{ public Student(String name,int age){ super(name,age); } public Student(){ } public void eat(){ # 重寫父類person 抽象 eat() System.out.println("學生多吃有營養的食物"); } @Override public void breath() { # 重寫父類 creature breath() System.out.println("學生應該呼吸新鮮的沒有霧霾的空氣"); }}
#?創建了一匿名子類的對象
method1(new Person(){ @Override public void eat() { System.out.println("吃好吃東西"); } @Override public void breath() { System.out.println("好好呼吸新鮮空氣"); } }); }
抽象類的應用:模板方法的設計模式
public class TemplateTest { public static void main(String[] args) { SubTemplate t = new SubTemplate(); t.spendTime(); }} abstract class Template{ //計算某段代碼執行所需要花費的時間 public void spendTime(){ long start = System.currentTimeMillis(); this.code();//不確定的部分、易變的部分 long end = System.currentTimeMillis(); System.out.println("花費的時間為:" + (end - start)); } public abstract void code(); } class SubTemplate extends Template{ @Override public void code() { for(int i = 2;i <= 1000;i++){ boolean isFlag = true; for(int j = 2;j <= Math.sqrt(i);j++){ if(i % j == 0){ isFlag = false; break; } } if(isFlag){ System.out.println(i); } }}}
接口的使用;可以實現多繼承的效果
1.接口使用interface來定義
2.Java中,接口和類是并列的兩個結構
3.如何定義接口:定義接口中的成員
3.1 JDK7及以前:只能定義全局常量和抽象方法
>全局常量:public static final的.但是書寫時,可以省略不寫
>抽象方法:public abstract的? 沒有方法體
3.2 JDK8:除了定義全局常量和抽象方法之外,還可以定義靜態方法、默認方法(略)
4. 接口中不能定義構造器的!意味著接口不可以實例化
5. Java開發中,接口通過讓類去實現(implements)的方式來使用.?如果實現類覆蓋了接口中的所有抽象方法,則此實現類就可以實例化
如果實現類沒有覆蓋接口中所有的抽象方法,則此實現類仍為一個抽象類
6. Java類可以實現多個接口???--->彌補了Java單繼承性的局限性?格式:class AA extends BB implements CC,DD,EE
7. 接口與接口之間可以繼承,而且可以多繼承
8. 接口的具體使用,體現多態性
9. 接口,實際上可以看做是一種規范
1.接口使用上也滿足多態性
2.接口,實際上就是定義了一種規范
3.開發中,體會面向接口編程!
interface USB{ //常量:定義了長、寬、最大最小的傳輸速度等 void start(); void stop(); } class Flash implements USB{ @Override public void start() { System.out.println("U盤開啟工作");} @Override public void stop() { System.out.println("U盤結束工作");}} class Printer implements USB{ @Override public void start() { System.out.println("打印機開啟工作");} @Override public void stop() { System.out.println("打印機結束工作");}} class Computer{ public void transferData(USB usb){//USB usb = new Flash(); // 接口定義規范, 但接口不能造對象,傳入一個接口的實現類的對象; 體現了接口的多態性 usb.start(); System.out.println("具體傳輸數據的細節"); usb.stop(); }}
public class USBTest { public static void main(String[] args) { Computer com = new Computer(); //1.創建了接口的非匿名實現類的非匿名對象 Flash flash = new Flash(); com.transferData(flash); //2. 創建了接口的非匿名實現類的匿名對象 com.transferData(new Printer()); //3. 創建了接口的匿名實現類的非匿名對象 USB phone = new USB(){ # 匿名實現類 沒名,用接口來充當; @Override public void start() { System.out.println("手機開始工作");} @Override public void stop() { System.out.println("手機結束工作");}}; com.transferData(phone); //4. 創建了接口的匿名實現類的匿名對象 com.transferData(new USB(){ @Override public void start() { System.out.println("mp3開始工作");} @Override public void stop() { System.out.println("mp3結束工作"); } });}}
代理模式 代理設計就是為其他對象提供一種代理以控制對這個對象的訪問
//接口 interface Star { void confer();// 面談 void signContract();// 簽合同 void bookTicket();// 訂票 void sing();// 唱歌 void collectMoney();// 收錢 } //被代理類 class RealStar implements Star { public void confer() { } public void signContract() { } public void bookTicket() { } public void sing() { System.out.println("明星:歌唱~~~");} public void collectMoney() { } } //代理類 class Proxy implements Star { private Star real; public Proxy(Star real) { this.real = real;} public void confer() { System.out.println("經紀人面談");} public void signContract() { System.out.println("經紀人簽合同");} public void bookTicket() { System.out.println("經紀人訂票");} public void sing() { real.sing();} public void collectMoney() { System.out.println("經紀人收錢"); }} public class StaticProxyTest { public static void main(String[] args) { Proxy s = new Proxy(new RealStar()); s.confer(); s.signContract(); s.bookTicket(); s.sing(); s.collectMoney(); }}
工廠模式:實現了創建者與調用者的分離,即將創建對象的具體過程屏蔽隔離起來
public class FactoryTest { public static void main(String[] args) { new AudiFactory().getCar().run(); new MazdaFactory().getCar().run(); } } interface Car { void run(); } class Audi implements Car { @Override public void run() { System.out.println("奧迪"); } } class Mazda implements Car{ // 要被創建的對象 @Override public void run() { System.out.println("馬自達"); } } class AudiFactory { // 創建對象的工廠 OCP(開閉原則,Open-Closed Principle) public Audi getCar (){ return new Audi(); } } class MazdaFactory{ public Mazda getCar(){ return new Mazda(); } }
內部類
1. Java中允許將一個類A聲明在另一個類B中,則類A就是內部類,類B稱為外部類
2.內部類的分類:成員內部類(靜態、非靜態)??vs 局部內部類(方法內、代碼塊內、構造器內)
3.成員內部類:
一方面,作為外部類的成員:
>調用外部類的結構
>可以被static修飾
>可以被4種不同的權限修飾
另一方面,作為一個類:
> 類內可以定義屬性、方法、構造器等
> 可以被final修飾,表示此類不能被繼承。言外之意,不使用final,就可以被繼承
> 可以被abstract修飾
4.關注如下的3個問題
4.1 如何實例化成員內部類的對象
4.2 如何在成員內部類中區分調用外部類的結構
4.3 開發中局部內部類的使用
public class InnerClassTest { public static void main(String[] args) { //創建Dog實例(靜態的成員內部類): Person.Dog dog = new Person.Dog(); dog.show(); //創建Bird實例(非靜態的成員內部類): // Person.Bird bird = new Person.Bird();//錯誤的 Person p = new Person(); Person.Bird bird = p.new Bird(); bird.sing(); System.out.println(); bird.display("黃鸝"); }} class Person{ String name = "小明"; int age; public void eat(){ System.out.println("人:吃飯"); } //靜態成員內部類 static class Dog{ String name; int age; public void show(){ System.out.println("卡拉是條狗"); // eat(); } } //非靜態成員內部類 class Bird{ String name = "杜鵑"; public Bird(){ } public void sing(){ System.out.println("我是一只小小鳥"); Person.this.eat();//調用外部類的非靜態屬性 eat(); System.out.println(age); } public void display(String name){ System.out.println(name);//方法的形參 System.out.println(this.name);//內部類的屬性 System.out.println(Person.this.name);//外部類的屬性 } } public void method(){ //局部內部類 class AA{ } } { //局部內部類 class BB{ } } public Person(){ //局部內部類 class CC{ } }
Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。