榨汁机(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();}
}