Java编程思想

上传人:沈*** 文档编号:150172972 上传时间:2022-09-08 格式:PPT 页数:48 大小:144.50KB
返回 下载 相关 举报
Java编程思想_第1页
第1页 / 共48页
Java编程思想_第2页
第2页 / 共48页
Java编程思想_第3页
第3页 / 共48页
点击查看更多>>
资源描述
Java编程思想Java编程思想l数据抽象化、封装l继承l多态Java编程思想l接口与实现分离:实现了“是什么”与“怎样做”两个模块的分离l代码的组织以及可读性均能获得改善l能创建易于扩充的程序l多态性涉及对“类型”的分解:通过继承可将一个对象当作它自己的类型或者它自己的基础类型对待l只需一段代码,即可对所有不同的类型(相同的基础类型中衍生出来的)进行同样的处理l相似类型之间的区分是通过“函数的行为差异”实现l而这些函数都可通过基础类函数唤起Java编程思想l将某个 object reference 视为一个指向基类的 referenceclass Aclass BJava编程思想/:Music.java (p220)/Inheritance&upcastingclass Note private int value;private Note(int val)value=val;public static final Note middleC=new Note(0),cSharp=new Note(1),cFlat=new Note(2);/Etc.class Instrument public void play(Note n)System.out.println(Instrument.play();Java编程思想/Wind objects are instruments/because they have the same interface:class Wind extends Instrument /Redefine interface method:public void play(Note n)System.out.println(Wind.play();public class Music public static void tune(Instrument i)/.i.play(Note.middleC);public static void main(String args)Wind flute=new Wind();tune(flute);/Upcasting /:Ans:Wind.play()Java编程思想/:c07:music2:Music2.java (p221)class Note private int value;private Note(int val)value=val;public static final Note MIDDLE_C=new Note(0),C_SHARP=new Note(1),B_FLAT=new Note(2);/Etc.class Instrument public void play(Note n)System.out.println(Instrument.play();class Wind extends Instrument public void play(Note n)System.out.println(Wind.play();Java编程思想class Stringed extends Instrument public void play(Note n)System.out.println(Stringed.play();class Brass extends Instrument public void play(Note n)System.out.println(Brass.play();Java编程思想public class Music2 public static void tune(Wind i)i.play(Note.MIDDLE_C);public static void tune(Stringed i)i.play(Note.MIDDLE_C);public static void tune(Brass i)i.play(Note.MIDDLE_C);public static void main(String args)Wind flute=new Wind();Stringed violin=new Stringed();Brass frenchHorn=new Brass();tune(flute);/No upcasting,oveloading tune(violin);tune(frenchHorn);/:Java编程思想Ans:Wind.playStringed.playBrass.playJava编程思想lBinding:建立函数调用和函数体的关联lC:先期绑定lJava:后期绑定(除声明为final外)l动态绑定,执行期绑定lfinal 关键字:关闭动态绑定Java编程思想l调用 base class 中的函数l所有的 derived classes 会产生正确的行为l将一条消息发给一个对象,让对象自行判断要做什么事情Java编程思想Java编程思想/:Shapes.java (p225)/Polymorphism in Javaclass Shape void draw()void erase()class Circle extends Shape void draw()System.out.println(Circle.draw();void erase()System.out.println(Circle.erase();Java编程思想class Square extends Shape void draw()System.out.println(Square.draw();void erase()System.out.println(Square.erase();class Triangle extends Shape void draw()System.out.println(Triangle.draw();void erase()System.out.println(Triangle.erase();Java编程思想public class Shapes public static Shape randShape()switch(int)(Math.random()*3)default:/To quiet the compiler case 0:return new Circle();case 1:return new Square();case 2:return new Triangle();public static void main(String args)Shape s=new Shape9;/Fill up the array with shapes:for(int i=0;i s.length;i+)si=randShape();/Make polymorphic method calls:for(int i=0;i s.length;i+)si.draw();/:Java编程思想Ans:(答案不唯一)Circle.drawSquare.draw Triangle.drawTriangle.drawSquare.drawSquare.drawSquare.drawCircle.drawSquare.draw Java编程思想l后来可加入更多的型别l在围绕tune()方法的其他所有代码都发生变化的同时,tune()方法却丝毫不受它们的影响,依然正常工作。这正是利用多形性希望达到的目标。l允许程序员“将发生改变的东西同没有发生改变的东西区分开”Java编程思想Java编程思想/:Music3.java (p227)/An extensible programimport java.util.*;class Instrument public void play()System.out.println(Instrument.play();public String what()return Instrument;public void adjust()class Wind extends Instrument public void play()System.out.println(Wind.play();public String what()return Wind;public void adjust()Java编程思想class Percussion extends Instrument public void play()System.out.println(Percussion.play();public String what()return Percussion;public void adjust()class Stringed extends Instrument public void play()System.out.println(Stringed.play();public String what()return Stringed;public void adjust()class Brass extends Wind public void play()System.out.println(Brass.play();public void adjust()System.out.println(Brass.adjust();Java编程思想class Woodwind extends Wind public void play()System.out.println(Woodwind.play();public String what()return Woodwind;public class Music /Doesnt care about type,so new types /added to the system still work right:static void tune(Instrument i)/.i.play();static void tuneAll(Instrument e)for(int i=0;i e.length;i+)tune(ei);Java编程思想 public static void main(String args)Instrument orchestra=new Instrument5;int i=0;/Upcasting during addition to the array:orchestrai+=new Wind();orchestrai+=new Percussion();orchestrai+=new Stringed();orchestrai+=new Brass();orchestrai+=new Woodwind();tuneAll(orchestra);/:Java编程思想Ans:Wind.play()Percussion.play()Stringed.play()Brass.play()Woodwind.play()Java编程思想l在子类中,具有与父类相同名字、相同参数表和相同返回值的方法l子类通过重写把父类的状态和行为改变为自身的状态和行为l子类通过 super 实现对父类成员的访问l Java 通过方法重写来实现多态Java编程思想/:c07:WindError.java 重载 (p229)/Accidentally changing the interface.class NoteX public static final int MIDDLE_C=0,C_SHARP=1,C_FLAT=2;class InstrumentX public void play(int NoteX)System.out.println(InstrumentX.play();Java编程思想class WindX extends InstrumentX /OOPS!Changes the method interface:public void play(NoteX n)System.out.println(WindX.play(NoteX n);public class WindError public static void tune(InstrumentX i)/.i.play(NoteX.MIDDLE_C);public static void main(String args)WindX flute=new WindX();tune(flute);/Not the desired behavior!/:Java编程思想Ans:InstumentX.playJava编程思想l抽象函数前面使用“abstract”关键字l一种不完全的函数l含有抽象函数的类为抽象类,前面必须使用 Abstract 修饰,即 Abstract classabstract void f();Java编程思想(参阅 p232 Music4.java)Java编程思想1.调用基类构造函数:反复递归,直到最后一层子类之前2.依次将各个数据成员初始化3.调用子类构造函数本身Java编程思想MealBreadCheeseLettuceLunchPortableLunchSandwichJava编程思想/:Sandwich.java (p234)/Order of constructor calls class Meal Meal()System.out.println(Meal();class Bread Bread()System.out.println(Bread();class Cheese Cheese()System.out.println(Cheese();Java编程思想class Lettuce Lettuce()System.out.println(Lettuce();class Lunch extends Meal Lunch()System.out.println(Lunch();class PortableLunch extends Lunch PortableLunch()System.out.println(PortableLunch();Java编程思想class Sandwich extends PortableLunch Bread b=new Bread();Cheese c=new Cheese();Lettuce l=new Lettuce();Sandwich()System.out.println(Sandwich();public static void main(String args)new Sandwich();/:Java编程思想Ans:Meal()Lunch()PortableLunch()Bread()CheeseLettuceSandwhchJava编程思想l当我们以一个现有类为基础建立一个新类时,如首先选择继承,会使情况变得异常复杂。l使用继承时要谨慎l准则:使用继承表达行为上的差异,以数据成员表达状态上的变化l组合手法较灵活,弹性大Java编程思想/:Transmogrify.java (p241)/Dynamically changing the behavior of/an object via composition.abstract class Actor abstract void act();class HappyActor extends Actor public void act()System.out.println(HappyActor);class SadActor extends Actor public void act()System.out.println(SadActor);Java编程思想class Stage Actor a=new HappyActor();void change()a=new SadActor();void go()a.act();public class Transmogrify public static void main(String args)Stage s=new Stage();s.go();/Prints HappyActor s.change();s.go();/Prints SadActor /:Java编程思想Ans:HappyActorSadActorJava编程思想l只加以覆写l“is-a”(是一种)关系l纯取代,如下面这张图所示:Java编程思想l“is-like-a”(像是一个)关系l关键字“extends”似乎也在鼓励这么做Java编程思想lRTTI:run-time type identificationl向上转型绝对安全l向下转型可能会不安全P244 图Java编程思想/:c07:RTTI.java (p244)/Downcasting&Run-time Type/Identification(RTTI).import java.util.*;class Useful public void f()public void g()class MoreUseful extends Useful public void f()public void g()public void u()public void v()public void w()Java编程思想public class RTTI public static void main(String args)Useful x=new Useful(),new MoreUseful();x0.f();x1.g();/Compile-time:method not found in Useful:/!x1.u();(MoreUseful)x1).u();/Downcast/RTTI (MoreUseful)x0).u();/Exception thrown /:Ans:编译通过,运行时产生 ClassCastException 错误 Java编程思想l使客户端得以发现对象的型别lClassCastExceptionl第12章Java编程思想l多态:不同的形式l多态是后期绑定l发现classes的共同性及彼此关系l可扩充性是关键Java编程思想l阅读第 7 章l第 7章:2,9,14
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


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

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


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