java编程思想教案

上传人:kfc****89 文档编号:243302873 上传时间:2024-09-20 格式:PPT 页数:59 大小:4.80MB
返回 下载 相关 举报
java编程思想教案_第1页
第1页 / 共59页
java编程思想教案_第2页
第2页 / 共59页
java编程思想教案_第3页
第3页 / 共59页
点击查看更多>>
资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,李 粤,liyue,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,*,JAVA,程序设计,教程,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,第 六 讲,第七章(续),+,工厂模式,学习目标,掌握接口的概念和作用,理解抽象类和接口的区别,理解多态的含义和作用,2,7.4,接口,接口,在,Java,语言中就是一组没有具体实现的方法的集合。任何一个类都可以实现一个或多个接口所定义的方法。通过使用接口,可以将功能说明从实现中分离出来,从而向访问者隐蔽了类或子系统的具体实现。,下面是声明接口的语法:,public interface InterfaceName extends SuperInterface1 ,常量声明,;,type methodName1();,type methodName2();,3,public interface Comparable,int compareTo(T o);,public interface BankService ,/,为一个账户提供取款服务,返回最后取款额,int withdraw(Account account,int amount);,/,为一个账户提供取款服务,返回最后存款额,int deposit(Account account,int amount);,/,根据账户,id,,,查询账户余额,int findBalance(String id);,4,注意,一个类可以实现多个接口。,由于接口中的方法都是抽象的,因此,除非实现接口的类本身是抽象的,否则接口中定义的抽象方法在非抽象类中都必须以一一具体实现,那怕某些方法该类并不需要。,可以使用实现的接口类型作为该类实例的类型。,public class ClassName extends SuperClass,implements,Interfaces,5,一个实现接口的类,/,程序,7-4,:一个实现了,Comparable,接口的,Account,类,import java.util.Arrays;,public class Account,implements Comparable,/compareTo,方法覆盖了来自接口的方法,Override,public int compareTo(Object o) ,int result=0;,/,这里忽略了,o,的类型不是,Account,的情况,Account t=(Account)o;,/,利用字符串对象自身的,compareTo(),方法作为账户大小的比较,return pareTo(t.getId();,6,一个接口,声明它的访问范围为,public,,意味着可以被任何类所实现,如果采用缺省方式,则只有和接口同在一个包内的类所实现。,每个类只可以有一个超类,但是一个接口却可以有多个父接口,(,用逗号分割,),,当然也可以没有。,一个接口内部可以包括多个常量,供实现接口的类使用,常量的类型默认总是,public static final,,因此无须再显式定义。由于是常量,所以需要在定义的时候直接进行初始化。,接口中的方法不能包含具体实现代码,那怕是空方法体,因此,接口中的方法声明没有,而且方法的默认访问属性就是,public abstract,。,7,7.4.3,用接口定义变量,虽然不能创建接口的实例,但是可以用接口作为变量的类型声明。,如果一个对象用接口来声明类型的话,那么,通过对象名只能看到该对象类实现的对应接口的所有方法,其它属于自身的成员变量和方法都不可能被访问。,当一个变量的类型是接口类型时,其引用的对象类型只要是实现了这个接口的类的对象都是允许的,List accounts = null;,accounts = new,ArrayList,();,accounts = new,LinkedList,();,8,7.5,抽象类和接口,简单来看,抽象类和接口都可以允许定义子类必须实现的方法。但实际上两者在语义和用途上有着很大的差别。,从语法规定来看它们的区别很明显。,Java,支持一个类只能继承一个超类,但支持一个类实现多个接口;另外,接口中的方法仅是抽象方法的声明,而抽象类中可以包含方法的具体实现;,最重要的,抽象类本身是一类型系统中的超类,而接口仅是抽象方法的集合。因此抽象类更多的用在描述问题的类的层次结构中,而接口更多的用在描述系统,(,或组件,),所提供的公共服务中。,9,课堂练习,下面程序编译运行的结果是什么,interface Action,int i=10;,void doAction(),System.out.println(“do anything!”),class Happy implements Action ,public static void main(String args) ,Happy h=new Happy();,int j;,j = Action.i;,j = Happy.i;,j = h.i;,10,继承,vs,组合,继承,表达行为间的差异;,组合,表达状态上的变化;,区分,是否需要用到向上转型;,11,向上转型,(Upcating),将导出类引用转化为基类引用的动作;,凡是能使用基类对象的地方,都能使用导出类对象;,12,向上转型,(Upcating),两种类型,显式类型:基类类名 对象名,= new,导出类类名,();,隐式类型:形参是基类类型,实参是导出类类型(上页示例);,13,运行时类型识别,(RTTI),向上转型,会丢失具体的类型信息;,14,15,多态性,多态性,(polymorphism),派生于希腊单词,poly(,许多,),和,morph(,形状,),,所以多态直接的解释就是多种形态。在面向对象语言中,多态的意思就是在不同时刻一个具有某种类型的变量可以引用不同类型的对象,并且向该变量发出的消息(通过对象名调用方法)取决于该变量此时引用对象的实际类型。,例如:可以在同一个类中定义名称相同,但是操作不同的多个方法,在运行时判断应该执行那个方法的能力叫做,多态性。(动态绑定),还有,在父类中定义的方法,子类做了覆盖,子类中调用那个方法取决于运行时对象的类型,这也叫“,多态性,”,16,多态性的例子,class Animal ,public void eat( ),System.out.println(Eat something.);,class Cat extends Animal ,public void eat( ),System.out.println(Eat mouse.);,class App ,public static void main(String args),Animal a = new Animal();,Cat c = new Cat();,a.eat();,c.eat();,a = c;,a.eat();, ,17,课堂练习,按照要求完成以下作业:,第一个类是图形类(,Shape,),含有一个成员变量,color,(字符串类型),一个没有参数的构造方法,以及一个有一个字符串类型参数的构造方法来初始化颜色变量,还有一个返回颜色变量值的成员方法,show,,以及一个没有具体实现的方法,getArea,,返回值为,double,;,第二个类是圆形类(,Circle,)继承了图形类,自己又含有一个变量半径,r,,有一个有两个参数的构造方法,来初始化颜色和半径,成员方法,show,返回值格式为,”r:?,color:?”,;,第三个类是矩形类(,Rectangle,)继承了图形类,自己又含有两个,double,变量长,a,和宽,b,,有一个有三个参数的构造方法,来初始化颜色、长和宽,成员方法,show,返回格式为,”width,:,?,height,:?,,color:?”,;,第四个类是测试类(,TestShape,),分别定义圆形类和矩形类的实例对象,并用,show,方法来测试自己的定义。,18,课堂练习,如果有两个类,A,、,B,(注意不是接口,两个类之间没有关系),你想同时使用这两个类的功能,那么你会如何编写这个,C,类呢?,19,课堂练习,public class A,public void a1() ,public void a2() ,public class B,public void b1() ,public void b2() ,public class C,private A a=new A();,private B b=new B();,public void a1(),a.b1();,public void a2(),a.b2();,public void b1(),b.b1();,;,public void b2(),b.b2();,;,20,课堂练习,问题:,程序运行后的输出是什么?,如果学号相同,则两个,Student,对象认为是同一个学生(即,equal,方法返回,true,),则,Student,类如何修改,class Student,String sid;,public Student(String sid)this.sid=sid;,public static void main(String args),Object o1=(Object)new Student(“200701”);,Object o2=new Student(“200701”);,Object o3=new Object();,boolean r=(o1.equals(o2)?true:false);,System.out.println(o1.equals(o2)+r);,r=(o1=o2?true:false);,System.out.println(o1=o2+r);,r=(o1=o3?true:false);,System.out.println(o1=o3+r);,r=(o1.equals(o3)?true:false);,System.out.println(o1.equals(o3)+r);,21,课堂练习,分析程序的运行结果,class C1,static int j=0;,public void method(int a),j+;,class Test extends C1,public int method(),return j+;,public void result(),method(j);,System.out.println(j+method();,public static void main(String args),new Test().result();,22,动态和静态类型,静态的类型在编译时进行检查,禁止出现编译期间的误用,例如把一个字符串赋给了一个整型变量; 而动态类型则在运行时检查。,Java,中如果方法是用,private,、,static,或,final,修饰的则采用静态绑定,否则都采用动态绑定。,动态绑定意味着某个具体的方法调用只有在运行时才能和具体的对象方法进行关联,在静态编译时,是无法确定具体的实现。,23,课堂练习,请在,Animal,和,Cat,类的基础上,尝试做如下修改,观察它们的现象,在,Cat,类中添加新的方法:,climb,,用对象变量,a,和,c,分别访问,描述它们的现象,在,Animal,类中添加新的属性,colour,,添加构造方法,Animal,(,String colour,),用对象变量,a,和,c,分别访问,描述它们的现象,在,Cat,中添加新的属性,colour,,隐藏,Animal,类的属性,colour,,此时用对象变量,a,和,c,分别访问,描述它们的现象,修改,Animal,和,Cat,类的,colour,属性访问修饰符为,private,,,Animal,类中添加,colour,的,getColour(),方法,此时用对象变量,a,和,c,分别访问该方法,描述它们的现象,在,Cat,中覆盖,getColour(),,此时用对象变量,a,和,c,分别访问该方法,描述它们的现象,24,思考(,2,),如何给突然有钱人治病?,25,面向对象编程的三大法宝,封装,通过合并特征和行为来创建数据类型;,简单拿来和简单给出;,继承,节省,+,优化代码结构;,给出类型间的联系;,向上转型,允许将基类相同的多种导出类视为同一类型使用,即同一份代码可以毫无差别的允许在不同类型上。,26,面向对象编程的三大法宝(,2,),多态,分离“做什么”(吃中午饭)和“怎么做”(吃啥中午饭);,消除类型之间的耦合关系;,多态方法调用允许一种类型表现出与其他相似类型的,区别,这种区别根据方法行为的不同而表现出来;,27,耦合,28,29,30,前期绑定,v.s.,后期绑定,绑定时间,代表语言,前期绑定,在程序执行前,C,语言,后期绑定,在运行时根据对象的类型,Java,语言,绑定,:将一个方法调用同另一个方法主题关联起来;,static,方法和,final,方法(,private,方法属于,final,方法);,可以编写只与基类打交道的程序代码,即,发送消息给某个对象,让该对象去断定该如何做事情;,31,在编译时,编译器不需要获得任何特殊信息就能进行正确的调用;,将改变的事物与未变的事物分离开来;,33,方法覆盖,覆盖一个方法时,子类方法的权限不能低于超类方法;,私有方法不能覆盖;,34,35,域与静态方法的多态问题,后期绑定,多态,36,37,基类和导出类的,Upcast,不能覆盖部分是基类的:例如成员(属性)和静态方法;,能覆盖部分是导出类的:例如非静态方法;,38,构造器和多态,初始化顺序,编译时先初始化主类的基类的静态定义(包括静态块),再初始化主类的;,执行主类的,main,方法,声明主类对象,先依次初始化主类的基类的非静态定义和构造器,再初始化主类的;,声明其他类对象,先依次初始化其他类的基类的静态定义、非静态定义和构造器,再初始化其他类;,构造器,实际是,static,方法;,39,构造器和多态(,2,),Meal,(餐),Bread,(面包),Cheese,(芝士),Lettuce,(生菜),Lunch,(中餐),PortableLunch,(简易中餐),40,清理(,1,),Characteristic,(个性),Characteristic,(),void dispose(),Description,(描述),Description,(),void dispose(),LivingCreature,(生物),Characteristic,Description,LivingCreature,(),void dispose(),Animal,(动物),Characteristic,Description,Animal,(),void dispose(),Amphibian,(两粞动物) ),Characteristic,Description,Amphibian,(),void dispose(),41,清理(,2,),42,清理(,3,),43,构造器内部的多态方法,44,协变返回类型,允许返回更具体的,Whear,类型;,45,接口(,1,),抽象类,包含一个或多个抽象方法;,Abstract void f(),抽象方法仅有声明而没有方法体。,接口,全部方法都是抽象方法;,Interface,替代了,class;,Implements,替代了,extends;,接口的方法默认都是抽象和,public;,提供一组对类需求的描述,这些类要遵从接口描述的统一格式进行定义;,46,接口(,2,),导出类必须全部覆盖抽象类中的抽象方法,否则也是导出类;,47,48,完全解耦,Processor,String name();,Object process();,Upcase,Object process();,Downcase,Object process();,Splitter,Object process();,49,接口:,1,)向上转型;,2,)避免创建该接口的对象;,一个类只能继承一个超类,却能实现多个接口;,实现一个接口时,方法必须是,public,;,50,接口的扩展,继承实现,避免需要组合的不同接口使用相同方法名;,51,工厂模式(,1,),简单工厂模式,又称静态工厂方法模式,定义一个用于创建对象的接口;,1),工厂类角色:是本模式的核心,含有一定的商业逻辑和判断逻辑。在,java,中它往往由一个具体类实现;,2),抽象产品角色:一般是具体产品继承的父类或者实现的接口。在,java,中由接口或者抽象类来实现。,3),具体产品角色:工厂类所创建的对象就是此角色的实例。在,java,中由一个具体类实现。,工厂方法模式,52,以简单工厂模式来改造突然有钱人坐车的方式,现在突然有钱人只需要坐在车里对司机说句:“开车”就可以了。,/,抽象产品角色,public interface Car,public void drive();,/,具体产品角色,public class Benz implements Car ,public void drive() ,System.out.println(Driving Benz);,public class Bmw implements Car ,public void drive() ,System.out.println(Driving Bmw);,.,奥迪啥的就不写了,/,工厂类角色,public class Driver,/,工厂方法,注意,返回类型为抽象产品角色,public static Car driverCar(String s) throws Exception ,/,判断逻辑,返回具体的产品角色给,Client,if (s.equalsIgnoreCase(Benz),return new Benz();,else if s.equalsIgnoreCase(Bmw),return new Bmw();,.,else throw new Exception,/,欢迎突然有钱人出场,public class Magnate ,public static void main(String args),try,/,告诉司机我今天坐奔驰,Car car = Driver.driverCar(benz);,/,下命令,开车,car.drive();,53,工厂模式(,2,),简单工厂模式,客户端免除了直接创建产品对象的责任,而仅仅负责“消费”产品(正如暴发户所为)。,从开闭原则(对扩展开放;对修改封闭)上来分析,当暴发户增加了一辆车的时候,只要符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了;,但是工厂部分好像不太理想,因为每增加一辆车,都要在工厂类中增加相应的业务逻辑或者判断逻辑,这显然是违背开闭原则的。可想而知对于新产品的加入,工厂类是很被动的。对于这样的工厂类(在我们的例子中是为司机师傅),我们称它为全能类或者上帝类。,54,工厂模式(,3,),简单工厂模式,又称静态工厂方法模式,工厂方法模式,去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承;,在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担;,55,工厂模式(,4,),工厂方法模式,1),抽象工厂角色:是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在,java,中它由抽象类或者接口来实现。,2),具体工厂角色:含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。,3),抽象产品角色:是具体产品继承的父类或者是实现的接口。在,java,中一般有抽象类或者接口来实现。,4),具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在,java,中由具体的类来实现。,56,工厂模式(,5,),工厂方法模式,使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。,当有新产品(即突然有钱人的汽车)产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。,57,工厂模式(,6,),突然有钱人生意越做越大,自己的爱车也越来越多。给司机分配几个人手,只管管好他们就行了!,/,抽象产品角色,具体产品角色与简单工厂模式类似,只是变得复杂了些,public interface Driver,public Car driverCar();,public class BenzDriver implements Driver ,public Car driverCar(),return new Benz();,public class BmwDriver implements Driver ,public Car driverCar(),return new Bmw();,/,应该和具体产品形成对应关系,/,有请突然有钱人,public class Magnate ,public static void main(String args) ,try,Driver driver = new BenzDriver();,Car car = driver.driverCar();,car.drive();,58,工厂模式(,7,),简单工厂模式,新产品的加入要修改工厂角色中的判断语句;,工厂方法模式,要么将判断逻辑留在抽象工厂角色中,要么在客户程序中将具体工厂角色写死(就象上面的例子一样)。而且产品对象创建条件的改变必然会引起工厂角色的修改。,使用条件,1),当客户程序不需要知道要使用对象的创建过程。,2),客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。,59,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 中学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!