[高等教育]第4章类的重用.ppt_第1页
[高等教育]第4章类的重用.ppt_第2页
[高等教育]第4章类的重用.ppt_第3页
[高等教育]第4章类的重用.ppt_第4页
[高等教育]第4章类的重用.ppt_第5页
已阅读5页,还剩172页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第4章 类的重用,Page 2,目录,4.1 类的继承 4.2 Object类 4.3 终结类与终结方法 4.4 抽象类 4.5 类的组合 4.6 包的应用 4.7 本章小结,Page 3,4.1 类的继承,4.1.1 继承的概念 1. 继承的概念 继承是一种由已有的类创建新类的机制,是面向对象程序设计的基石之一。 通过继承,可以根据已有类来定义新类,新类拥有已有类的所有功能。 基类(base class):也称超类(superclass)或者父类,是被直接或间接继承的类。 派生类(derived-class):也称子类(subclass),是继承其他类而得到的类。继承所有父类的状态和行为,派

2、生类可以增加变量和方法,派生类也可以覆盖(override)继承的方法。,Page 4,父类是所有子类的公共属性及方法的集合,子类则是父类的特殊化。 子类只需指明新类与现有类的不同,即增加自己的属性和方法即可。 继承介于类之间,而不是对象之间。 Java要求每个类都有父类,当没有显式指定父类时,父类隐含为java.lang包的Object类。 Java不支持类的多重继承,只支持类的单继承,即每个子类只能有一个直接父类。一个父类可以派生出多个子类。 一个对象从其所有的父类中继承属性及行为。,Page 5,在类层次结构中,子类与父类的关系是子类对象与父类对象存在“IS A”(或 “is kind

3、of”)的关系。,Page 6,图4-1 动物类层次举例,爬行动物是动物的一种,壁虎是一种蜥蜴,Page 7,又一例子,Page 8,图4-2 错误的继承关系,汽车与发动机、车身的关系不是“is a”的关系,而是”has a”的关系。,Page 9,2. 继承的意义 采用继承的机制来组织、设计系统中的类,可以提高程序的抽象程度,使之更接近于人类的思维方式。 采用继承编写的程序结构清晰,节省了编程时间,因为代码的编写量减少,因此也降低了维护的工作量。,Page 10,4.1.2 继承的语法 继承的语法格式: ClassModifier class childClass extends paren

4、tClass implements interface /类体 说明 关键字extends说明要声明的类需要继承的父类; parentClass是被继承的父类名称。,Page 11,派生类成员 继承基类声明为public 或protected 的成员。 如果基类和派生类在同一个包中,派生类可以继承基类没有访问权限标志符的(缺省的)成员。 如果派生类某成员名和基类某成员名同名,派生类同名变量成员隐藏基类成员,派生类同名方法成员覆盖基类成员。,Page 12,例4-1 在一个公司中,有普通员工(Employees)及管理者(Managers)两类人员。 职员对象(Employees)可能有的属性信

5、息包括: 员工号(employeeNumber)、姓名(name)、 地址(address)、电话号码(phoneNumber)。 管理者(Managers)除具有普通员工的属性外,还可能具有下面的属性: 职责(responsibilities)、所管理的职员(listOfEmployees)。 可设计Employee及Manager两个类,将Manager类作为Employee类的子类。,Page 13,Employee与Manager的类图,Page 14,/父类Employee class Employee int employeeNumbe ; String name, address

6、, phoneNumber ; /子类Manager class Manager extends Employee /子类增加的数据成员 String responsibilities, listOfEmployees; ,Page 15,例4-2 公有(及保护)属性及行为成员的继承。 设有三个类:Person, Employee, Manager。 其类层次如图4-4所示:,图4-4 类层次,Page 16,public class Person /Person类定义 public String name; public String getName( ) return name; publ

7、ic class Employee extends Person /Employee类定义 public int employeeNumber; public int getEmployeeNumber( ) return employeeNumber; public class Manager extends Employee /Manager类定义 public String responsibilities; public String getResponsibilities( ) return responsibilities; ,Page 17,public class Ex4_2T

