ThinkinginJava06(重复运用类).ppt

上传人:小飞机 文档编号:5450852 上传时间:2023-07-08 格式:PPT 页数:64 大小:243.49KB
返回 下载 相关 举报
ThinkinginJava06(重复运用类).ppt_第1页
第1页 / 共64页
ThinkinginJava06(重复运用类).ppt_第2页
第2页 / 共64页
ThinkinginJava06(重复运用类).ppt_第3页
第3页 / 共64页
ThinkinginJava06(重复运用类).ppt_第4页
第4页 / 共64页
ThinkinginJava06(重复运用类).ppt_第5页
第5页 / 共64页
点击查看更多>>
资源描述

《ThinkinginJava06(重复运用类).ppt》由会员分享,可在线阅读,更多相关《ThinkinginJava06(重复运用类).ppt(64页珍藏版)》请在三一办公上搜索。

1、Java编程思想,第六章:重复运用类,重复运用类,组合继承,组合,一个类包含另一个类的对象成员,package com.tju;class X public class Y X x;Y()x=new X();,Containment,将 object reference 置于新的 class 内,/:SprinklerSystem.java(p192)/Composition for code reuseclass WaterSource private String s;WaterSource()System.out.println(WaterSource();s=new String(Co

2、nstructed);public String toString()return s;/当String对象和source相加,/toString自动调用public class SprinklerSystem private String valve1,valve2,valve3,valve4;WaterSource source;,int i;float f;void print()System.out.println(valve1=+valve1);System.out.println(valve2=+valve2);System.out.println(valve3=+valve3);

3、System.out.println(valve4=+valve4);System.out.println(i=+i);System.out.println(f=+f);System.out.println(source=+source);public static void main(String args)SprinklerSystem x=new SprinklerSystem();x.print();/:,Ans:valve1=nullvalve2=nullvalve3=nullvalve4=nulli=0f=0.0source=null,组合:初始化,当定义一个对象变量时使用new方

4、法构造函数中使用对象之前初始化:lazy initialization,初始化,/:Bath.java(p194)/Constructor initialization with compositionclass Soap private String s;Soap()System.out.println(Soap();s=new String(Constructed);public String toString()return s;,public class Bath private String/Initializing at point of definition:s1=new Str

5、ing(Happy),s2=Happy,s3,s4;Soap castille;int i;float toy;Bath()System.out.println(Inside Bath();s3=new String(Joy);i=47;toy=3.14f;castille=new Soap();,void print()/Delayed initialization:if(s4=null)s4=new String(Joy);System.out.println(s1=+s1);System.out.println(s2=+s2);System.out.println(s3=+s3);Sys

6、tem.out.println(s4=+s4);System.out.println(i=+i);System.out.println(toy=+toy);System.out.println(castille=+castille);public static void main(String args)Bath b=new Bath();b.print();/:,Ans:Inside Bath()Soap()s1=Happy s2=Happy s3=Joy s4=Joy i=47 toy=3.14 castille=Constructed,继承,使用“extends”关键字,Class A

7、Class B extends A,继承:UML(统一建模语言)(Unified Modeling Language),A,B,构造函数,父类先于子类被初始化,带参数的构造函数,使用“super”调用基类的构造函数,/:Detergent.java(p195)/Inheritance syntax,public class Detergent extends Cleanser/Change a method:public void scrub()append(Detergent.scrub();super.scrub();/Call base-class version/Add methods

8、 to the interface:public void foam()append(foam();/Test the new class:public static void main(String args)Detergent x=new Detergent();x.dilute();x.apply();x.scrub();x.foam();x.print();System.out.println(Testing base class:);Cleanser.main(args);/:,Ans:Cleanser dilute()apply()Detergent.scrub()scrub()f

9、oam()Testing base class:Cleanser dilute()apply()scrub(),Base class 的初始化:由 base class 向外扩散,/:Cartoon.java(p197)/Constructor calls during inheritanceclass Art Art()System.out.println(Art constructor);class Drawing extends Art Drawing()System.out.println(Drawing constructor);,public class Cartoon exten

10、ds Drawing Cartoon()System.out.println(Cartoon constructor);public static void main(String args)Cartoon x=new Cartoon();/:该程序的输出显示了自动调用:Art constructorDrawing constructorCartoon constructor,带参数的构造函数:使用 super,/:Chess.java(p198)/Inheritance,constructors and argumentsclass Game Game(int i)System.out.pr

11、intln(Game constructor);class BoardGame extends Game BoardGame(int i)super(i);/如果注释掉,不能通过编译 System.out.println(BoardGame constructor);,public class Chess extends BoardGame Chess()super(11);System.out.println(Chess constructor);public static void main(String args)Chess x=new Chess();/:Ans:Game constr

12、uctorBoardGame constructorChess constructor,组合&继承,一个继承类也可以包含其它类的对象,DinnerPlate,Plate,Custom,Utensil,Spoon,Fork,Knife,PlaceSetting,/:PlaceSetting.java(p199)/Combining composition,class Utensil Utensil(int i)System.out.println(Utensil constructor);class Spoon extends Utensil Spoon(int i)super(i);Syste

13、m.out.println(Spoon constructor);class Fork extends Utensil Fork(int i)super(i);System.out.println(Fork constructor);,class Knife extends Utensil Knife(int i)super(i);System.out.println(Knife constructor);/A cultural way of doing something:class Custom Custom(int i)System.out.println(Custom construc

14、tor);,public class PlaceSetting extends Custom Spoon sp;Fork frk;Knife kn;DinnerPlate pl;PlaceSetting(int i)super(i+1);sp=new Spoon(i+2);frk=new Fork(i+3);kn=new Knife(i+4);pl=new DinnerPlate(i+5);System.out.println(PlaceSetting constructor);public static void main(String args)PlaceSetting x=new Pla

15、ceSetting(9);/:,Ans:Custom constructorUtensil constructorSpoon constructorUtensil constructorFork constructorUtensil constructorKnife constructorPlate constructorDinnerPlate constructorPlaceSetting constructor,清除,没有象C+中的析构函数自动唤起垃圾回收器(不知何时唤起,不知是否唤起)必须编写一个特定的方法,编写一个特定的方法(p201),public class CADSystem e

16、xtends Shape.-private Line l;.for()-l=new Line(2,4);.void cleanup().-l.cleanup();.,Shape,Circle,Triangle,Line,CADSystem,/:c06:CADSystem.java(p201)/Ensuring proper cleanup.import java.util.*;class Shape Shape(int i)System.out.println(Shape constructor);void cleanup()System.out.println(Shape cleanup);

17、,class Circle extends Shape Circle(int i)super(i);System.out.println(Drawing a Circle);void cleanup()System.out.println(Erasing a Circle);super.cleanup();class Triangle extends Shape Triangle(int i)super(i);System.out.println(Drawing a Triangle);void cleanup()System.out.println(Erasing a Triangle);s

18、uper.cleanup();,class Line extends Shape private int start,end;Line(int start,int end)super(start);this.start=start;this.end=end;System.out.println(Drawing a Line:+start+,+end);void cleanup()System.out.println(Erasing a Line:+start+,+end);super.cleanup();,public class CADSystem extends Shape private

19、 Circle c;private Triangle t;private Line l;CADSystem(int i)super(i+1);l=new Line(2,4j);c=new Circle(1);t=new Triangle(1);System.out.println(Combined constructor);,void cleanup()System.out.println(CADSystem.cleanup();/The order of cleanup is the reverse/of the order of initialization t.cleanup();c.c

20、leanup();l.cleanup();super.cleanup();public static void main(String args)CADSystem x=new CADSystem(47);try/Code and exception handling.finally x.cleanup();/:,Ans:Shape constructorShape constructorDrawing a line:2,4Shape constructorDrawing a CircleShape constructorDrawing a TriangleCombind constructo

21、rCADSystem.cleanup()Erasing a TriangleShape cleanupErasing a CircleShape cleanupErasing a line 2,4Shape cleanupShape cleanup,重载方法,与C+不同基类的重载方法是可见的,名称不被屏蔽(not Name Hiding)(p203),/:Hide.java/Overloading a base-class method name/in a derived class does not hide the/base-class versionsclass Homer char d

22、oh(char c)System.out.println(doh(char);return d;float doh(float f)System.out.println(doh(float);return 1.0f;,class Milhouse class Bart extends Homer void doh(Milhouse m)class Hide public static void main(String args)Bart b=new Bart();b.doh(1);/doh(float)used b.doh(x);b.doh(1.0f);b.doh(new Milhouse()

23、;/:Ans:doh(float)doh(char)doh(float),组合 vs.继承,当一个对象包含其它对象时选择组合:例如,一台计算机包含硬盘,显示器,CPU等当一个对象具有与之相似的其它对象的特点时选择继承:例如,Pentium III 继承并改进了80386的指令集大多数情况下选择组合,protected,private成员随时都是“私有”的,任何人不得访问protected关键字的意思是“它本身是私有的,但可由从这个类继承的任何东西或者同一个包内的其他任何东西访问”Java中的protected会成为进入“友好”状态,向上转型,向上转型(Upcasting):一个继承类向基类转换

24、(将继承类 Reference转为基类 Reference);多态性使用继承时要谨慎,A,B,向上转型,/:c06:Wind.java(p207)/Inheritance/Upcasting:子类对象传给父类函数/:Ans:,Final 关键字,“Final”意味着最终“Final”意味着数据是只读的可应用于字段,方法和类,Final:数据,数据固定不变可以是永不改变的“编译期常量”(compile-time constant)可以在执行期(run-time)被初始化用于基本数据类型:final会将值变成一个常数用于对象reference:final会将reference变成一个常数,进行声明

25、时,必须将引用初始化到一个具体的对象。而且永远不能将引用变成指向另一个对象。,Final:数据,/:c06:FinalData.java(p209)/The effect of final on fields.class Value int i=1;public class FinalData/Can be compile-time constants final int i1=9;static final int VAL_TWO=99;/Typical public constant:public static final int VAL_THREE=39;/Cannot be compil

26、e-time constants:final int i4=(int)(Math.random()*20);static final int i5=(int)(Math.random()*20);,Value v1=new Value();final Value v2=new Value();static final Value v3=new Value();/Arrays:final int a=1,2,3,4,5,6;public void print(String id)System.out.println(id+:+i4=+i4+,i5=+i5);,public static void

27、 main(String args)FinalData fd1=new FinalData();/!fd1.i1+;/Error:cant change value fd1.v2.i+;/Object isnt constant!fd1.v1=new Value();/OK-not final for(int i=0;i fd1.a.length;i+)fd1.ai+;/Object isnt constant!/!fd1.v2=new Value();/Error:Cant/!fd1.v3=new Value();/change reference/!fd1.a=new int3;fd1.p

28、rint(fd1);System.out.println(Creating new FinalData);FinalData fd2=new FinalData();fd1.print(fd1);fd2.print(fd2);/:,Ans:答案有变化fd1:i4=6,i5=14Creating new FinalDatafd1:i4=6,i5=14fd2:i4=13,i5=14,Final:参数,一个方法的 Final 参数是只读的无法令该参数(一个 reference)改指它处,Final:参数,/:c06:FinalArguments.java(p211)/Using final with

29、 method arguments.class Gizmo public void spin()public class FinalArguments void with(final Gizmo g)/!g=new Gizmo();/Illegal-g is final void without(Gizmo g)g=new Gizmo();/OK-g not final g.spin();,/void f(final int i)i+;/Cant change/You can only read from a final primitive:int g(final int i)return i

30、+1;public static void main(String args)FinalArguments bf=new FinalArguments();bf.without(null);bf.with(null);/:Ans:,Final:方法,锁住这个函数,在继承类中是不能改变的效率,转化为 inline 调用,Final 和 private,一个类中的所有private方法本身就是final,Final:类,不能从final类中继承Final类中的所有方法都是“final”,/:c06:Jurassic.java(p214)/Making an entire class final.c

31、lass SmallBrain final class Dinosaur int i=7;int j=1;SmallBrain x=new SmallBrain();void f()/!class Further extends Dinosaur/error:Cannot extend final class Dinosaurpublic class Jurassic public static void main(String args)Dinosaur n=new Dinosaur();n.f();n.i=40;n.j+;/:Ans:,Final 警告,使用“final”时要谨慎其它代码可

32、能希望继承你的类,Class 装载,JVM的函数当需要时载入类,继承与初始化,对包括继承在内的整个初始化过程有所认识:执行Beetle,发生的第一件事情是企图取用Beetle.main()装载程序启动,找出 Beetle class 编译过的程序代码由于 extends 存在,又找出 Insect class基类(此时是Insect)执行static初始化,再在下一个子类(Beetle)执行static初始化,以此类推必要的类已全部装载完毕,所以能够创建对象对象中的所有基本类型都会设成它们的默认值,而将对象引用设为null随后调用基类构造函数(数据成员初始化,其余部分)最后调用子类构造函数(数

33、据成员初始化,其余部分),/:c06:Beetle.java(p216)/The full process of initialization.class Insect int i=9;int j;Insect()prt(i=+i+,j=+j);j=39;static int x1=prt(static Insect.x1 initialized);static int prt(String s)System.out.println(s);return 47;,public class Beetle extends Insect int k=prt(Beetle.k initialized);

34、Beetle()prt(k=+k);prt(j=+j);static int x2=prt(static Beetle.x2 initialized);public static void main(String args)prt(Beetle constructor);Beetle b=new Beetle();/:,Ans:static Insect.x1 initialized static Beetle.x2 initialized Beetle costructori=9,j=0Beetle.k initializedk=47i=39Ans:将 int x1 和 int x2 前的 static 注释掉Beetle costructorstatic Insect.x1 initializedi=9,j=0Beetle.k initialized static Beetle.x2 initialized k=47i=39,作业,阅读第 6 章第 6 章,题 4,5,9,14,23,谢谢,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号