榨汁機(Juicer)榨汁機的案例:
分別有水果(Fruit),蘋果(Apple),香蕉(Bananal),橘子(Orange),榨汁(squeeze)
要求:
榨出不同的水果汁來喝
//一般方法求解
package com.testl;public class Text1 {public static void main(String[] args) {Juicer j = new Juicer(); //購買榨汁機j.run(new Apple()); //向榨汁機中放入蘋果,榨汁機里面必須有接收蘋果方法才行j.run(new Orange()); //向榨汁機中放入橘子,榨汁機里面必須有接收橘子方法才行//①不同種類的水果都得調用run方法;}}
class Apple{ //買了蘋果,定義蘋果類public void squeeze(){ //蘋果可以榨成蘋果汁,所以里面有一個榨汁的方法System.out.println("榨出一杯蘋果汁兒"); }
}//蘋果汁喝膩了,想喝橘子汁兒
class Orange {public void squeeze(){ //橘子可以榨成橘子汁,所以里面也有一個榨汁的方法System.out.println("榨出一杯橘子汁兒"); }
}//②不同種類的水果都得定義不同的類class Juicer{ //蘋果要放在榨汁機里才可以榨汁,所以要,買一個榨汁機
//方法重載 public void run(Apple a){ //這個方法只管接收蘋果,榨汁機里面有個run方法,可以榨汁,這里是放個蘋果進去a.squeeze(); //榨蘋果汁}public void run(Orange o){ //這個方法只管接收橘子,榨汁機里面有個run方法,可以榨汁,這里是放個蘋果進去o.squeeze(); //榨蘋果汁//③不同種類的水果都得創建接收不同水果的run方法}
}
從這個程序中,我們可以看出,如果要榨出的果汁種類特別的多的話,這樣會特別的麻煩,每種不同的水果都得經過①②③這三步驟。
代碼改進:
package com.student.model;
/*多態方法:將蘋果,橘子這些水果類向上抽取,抽取成一個接口,一個 水果 接口,
然后,在水果這個接口中有個squeeze(榨汁)的抽象方法,這樣的話,
讓每個不同種類的水果進行實現那個 水果 接口,
多態的作用是提高了代碼的復用性,讓程序的擴展性更強*/
public class Text2 {public static void main(String[] args) {Juicer j = new Juicer(); //購買榨汁機 //這之后,想喝什么水果汁就放什么水果就行j.run(new Orange()); //榨橘子汁兒j.run(new Apple()); //榨蘋果汁兒//①這之后,想喝什么水果汁就放什么水果就行}}
interface Fruit {public void squeeze();
}class Apple implements Fruit{ //買了蘋果,定義蘋果類public void squeeze(){ //蘋果可以榨成蘋果汁,所以里面有一個榨汁的方法System.out.println("榨出一杯蘋果汁兒"); }
}class Orange implements Fruit {public void squeeze(){ //橘子可以榨成橘子汁,所以里面也有一個榨汁的方法System.out.println("榨出一杯橘子汁兒"); }
}//②想榨什么水果得將該水果去實現這個水果接口即可class Juicer{public void run(Fruit f){ //在這個榨汁的方法里面,直接給 水果 這個對象就行了f.squeeze();}
}
從這個程序中,我們可以看出,如果要榨出的果汁種類特別的多的話,相對于第一個程序來看的話,這樣相對簡單點,但是,還是有點麻煩,每種不同的水果都得經過①②這兩步驟。
代碼再進行優化:
package com.StudentSystem.wsq;import java.io.BufferedReader;
import java.io.FileReader;
//配置文件里面只需要寫你要讀取的類名就行了,創建一個文本即可;
//例如:com.StudentSystem.wsq.Apple
//就是調用了蘋果這個方法,先調用哪個直接在配置文件里調用即可 包名.方法名
public class Text3 {public static void main(String[] args) throws Exception {/*public static Class<?> forName(String className)throws ClassNotFoundException返回與帶有給定字符串名的類或接口相關聯的 Class 對象。調用此方法等效于: Class.forName(className, true, currentLoader)其中 currentLoader 表示當前類的定義類加載器。參數:className - 所需類的完全限定名。*/BufferedReader br = new BufferedReader(new FileReader("config.txt"));Class clazz = Class.forName(br.readLine());//public T newInstance()throws InstantiationException,IllegalAccessException//創建此 Class 對象所表示的類的一個新實例。如同用一個帶有一個空參數列表的 new 表達式實例化該類。如果該類尚未初始化,則初始化這個類。 Fruit f = (Fruit) clazz.newInstance(); //父類引用指向子類對象,水果的引用指向了蘋果對象Juicer j = new Juicer(); //購買榨汁機 j.run(f);}}
interface Fruit {public void squeeze();
}class Apple implements Fruit{ //買了蘋果,定義蘋果類public void squeeze(){ //蘋果可以榨成蘋果汁,所以里面有一個榨汁的方法System.out.println("榨出一杯蘋果汁兒"); }
}class Orange implements Fruit {public void squeeze(){ //橘子可以榨成橘子汁,所以里面也有一個榨汁的方法System.out.println("榨出一杯橘子汁兒"); }
}class Juicer{public void run(Fruit f){ //在這個榨汁的方法里面,直接給 水果 這個對象就行了f.squeeze();}
}