8、est /测试类 public static void main(String args) Employee li = new Employee( ); = Li Ming; li.employeeNumber = 123456; System.out.println(li.getName( ); System.out.println(li.getEmployeeNumber( ); Manager he = new Manager( ); = He Xia; he.employeeNumber = 543469; he.responsibilities = I

9、nternet project; System.out.println(he.getName( ); System.out.println(he.getEmployeeNumber( ); System.out.println(he.getResponsibilities( ); ,Page 18,结论:子类的对象可以使用其父类中声明为公有(及保护)的属性和方法,就如同在其自己的类中声明一样。,Page 19,例4-3 私有成员的继承。 public class B public int a = 10; private int b = 20; protected int c = 30; pub

10、lic int getB( ) return b; public class A extends B public int d; public void tryVariables( ) System.out.println(a); /允许 System.out.println(b); /不允许 System.out.println(getB( ); /允许 System.out.println(c); /允许 ,Page 20,对类A进行编译 系统会提示编译错误:“A.java:7: b has private access in B” 说明 b是从类继承来的,由于b是私有属性,不能在A类中直

11、接存取,但可以使用继承来的共有方法getB( )取得。 结论:子类不能直接访问从父类中继承的私有属性及方法,但可使用公有(及保护)方法进行访问。,Page 21,4.1.3 隐藏和覆盖,隐藏和覆盖 是指子类对从父类继承来的属性变量及方法可以重新加以定义。,class Parent int num; void set(int n) num=n; ,class Child extends Parent int num; void set(int n) num=n; num+=10; ,Page 22,1. 属性的隐藏(hidden) 子类对从父类继承来的属性变量重新加以定义,则从父类继承的属性将被

12、隐藏。 子类拥有了两个相同名字的变量,一个继承自父类,另一个由自己声明。 当子类执行继承自父类的操作时,处理的是继承自父类的变量,而当子类执行它自己声明的方法时,所操作的就是它自己声明的变量,而把继承自父类的变量“隐藏”起来了 。,Page 23,如何访问被隐藏的父类属性,两种方法: 调用从父类继承的方法,则操作的是从父类继承的属性。 使用super.属性,Page 24,例4-4 属性的隐藏举例。已知三个类:电话卡类(PhoneCard)、有卡号的电话卡(Number_PhoneCard)、200卡(D200_Card)。,类层次结构图,Page 25,class PhoneCard /电话

13、卡类 double balance; /余额 boolean performDial( ) ; /拨打电话 double getBalance( ) return balance; /获取余额 ,Page 26,/有卡号的电话卡类 class Number_PhoneCard extends PhoneCard long cardNumber; /卡号 int password; /密码 String connectNumber; /连接号码 boolean connect; /是否连接上 boolean performDial( ) ; /方法覆盖 double getBalance( )

14、return balance; /方法覆盖 ,Page 27,class D200_Card extends Number_PhoneCard final double additoryFee=0; /附加费 double balance; /属性隐藏,与父类的成员相同 boolean performDial( ) /方法覆盖 if(balance(0.5+additoryFee) balance-=0.5+additoryFee; return true; else return false; double getBalance( ) return balance; /方法覆盖 double

15、 getSuperBalance( ) return super.balance; ,Page 28,public class Ex4_4 /测试类 public static void main(String args ) D200_Card d=new D200_Card( ); d.balance=10; d.performDial( ); System.out.println(d.getBalance( ); System.out.println(d.getSuperBalance( ); ,运行结果: 9.5 0.0,Page 29,例4-5 属性的隐藏举例2。,class B1 e

16、xtends A1 int x=100; void printb( ) super.x = super.x +10 ; System.out.println (super.x= + super.x+ x= + x); ,class A1 int x = 2; public void setx(int i) x = i; void printa( ) System.out.println(x); ,Page 30,public class Ex4_4Test /测试类 public static void main(String args) A1 a1 = new A1( ); a1.setx(

17、4); a1.printa( ); B1 b1 = new B1( ); b1.printb( ); b1.printa( ); b1.setx(6); / 将继承来的x值设置为6 b1.printb( ); b1.printa( ); a1.printa( ); ,输出结果: 4,输出结果: super.x= 12 x= 100 12,输出结果: super.x= 16 x= 100 16 4,Page 31,子类不能继承父类中的静态属性,但可以对父类中的静态属性进行操作。如在上面的例子中,将“int x = 2;”改为“static int x = 2;”,再编译及运行程序,会得到下面的结

18、果:,4 / a1.printa( );”输出的结果 super.x= 14 x= 100 14 super.x= 16 x= 100 16 16 /a1.printa( );”输出的结果,Page 32,2.方法覆盖(重写): Overriding 如果子类不需使用从父类继承来的方法的功能,则可以声明自己的同名方法,称为方法覆盖。 覆盖方法的返回类型、方法名称、参数的个数及类型必须和被覆盖的方法一模一样。 只需在方法名前面使用不同的类名或不同类的对象名即可区分覆盖方法和被覆盖方法。 覆盖方法的访问权限可以比被覆盖的宽松,但是不能更为严格。,Page 33,方法覆盖的应用场合 (1)子类中实现

19、与父类相同的功能,但采用不同的算法或公式。,例如,在例4-1中的Employee类中定义以下方法 用于计算月工资。 public float computePay( ) return (yearSalary/12f); ,在Manager类中重写computePay方法: public float computePay( ) return (regularHoursWorked*payRate)+(overTimeHoursWorked*1.5f*payRate); ,Page 34,(2)在名字相同的方法中,要做比父类更多的事情。 例如,银行账号分为普通账号BankAccount、存款账号(

20、SavingAccount)及支票账号(CheckingAccount) 它们之间的关系如图4-6所示。,图4-6 类层次关系,Page 35,假设BankAccount类定义了取款方法如下: public void withdraw(float anAmount) balance-=anAmount; ,现在其子类CheckingAccount重写该方法如下: public void withdraw(float amount) super.withdraw(amount+1.25f); ,Page 36,(3)在子类中需要取消从父类继承的方法。 假设要在SuperSavingAccount

21、类中取消从BankAccount类继承来的取款方法,则重写为: public void withdraw(float amount) /Do Nothing,方法体为空 ,Page 37,方法覆盖的注意事项 (1)必须覆盖的方法 派生类必须覆盖基类中的抽象的方法,否则派生类自身也成为抽象类。 (2)不能覆盖的方法 基类中声明为final的终结方法。 基类中声明为static 的静态方法。,Page 38,class Super int num; public int getNum( ) return num; ,class Sub extends Super int num; public i

22、nt getSuperNum1( ) return super.num; public int getSuperNum2( ) return super.getNum( ); ,从子类访问父类被隐藏的成员变量,方法为:super.成员变量名; 例如,super.num 在子类中调用父类被覆盖的方法,格式如下: super.overriddenMethodName(params );,super关键字的用法:,Page 39,方法覆盖(重写)与方法重载的异同,相同点: 1)都要求方法同名。 2)都可以用于抽象方法和非抽象方法之间。 不同点: 1)方法覆盖要求参数签名(参数个数、类型、顺序)必须一

23、致,而方法重载要求参数签名必须不一致。 2)方法覆盖要求返回类型必须一致,而方法重载对此不做限制。 3)方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类的所有方法(包括从父类中继承而来的方法)。,Page 40,4)方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。 方法覆盖要求子类方法的访问权限不能小于父类的访问权限,一般与父类中声明的访问权限相同。 若父类抛出异常,则子类可以抛出异常,也可以不抛出异常;但若父类未抛出异常,则子类不能抛出异常。 5)父类的一个方法只能被子类覆盖一次,而一个方法在所在的类中可以被重载多次。,Page 41,以下子类Sub

24、覆盖了父类Base的method(int v) 方法, 并且提供了多种重载方法。 public class Base protected void method(int v) private void method(String s) /重载 public abstract class Sub extends Base public void method(int v) /覆盖 public int method(int v1,int v2) return 0; /重载 protected void method(String s) throws Exception /重载 abstract

25、void method( ); /重载 ,Page 42,4.1.4 有继承时的构造方法,有继承时的构造方法遵循以下的原则: 子类不能从父类继承构造方法。 好的程序设计方法是在子类的构造方法中调用某一个父类构造方法,调用语句必须出现在子类构造方法的第一行,可使用super关键字。 如果子类构造方法的声明中没有明确调用父类构造方法,则系统在执行子类的构造方法时会自动调用父类的缺省构造方法(即无参的构造方法)。,Page 43,例4-6 有继承时的构造方法举例。 public class Person /父类 protected String name, phoneNumber, address;

26、 public Person( ) /无参构造方法 this(, , ); public Person(String aName,String aPhoneNumber, String anAddress) /带参构造方法 name=aName; phoneNumber=aPhoneNumber; address=anAddress; ,Page 44,public class Employee extends Person /子类 protected int employeeNumber; protected String workPhoneNumber; public Employee(

27、) /此处隐含调用父类Person的构造方法 Person( ) this(0, ); public Employee(int aNumber, String aPhoneNumber) /此处隐含调用父类Person的构造方法 Person( ) employeeNumber=aNumber; workPhoneNumber = aPhoneNumber; ,Page 45,public class Professor extends Employee protected String research; public Professor( ) super( ); /显式调用父类的默认构造方

28、法 research = ; public Professor(int aNumber, String aPhoneNumber, String aResearch) super(aNumber, aPhoneNumber); research = aResearch; ,Page 46,无参数的构造方法: class Art Art( ) System.out.println(Art constructor); class Drawing extends Art Drawing( ) System.out.println(Drawing constructor); public class

29、Cartoon extends Drawing Cartoon( ) System.out.println(Cartoon constructor); public static void main(Stringargs) Cartoon x = new Cartoon( ); ,输出结果: Art constructor Drawing constructor Cartoon constructor,Page 47,有参数的构造方法: class Game Game(int i) System.out.println(Game constructor); class BoardGame ex

30、tends Game BoardGame(int i) super(i); System.out.println(BoardGame constructor); ,问题1:去掉该语句会出现错误吗?,Page 48,public class Chess extends BoardGame Chess( ) super(11); System.out.println(Chess constructor); public static void main(String args) Chess x = new Chess( ); ,输出结果: Game constructor BoardGame co

31、nstructor Chess constructor,问题2:去掉该语句会出现错误吗?,Page 49,4.1.5 应用举例 在一个公司管理信息系统中,包括 普通员工(Employees),其可能有的属性信息包括 员工号(employeeNumber) 姓名(name) 地址(address) 电话号码(phoneNumber) 管理者(Magagers),除具有普通员工所具有的属性及行为外,还具有下面的属性和行为 职责(responsibilities) 所管理的职员(listOfEmployees) 工资的计算方法与一般员工不同;福利与一般员工不同 顾客(Customers),可能有的属

32、性信息包括: 姓名(name)、地址(address)、电话号码(phoneNumber),Page 50,类层次结构,Page 51,4.2 Object 类,Object类 在java.lang包 Java程序中所有类的直接或间接父类,类库中所有类的父类,处在类层次最高点。 包含了所有Java类的公共属性,其构造方法是Object( )。,Page 52,Object类定义了所有对象必须具有的状态和行为,较主要的方法如下: public final Class getClass( ) 获取当前对象所属的类信息,返回Class对象 public String toString( ) 返回当前

33、对象本身的有关信息 public boolean equals(Objectobj) 比较两个对象是否是同一对象,是则返回true protected Object clone( ) 生成当前对象的一个拷贝,并返回这个复制对象 public int hashCode( ) 返回该对象的哈希代码值 protected void finalize( ) throws Throwable 定义回收当前对象时所需完成的资源释放工作,Page 53,1. 相等和同一 如果两个对象具有相同的类型及相同的属性值,则称二者相等(equal)。 如果两个引用变量指向的是同一个对象,则称这两个变量(对象)同一(i

34、dentical)。 两个对象同一,则肯定相等。 两个对象相等,不一定同一。 等号“=” 判断的是这两个对象是否同一。,Page 54,例4-8 判断两个对象是否同一。 public class Ex4_7 public static void main(String args) BankAccount a = new BankAccount(Bob, 123456, 100.00f); BankAccount b = new BankAccount(Bob, 123456, 100.00f); if (a = b) System.out.println(YES); else System.o

35、ut.println(NO); ,运行结果:NO,Page 55,修改例4-7的程序 public class Ex4_7 public static void main(String args) BankAccount a = new BankAccount(Bob, 123456, 100.00f); BankAccount b = a; if (a = b) System.out.println(YES); else System.out.println(NO); ,运行结果:YES,Page 56,2. Object类中的equals( ) 方法 由于Object是类层次结构中的树根节

36、点,因此所有其他类都继承了equals( )方法。 Object类中的 equals( ) 方法的定义如下,可见,也是判断两个对象是否同一。 public boolean equals(Object x) return this = x; ,Page 57,例4-9 Object类中equals方法的使用举例。 public class EqualsTest public static void main(String args) BankAccount a = new BankAccount(Bob, 123456, 100.00f); BankAccount b = new BankAcc

37、ount(Bob, 123456, 100.00f); if (a.equals(b) System.out.println(YES); else System.out.println(NO); ,/等价于a=b,由于不是同一对象,运行结果仍然是“NO”,Page 58,3. equlas方法的重写 要判断两个对象各个属性域的值是否相同,则不能使用从Object类继承来的equals方法,而需要在类声明中对equals方法进行重写。 String类中已经重写了Object类的equals方法,可以判别两个字符串是否内容相同。,Page 59,在BankAccount类中增加equals方法,由

38、于是对Object类中的equals方法进行重写,因此方法定义头必须与Object类中的equals方法完全相同。,public boolean equals(Object x) if (this.getClass( ) != x.getClass( ) /类型不同 return false; BankAccount b = (BankAccount) x; return (this.getOwnerName( ).equals(b.getOwnerName( ) ,Page 60,例4-10 equals方法的应用举例。 public class Apple private String c

39、olor; private boolean ripe; public Apple(String aColor, boolean isRipe) color = aColor; ripe = isRipe; public void setColor(String aColor) color = aColor; public void setRipe(boolean isRipe) ripe = isRipe; ,Page 61,public String getColor( ) return color; public boolean getRipe( ) return ripe; public

40、 String toString( ) if (ripe) return(A ripe + color + apple); else return(A not so ripe + color + apple); public boolean equals(Object obj) if (obj instanceof Apple) Apple a = (Apple) obj; return (color.equals(a.getColor() ,Page 62,public class AppleTester public static void main(String args) Apple

41、a = new Apple(red, true); Apple b = new Apple(red, true); System.out.println(a + is equal to + b + : + a.equals(b); System.out.println(a is identical to b: + (a = b); Apple c = a; System.out.println(a + is equal to + c + : + a.equals(c); System.out.println(a is identical to c: + (a = c); ,Page 63,运行

42、结果 A ripe red apple is equal to A ripe red apple: true a is identical to b: false A ripe red apple is equal to A ripe red apple: true a is identical to c: true,Page 64,Clone方法 根据已存在的对象构造一个新的对象。 在根类Object 中被定义为protected,所以需要覆盖为protected。,在例4-10的Apple类中增加Clone方法,代码如下: protected Object clone( ) Apple a

43、napple=new Apple(this.color,this.ripe); return anapple; 另外:在main方法中增加如下代码: Apple d=(Apple)a.clone( ); System.out.println(a is identical to d: +(a=d); System.out.println(a is equal to d: +(a.equals(d);,输出: false true,Page 65,若把clone( )方法改为 protected Object clone( ) Apple anapple=this; return anapple;

44、 Apple d=(Apple)a.clone( ); System.out.println(a is identical to d: +(a=d); System.out.println(a is equal to d: +(a.equals(d);,输出: true true,Page 66,finalize方法 在对象被垃圾回收器回收之前,系统自动调用对象的finalize方法。该方法类似于C+语言的析构函数。 finalize的方法头protected void finalize( ) 。 如果要覆盖finalize方法,覆盖方法的最后必须调用super.finalize( )。 tr

45、y super.finalize( ); catch(Throwable e) System.out.println(e); ,Page 67,getClass方法 方法头:public final Class getClass( ) ,返回一个Class对象,用来代表对象隶属的类。 通过Class 对象,可以查询Class对象的各种信息:比如它的名字、它的基类、它所实现接口的名字等。 void PrintClassName(Object obj) System.out.println(The Objects class is + obj.getClass( ).getName( ) + nI

46、ts SupperClass is + obj.getClass( ). getSuperclass( ); ,Page 68,notify、notifyAll、wait方法 final方法,不能覆盖 public final void notify( ) public final void notifyAll( ) public final void wait(longtimeout) throws InterruptedException public final void wait(longtimeout, intnanos) throws InterruptedException pu

47、blic final void wait( ) throws InterruptedException 这三个方法主要用在多线程程序中,Page 69,4.3 终结类与终结方法,终结类与终结方法 被final修饰符修饰的类和方法。 终结类不能被继承。 终结方法不能被当前类的子类重写。,Page 70,4.3.1 终结类,终结类的特点 不能有派生类。 终结类存在的理由 安全: 黑客用来搅乱系统的一个手法是建立一个类的派生类,然后用他们的类代替原来的类。 设计: 你认为你的类是最好的或从概念上你的类不应该有任何派生类。,Page 71,声明ChessAlgorithm 类为final 类 fina

48、l class ChessAlgorithm . . . 如果编写如下程序: class BetterChessAlgorithm extends ChessAlgorithm 编译器将显示一个错误 BetterChessAlgorithm.java:6: Cannot inherit froms final ChessAlgorithm,Page 72,终结方法的特点 不能被派生类覆盖(重写)。 终结方法存在的理由 对于一些比较重要且不希望子类进行更改的方法,可以声明为终结方法。可防止子类对父类关键方法的错误重写,增加了代码的安全性和正确性。 提高运行效率。对于final方法,Java编译器

49、可以将该方法的字节码直接放到调用它的程序中。,4.3.2 终结方法,Page 73,例4-11 final 方法举例。 class Parent public Parent( ) /构造方法 final int getPI( ) return Math.PI; /最终方法 ,class Child extends Parent public Child( ) /构造方法 int getPI( ) return 3.14; /重写父类中的终结方法,不允许 ,Page 74,4.4 抽象类,4.4.1 抽象类的声明 抽象类的概念 代表一个抽象概念的类。 没有具体实例对象的类,不能使用new方法进行

50、实例化。 类前需加修饰符abstract。 可包含常规类能够包含的任何东西,例如构造方法,非抽象方法。 也可包含抽象方法,这种方法只有方法的声明,而没有方法的实现。,Page 75,存在意义 抽象类是类层次中较高层次的概括,抽象类的作用是让其他类来继承它的抽象化的特征。 抽象类中可以包括被它的所有子类共享的公共行为。 抽象类可以包括被它的所有子类共享的公共属性。 在程序中不能用抽象类作为模板来创建对象。 在用户生成实例时强迫用户生成更具体的实例,保证代码的安全性。,Page 76,几何形状的例子 将所有图形的公共属性及方法抽象到抽象类 Shape。再将2D及3D对象的特性分别抽取出来, 形成两

51、个抽象类TwoDimensionalShape及 ThreeDimensionalShape 2D图形包括Circles、Triangles、Rectangles和Squares。 3D图形包括Cube、Sphere、或Tetrahedron。 在UML中,抽象类的类名为斜体,以与具体类相区别。,Page 77,Page 78,抽象类声明的语法形式为 abstract class className . . . 例如: abstract class Number . . . 如果写: new Number( ); 编译器将显示错误,Page 79,4.4.2 抽象方法,抽象方法 仅有方法头,而

52、没有方法体和操作实现。 声明的语法形式为 public abstract (.); 具体实现由当前类的不同子类在它们各自的类声明中完成。 抽象类可以包含抽象方法。,Page 80,需注意的问题 一个抽象类的子类如果不是抽象类,则它必须为父类中的所有抽象方法书写方法体,即重写父类中的所有抽象方法。 只有抽象类才能具有抽象方法,即如果一个类中含有抽象方法,则必须将这个类声明为抽象类。 除了抽象方法,抽象类中还可以包括非抽象方法。 不可以将abstract与static、native、synchronized合用。,Page 81,抽象方法的优点 隐藏具体的细节信息,使调用该方法的程序不必过分关注该

53、类和它的各子类的内部状况。 所有的子类使用的都是相同的方法头,而方法头里实际包含了调用该方法的程序语句需要了解的全部信息。 强迫子类完成指定的行为,抽象类的所有非抽象子类都必须完成其父类中声明的抽象方法,抽象类通常声明抽象方法规定其子类需要用到的“标准”行为。,Page 82,一个绘图的例子 各种图形都需要实现绘图方法,可在它们的抽象父类 中声明一个draw抽象方法。 abstract class GraphicObject int x, y; void moveTo(int newX, int newY) . . . abstract void draw( ); ,Page 83,然后在每一

54、个子类中重写draw方法,例如: class Circle extends GraphicObject void draw( ) . . . class Rectangle extends GraphicObject void draw( ) . . . ,Page 84,例4-12:贷款(Loan)分为许多种类,如租借(Lease)、抵押(Mortgage)、房屋贷款(HouseLoan)、汽车贷款(CarLoan)等。,Page 85,public abstract class Loan /抽象方法,计算月还款值 public abstract float calculateMonthly

55、Payment( ); /抽象方法,还款 public abstract void makePayment(float amount); /非抽象方法,取得客户信息 public Client getClientInfo( ) ,Page 86,补充例子:抽象的电话卡类,abstract class PhoneCard /自定义抽象类 double balance; abstract void performDial( ); /抽象方法,拨打电话 double TimeLeft( ) double current = balance; int times = 0; do performDial

56、( ); times+; while(balance=0); balance = current; return times-1; ,/非抽象方法, 计算当前余额 能拨打的电话 次数。,Page 87,/抽象类的子类PhoneCard200 class PhoneCard200 extends PhoneCard static long nextCardNumber; static final String connectNumber = 200; static double additoryFee; long cardNumber; int password; boolean connect

57、ed; static /静态初始化器 nextCardNumber = 2001800001; additoryFee = 0.1; ,Page 88,PhoneCard200(double ib) /构造方法 cardNumber = nextCardNumber+; balance = ib; void performDial( ) /对父类中抽象方法的实现 balance -= 0.5+additoryFee; / PhoneCard200 类定义结束,Page 89,/抽象类的子类IC_Card class IC_Card extends PhoneCard IC_Card(doubl

58、e ib) /构造方法 balance = ib; void performDial( ) /对父类中抽象方法的实现 balance -= 0.9; ,Page 90,public class PhoneCardTester /主类 public static void main(String args) PhoneCard200 my200 = new PhoneCard200(50.0); IC_Card myIC = new IC_Card(50.0); System.out.println(200卡可以拨打+ my200.TimeLeft( )+次电话。); System.out.pr

59、intln(IC 卡可以拨打+ myIC.TimeLeft( )+ 次电话。); ,运行结果: 200卡可以拨打83.0次电话。 IC 卡可以拨打55.0 次电话。,Page 91,4.5 类的组合,类的组合 面向对象编程的一个重要思想就是用软件对象来模仿现实世界的对象。 现实世界中,大多数对象由更小的对象组成。 与现实世界的对象一样,软件中的对象也常常是由更小的对象组成。 Java的类中可以有其他类的对象作为成员,这便是类的组合。,Page 92,4.5.1 组合的语法,组合的语法很简单,只要把已存在类的对象放到新类中即可。可以使用“has a”语句来描述这种关系。 例如, “my kitc

60、hen has a cooker/refrigerator”,可把对象myCooker和myRefrigerator放在类Kitchen中。 格式如下: class Cooker / 类的语句 class Refrigerator / 类的语句 class Kitchen Cooker myCooker; Refrigerator myRefrigerator; ,Page 93,例4-12 类组合举例。 一条直线是由两个点组成的,代码如下: public class Point /点类 private int x, y; /coordinate public Point(int x, int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论