1、第四章第四章 类的重用类的重用JAVA语言程序设计清华大学 郑莉JAVA语言程序设计2目录目录l4.1 类的继承类的继承l4.2 Object类类 l4.3 终结类与终结方法终结类与终结方法l4.4 抽象类抽象类l4.5 类的组合类的组合 l4.6 包的应用包的应用l4.7 本章小结本章小结清华大学 郑莉JAVA语言程序设计34.1 类的继承类的继承l继承是一种由已有的类创建新类的机制继承是一种由已有的类创建新类的机制l父类是所有子类的公共属性及方法的集合,子类父类是所有子类的公共属性及方法的集合,子类则是父类的特殊化则是父类的特殊化,子类根据需要增加它自己的子类根据需要增加它自己的新的状态和
2、行为。新的状态和行为。lJava只支持类的单继承,每个子类只能有一个直只支持类的单继承,每个子类只能有一个直接父类接父类l继承机制可以提高程序的抽象程度,提高代码的继承机制可以提高程序的抽象程度,提高代码的可重用性可重用性l在在Java中每个类均为中每个类均为Object 的子类。的子类。(java.lang)清华大学 郑莉JAVA语言程序设计4一、一、继承的概念继承的概念基类和派生类基类和派生类l基类基类(base class)也称超类、父类(superclass)是被直接或间接继承的类l派生类派生类(derived-class)也称子类(subclass)继承其他类而得到的类 继承所有祖先
3、的状态和行为 派生类可以增加变量和方法 派生类也可以覆盖(override)继承的方法清华大学 郑莉JAVA语言程序设计5一、一、继承的概念继承的概念is_a关系关系l子类对象与父类对象存在子类对象与父类对象存在“IS A”(或或“is kind of”)的关系的关系清华大学 郑莉JAVA语言程序设计6l动物类层次举例动物类层次举例一、一、继承的概念继承的概念举例举例一般具体动物蛇蜥蜴鲸爬行动物哺乳动物狗巨蜥 壁虎壁虎 是一种 蜥蜴 爬行动物是 动物的 一种清华大学 郑莉JAVA语言程序设计7l错误的基础关系(错误的基础关系(HAS A)汽车发动机制动装置清华大学 郑莉JAVA语言程序设计8二
4、、二、子类声明子类声明l在类的声明中,通过使用关键字在类的声明中,通过使用关键字extends来创建一个类的子类,格式来创建一个类的子类,格式如下如下:class childClass extends parentClass/类体清华大学 郑莉JAVA语言程序设计9l在一个公司中,有普通员工(在一个公司中,有普通员工(Employees)及管及管理人员(理人员(Magagers)两类人员两类人员 普通员工对象(Employees)可能有的属性信息包括l员工号(employeeNumber)l姓名(name)l地址(address)l电话号码(phoneNumber)管理人员(Managers)
5、除具有普通员工的属性外,还可能具有下面的属性l职责(responsibilities)l所管理的职员(listOfEmployees)三、三、子类的继承性子类的继承性 类的设计举例清华大学 郑莉JAVA语言程序设计10lEmployee与与Manager的类图的类图三、三、子类的继承性子类的继承性 类的设计举例EmployeeemployeeNumbe:intname:Stringaddress:StringphoneNumber:StringManagerresponsibilities:StringlistOfEmployees:String父类父类子类子类清华大学 郑莉JAVA语言程序设
6、计11/父类父类Employeeclass Employee int employeeNumbe;String name,address,phoneNumber;public void work();/子类子类Managerclass Manager extends Employee /子类增加的成员变量 String responsibilities,listOfEmployees;EmployeeemployeeNumbe:intaddress:StringphoneNumber:Stringwork():voidManagerresponsibilities:Stringmanage()
7、:voidpersonName:String清华大学 郑莉JAVA语言程序设计13三、三、子类的继承性子类的继承性l类可以有两种重要的成员类可以有两种重要的成员 成员变量 成员方法l子类的成员中有一部分是子类自己声子类的成员中有一部分是子类自己声明定义的,另一部分是从它的父类继明定义的,另一部分是从它的父类继承的承的l子类继承父类可分两种情况子类继承父类可分两种情况 子类与父类同在一个包中 子类与父类不在同一个包中 清华大学 郑莉JAVA语言程序设计14子类和父类在同一包中的继承性 l如果子类和父类在同一个包中,那么,子如果子类和父类在同一个包中,那么,子类自然地继承了其父类中不是类自然地继承
8、了其父类中不是private的成的成员变量作为自己的成员变量,并且也自然员变量作为自己的成员变量,并且也自然地继承了父类中不是地继承了父类中不是private的方法作为自的方法作为自己的方法己的方法,继承的成员变量或方法的访问权继承的成员变量或方法的访问权限保持不变。限保持不变。l例子:例子:workspace/inherite/Example4_15.java 清华大学 郑莉JAVA语言程序设计15public class Father private int money;float weight,height;String head,hand,foot;void speak(String
9、s)System.out.println(s);public class Son extends Father String hobby;public class Example4_15 public static void main(String args)Son boy;boy=new Son();boy.weight=1.80f;boy.height=120f;boy.head=一个头一个头;boy.hand=两只手两只手;boy.foot=两只脚两只脚;boy.hobby=喜欢上网,有时上课还睡觉:)喜欢上网,有时上课还睡觉:);boy.speak(我是儿子我是儿子);System.o
10、ut.println(boy.hand+n+boy.foot+“n”+boy.head+“n”+“身高:身高:+boy.weight+boy.height+n+boy.hobby);子类不能继承子类不能继承子类新增属性我是儿子我是儿子两只手两只手 两只脚两只脚一个头一个头身高:身高:1.8120喜欢上网,有时上课还睡喜欢上网,有时上课还睡觉:)觉:)清华大学 郑莉JAVA语言程序设计16子类和父类不在同一包中的继承性 l如果子类和父类不在同一个包中,子如果子类和父类不在同一个包中,子类类可继承可继承父类的父类的protected、public成员变量做为子类的成员变量,并且成员变量做为子类的成
11、员变量,并且可继承父类的可继承父类的protected、public方方法为子类的方法法为子类的方法,继承的成员变量或继承的成员变量或方法的访问权限保持不变。方法的访问权限保持不变。l如果子类和父类不在同一个包中,子如果子类和父类不在同一个包中,子类类不能继承不能继承父类的父类的友好变量友好变量和和友好方友好方法法。清华大学 郑莉JAVA语言程序设计17例子:例子:Example4/inherite/ABC.java Example4/DEF.javapackage inherite;public class ABC protected int pro_i=5;protected void s
12、how()System.out.println(pro_i=+pro_i);import inherite.ABC;class DEF extends ABC public static void main(String agrs)DEF def=new DEF();System.out.println(def.pro_i);def.pro_i=10;def.show();如果变量如果变量pro_i不加访问权限,不加访问权限,会出现什么会出现什么情况?情况?Error:pro_i在在ABC.java中不是公共的,中不是公共的,无法从外部软件包中进行访问无法从外部软件包中进行访问清华大学 郑莉J
13、AVA语言程序设计18public class Person public String name;public String getName()return name;public class Employee extends Person public int employeeNumber;public int getEmployeeNumber()return employeeNumber;public class Manager extends Employee public String responsibilities;public String getResponsibiliti
14、es()return responsibilities;4.1.2 继承的语法继承的语法(续续)例例4_2 类的继承清华大学 郑莉JAVA语言程序设计19public class Exam4_2Test public static void main(String args)Employee li=new Employee();li.name=Li Ming;li.employeeNumber=123456;System.out.println(li.getName();System.out.println(li.getEmployeeNumber();Manager he=new Manag
15、er();he.name=He Xia;he.employeeNumber=543469;he.responsibilities=Internet project;System.out.println(he.getName();System.out.println(he.getEmployeeNumber();System.out.println(he.getResponsibilities();4.1.2 继承的语法继承的语法(续续)例例4_2测试测试 类的继承清华大学 郑莉JAVA语言程序设计20l运行结果运行结果Li Ming123456He Xia543469Internet proj
16、ectl说明说明 子类不能直接访问从父类中继承的私有属性及方法,但可使用公有(及保护)方法进行访问4.1.2 继承的语法继承的语法(续续)例例4_2测试结果测试结果 类的继承清华大学 郑莉JAVA语言程序设计21public class B public int a=10;private int b=20;protected int c=30;public int getB()return b;public class A extends B public int d;public void tryVariables()System.out.println(a);/允许 System.out.
17、println(b);/不允许 System.out.println(getB();/允许 System.out.println(c);/允许 4.1.2 继承的语法继承的语法(续续)例例4_3 类的继承清华大学 郑莉JAVA语言程序设计224.1.3 隐藏和覆盖隐藏和覆盖l隐藏和覆盖隐藏和覆盖 子类对从父类继承来的属性变量及方法可以重新定义类的继承清华大学 郑莉JAVA语言程序设计23l属性的隐藏属性的隐藏 子类中声明了与父类中相同的成员变量名,则从父类继承的变量将被隐藏 子类拥有了两个相同名字的变量,一个继承至父类,另一个由自己声明 当子类执行继承至父类的操作时,处理的是继承至父类的变量,
18、而当子类执行它自己声明的方法时,所操作的就是它自己声明的变量4.1.3 隐藏和覆盖隐藏和覆盖(续续)属性的隐藏属性的隐藏 class Parent Number aNumber;class Child extends Parent Float aNumber;类的继承清华大学 郑莉JAVA语言程序设计24l如何访问被隐藏的父类属性如何访问被隐藏的父类属性调用从父类继承的方法,则操作的是从父类继承的属性使用super.属性4.1.3 隐藏和覆盖隐藏和覆盖(续续)访问被隐藏的父类属性访问被隐藏的父类属性类的继承清华大学 郑莉JAVA语言程序设计25l属性的隐藏举例属性的隐藏举例class A1 i
19、nt x=2;public void setx(int i)x=i;void printa()System.out.println(x);4.1.3 隐藏和覆盖隐藏和覆盖(续续)例例4_4class B1 extends A1 int x=100;void printb()super.x=super.x+10;System.out.println (super.x=+super.x+x=+x);类的继承清华大学 郑莉JAVA语言程序设计26public class Exam4_4Test public static void main(String args)A1 a1=new A1();a1
20、.setx(4);a1.printa();B1 b1=new B1();b1.printb();b1.printa();b1.setx(6);/将继承来的x值设置为6 b1.printb();b1.printa();a1.printa();4.1.3 隐藏和覆盖隐藏和覆盖(续续)例例4_4测试测试类的继承清华大学 郑莉JAVA语言程序设计27l运行结果运行结果4super.x=12 x=10012super.x=16 x=1001644.1.3 隐藏和覆盖隐藏和覆盖(续续)例例4_4运行结果运行结果类的继承清华大学 郑莉JAVA语言程序设计28l 注意:注意:子类不能继承父类中的静态属性,但可
21、以子类不能继承父类中的静态属性,但可以对父类中的静态属性进行操作。对父类中的静态属性进行操作。l在上面的例子中,将在上面的例子中,将“int x=2;”改为改为“static int x=2;”,再编译及运行程序,会得到什么结果?再编译及运行程序,会得到什么结果?隐藏和覆盖隐藏和覆盖(续续)举例举例4super.x=14 x=10014super.x=16 x=1001616所有对象的类变量分配相同的内存空间所有对象的类变量分配相同的内存空间改变其中一个对象的这个类变量将会影响其它对象改变其中一个对象的这个类变量将会影响其它对象的这个类变量的这个类变量返回返回清华大学 郑莉JAVA语言程序设计
22、29 使用使用super调用父类的构造方法调用父类的构造方法l子类不继承父类的构造方法,因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用,并且必须使用关键字super来表示,而且而且super必须必须是子类构造方法中的头一条语句是子类构造方法中的头一条语句。注意:l如果在子类的构造方法中没有使用super调用父类的某个构造方法,默认为调用父类不带参数的构造方法l如果父类定义了多个构造方法,那么Java不提供默认构造方法。因此,当在父类中定义多个构造方法时,应包括一个无参构造方法例子:Example4_23清华大学 郑莉JAVA语言程序设计30l方法覆盖方法覆盖 如果子类不需使用从
23、父类继承来的方法的功能,则可以声明自己的同名方法,称为方法覆盖 覆盖方法的返回类型、方法名称、参数的个数及类型必须和被覆盖的方法一样 只需在方法名前面使用不同的类名或不同类的对象名即可区分覆盖方法和被覆盖方法lSuperTest(见后)方法覆盖时,不能降低方法的访问权限。4.1.3隐藏和覆盖隐藏和覆盖(续续)方法覆盖方法覆盖 Class Chengji protected float f(float x,float y)return x*y;Class Xiangjia extends Chengji float f(float x,float y)return x+y;访问权限降低,错误访问
24、权限降低,错误清华大学 郑莉JAVA语言程序设计31l方法覆盖的应用场合方法覆盖的应用场合子类中实现与父类相同的功能,但采用不同的算法或公式 在名字相同的方法中,要做比父类更多的事情 在子类中需要取消从父类继承的方法隐藏和覆盖隐藏和覆盖(续续)方法覆盖的应用场合方法覆盖的应用场合清华大学 郑莉JAVA语言程序设计32l容易混淆的概念容易混淆的概念 方法的重载(method overloading)方法的覆盖(method overriding)方法覆盖方法覆盖(override):如果子类不需使用从父类继承来如果子类不需使用从父类继承来的方法的功能,则可以声明自己的同名方法,称为方法的方法的功
25、能,则可以声明自己的同名方法,称为方法覆盖。覆盖方法的返回类型,方法名称,参数的个数及覆盖。覆盖方法的返回类型,方法名称,参数的个数及类型必须和类型必须和 被覆盖的方法一样。被覆盖的方法一样。子类方法不能缩小父子类方法不能缩小父类方法的访问权限类方法的访问权限。不能抛出比。不能抛出比subclass(父类父类)更多更多的异常的异常。方法重载方法重载(overload):一个类中可以有多个方法具有相同:一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,或者是参数的个数的名字,但这些方法的参数必须不同,或者是参数的个数不同,或者是参数的类型不同不同,或者是参数的类型不同,或者方法的返
26、回类型不相同、或者方法的返回类型不相同、访问修饰不同访问修饰不同。重载的目的是允许通过使用一个方法名。重载的目的是允许通过使用一个方法名来访问多个方法。来访问多个方法。清华大学 郑莉JAVA语言程序设计33l必须覆盖的方法必须覆盖的方法 派生类必须覆盖基类中的抽象的方法,否则派生类自身也成为抽象类.l不能覆盖的方法不能覆盖的方法 基类中声明为final的终结方法(保持操作的稳定性)基类中声明为static 的静态方法l调用被覆盖的方法调用被覆盖的方法 super.overriddenMethodName();4.1.3 隐藏和覆盖隐藏和覆盖(续续)方法覆盖的注意事项方法覆盖的注意事项类的继承清
27、华大学 郑莉JAVA语言程序设计344.1.4 有继承时的构造方法有继承时的构造方法(略略)l有继承时的构造方法遵循以下的原则有继承时的构造方法遵循以下的原则 子类不能从父类继承构造方法 好的程序设计方法是在子类的构造方法中调用某一个父类构造方法,调用语句必须出现在子类构造方法的第一行,可使用super关键字 如子类构造方法的声明中没有明确调用父类构造方法,则系统在执行子类的构造方法时会自动调用父类的默认构造方法(即无参的构造方法)类的继承清华大学 郑莉JAVA语言程序设计35public class Person public class Person protected protected
28、 String name,String name,phoneNumberphoneNumber,address;,address;public Person()public Person()this(,);this(,);public Person(String public Person(String aNameaName,String,String aPhoneNumberaPhoneNumber,String,String anAddressanAddress)name=name=aNameaName;phoneNumberphoneNumber=aPhoneNumberaPhoneNu
29、mber;address=address=anAddressanAddress;4.1.4 有继承时的构造方法有继承时的构造方法(续续)例例4_5 类的继承清华大学 郑莉JAVA语言程序设计36public class Employee extends Person public class Employee extends Person protected protected intint employeeNumberemployeeNumber;protected String protected String workPhoneNumberworkPhoneNumber;public E
30、mployee()public Employee()/此处隐含调用构造方法此处隐含调用构造方法 Person()Person()this(0,);this(0,);public public Employee(intEmployee(int aNumberaNumber,String,String aPhoneNumberaPhoneNumber)/此处隐含调用构造方法此处隐含调用构造方法 Person()Person()employeeNumberemployeeNumber=aNumberaNumber;workPhoneNumberworkPhoneNumber=aPhoneNumber
31、aPhoneNumber;4.1.4 有继承时的构造方法有继承时的构造方法(续续)例例4_5 类的继承清华大学 郑莉JAVA语言程序设计37public class Professor extends Employee public class Professor extends Employee protected String research;protected String research;public Professor()public Professor()super();super();research=;research=;public public ProfessorPro
32、fessor(int(int aNumberaNumber,String,String aPhoneNumberaPhoneNumber,String,String aResearchaResearch)super(aNumbersuper(aNumber,aPhoneNumberaPhoneNumber););research=research=aResearchaResearch;4.1.4 有继承时的构造方法有继承时的构造方法(续续)例例4_5 类的继承清华大学 郑莉JAVA语言程序设计38l在一个公司管理信息系统中,包括在一个公司管理信息系统中,包括 普通员工(Employees),其
33、可能有的属性信息包括l员工号(employeeNumber)l姓名(name)l地址(address)l电话号码(phoneNumber)管理者(Magagers),除具有普通员工所具有的属性及行为外,还具有下面的属性和行为l职责(responsibilities)l所管理的职员(listOfEmployees)l工资的计算方法与一般员工不同;福利与一般员工不同 顾客(Customers),可能有的属性信息包括l姓名(name)l地址(address)l电话号码(phoneNumber)4.1.5 应用举例应用举例例例4_6 类的继承清华大学 郑莉JAVA语言程序设计39l类层次结构类层次结构
34、4.1.5 应用举例应用举例(续续)例例4_6 PersonEmployeeManagerCustomer类的继承清华大学 郑莉JAVA语言程序设计404.2 Object 类类lObject类类 Java库类是系统提供的已实现的标准类的集合,是Java的API Object类是Java程序中所有类的直接或间接父类,类库中所有类的父类,处在类层次最高点 包含了所有Java类的公共属性,其构造方法是Object()清华大学 郑莉JAVA语言程序设计41lObject类定义了所有对象必须具有的状态和行为,类定义了所有对象必须具有的状态和行为,较主要的方法如下较主要的方法如下 public fina
35、l Class getClass()l获取当前对象所属的类信息,返回Class对象 public String toString()l返回当前对象本身的有关信息,按字符串对象返回 public boolean equals(Objectobj)l比较两个对象是否是同一对象,是则返回true protected Object clone()l生成当前对象的一个拷贝,并返回这个复制对象 Public int hashCode()l返回该对象的哈希代码值 protected void finalize()throws Throwable l定义回收当前对象时所需完成的资源释放工作4.2 Object
36、类类(续续)包含的主要方法包含的主要方法 Object类清华大学 郑莉JAVA语言程序设计42相等与同一相等与同一补充补充1:equals()和和“”的区别的区别l“”可用于比较基本数据类型和可用于比较基本数据类型和引用型引用型 比较两个基本数据类型时,如果两个的值相同,则返回true 比较两个引用类型时,如果两个引用的引用的地址地址相同,则返回truelequals()用于比较两个对象的用于比较两个对象的值值是否是否相同相同清华大学 郑莉JAVA语言程序设计43 补充补充2:String str1=“aaa”;String str1=new String(“aaa”);的区别?的区别?l常量
37、池常量池(constant pool)指的是在编译期被确定,指的是在编译期被确定,并被保存在已编译的并被保存在已编译的.class文件中的一些数据。它文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括包括了关于类、方法、接口等中的常量,也包括字符串常量。字符串常量。lstr1 属于字符串常量,被创建时的地址为常量池属于字符串常量,被创建时的地址为常量池中,如果常量池中已有相同字符串常量,则新创中,如果常量池中已有相同字符串常量,则新创建的常量将指向已有的引用;如果没有,则使用建的常量将指向已有的引用;如果没有,则使用String中的中的intern()在常量池中增加一个在常量池中增
38、加一个Unicode等于等于str的字符串的字符串,并返回它的引用。并返回它的引用。(注:于(注:于String类型,有一张固定长度的类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串表用来存储文字字符串值值)l使用使用new String()创建的是对象,不同对象指向不创建的是对象,不同对象指向不同的内存地址。同的内存地址。清华大学 郑莉JAVA语言程序设计44l举例举例String str1=“aaa”;String str2=“aaa”;str1=str2;str1.equals(str2);truetrue清华大学 郑莉JAVA语言程序设计45Strin
39、g str3=new String(“aaa”);str1=str3;str1.equals(str3);falsetrue清华大学 郑莉JAVA语言程序设计46public class strTest public static void main(String args)String str1=aaa;String str2=“aaa”;String str3=new String(aaa);if(str1=str2)System.out.println(str1=str2);if(str1.equals(str2)System.out.println(str1.equals(str2);
40、if(str1=str3)System.out.println(true);elseSystem.out.println(false);if(str1.equals(str3)System.out.println(true);elseSystem.out.println(false);清华大学 郑莉JAVA语言程序设计47先看两个例子先看两个例子public class Exam4_7public static void main(String args)BankAccount a=new BankAccount(Bob,123456,100.00f);BankAccount b=new Ba
41、nkAccount(Bob,123456,100.00f);if(a=b)System.out.println(YES);else System.out.println(NO);NO清华大学 郑莉JAVA语言程序设计48public class EqualsTestpublic static void main(String args)BankAccount a=new BankAccount(Bob,123456,100.00f);BankAccount b=new BankAccount(Bob,123456,100.00f);if(a.equals(b)System.out.printl
42、n(YES);else System.out.println(NO);NO清华大学 郑莉JAVA语言程序设计49这两个例子equals()和前面的String类有何不同,到底是什么原因?清华大学 郑莉JAVA语言程序设计50l相等和同一的概念相等和同一的概念 两个对象具有相同的类型,及相同的属性值属性值,则称二者相等(equal)如果两个引用变量指向的是同一个对象,则称这两个变量(对象)同一(identical=)两个对象同一,则肯定相等 两个对象相等,不一定同一 比较运算符“=”判断的是这两个对象是否同一(即对象地址是否相同对象地址是否相同)4.2 Object类类(续续)相等和同一相等和同
43、一 Object类清华大学 郑莉JAVA语言程序设计51l判断两个对象是否同一判断两个对象是否同一public class Exam4_7public 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.out.println(NO);lBankAccount类在类在2.5.1中声明,此程序运行的结果中声明
44、,此程序运行的结果为为“NO”,原因是使用等号原因是使用等号“=”判断的是两个对象判断的是两个对象是否同一,显然是否同一,显然a和和b是两个对象是两个对象4.2 Object类类(续续)例例4_7 Object类清华大学 郑莉JAVA语言程序设计52l修改刚才的程序修改刚才的程序public class Exam4_7public static void main(String args)BankAccount a=new BankAccount(Bob,123456,100.00f);BankAccount b=a;if(a=b)System.out.println(YES);else Sy
45、stem.out.println(NO);l将将a所指对象的引用赋给所指对象的引用赋给b,因此因此a与与b指向的是同一指向的是同一个对象,个对象,a与与b同一。输出结果为同一。输出结果为“YES”4.2 Object类类(续续)例例4_7 Object类清华大学 郑莉JAVA语言程序设计53lequals 方法方法 由于Object是类层次结构中的树根节点,因此所有其他类都继承了equals()方法 Object类中的 equals()方法的定义如下,public boolean equals(Object x)return this=x;4.2 Object类类(续续)equals方法方法
46、Object类比较接收对象与参数对象是否是同一个对象,即对象地址是否相同。因此,Object中的equals()方法判断的是两个对象是否同一,而不是属性值是否相同。可见,也是判断两个对象是否同一清华大学 郑莉JAVA语言程序设计54lObject类中类中equals方法的使用举例方法的使用举例public class EqualsTestpublic static void main(String args)BankAccount a=new BankAccount(Bob,123456,100.00f);BankAccount b=new BankAccount(Bob,123456,100
47、.00f);if(a.equals(b)System.out.println(YES);else System.out.println(NO);l由于不是同一对象,运行结果仍然是由于不是同一对象,运行结果仍然是“NO”4.2 Object类类(续续)例例4_8 清华大学 郑莉JAVA语言程序设计55lequlas方法的重写方法的重写 要判断两个对象各个属性域的值是否相同,则不能使用从Object类继承来的equals方法,而需要在类声明中对equals方法进行重写 答案:String类中已经重写了Object类的equals方法,可以判别两个字符串是否内容相同4.2 Object类类(续续)e
48、quals方法方法 的重写的重写Object类清华大学 郑莉JAVA语言程序设计56l在在BankAccountBankAccount类中增加类中增加equalsequals方法,由于是对方法,由于是对ObjectObject类中的类中的equalsequals方法进行重写,因此方法定方法进行重写,因此方法定义头必须与义头必须与ObjectObject类中的类中的equalsequals方法完全相同方法完全相同public public booleanboolean equals(Object x)equals(Object x)if(this.getClass()!=x.getClass()
49、return false;BankAccount b=(BankAccount)x;return (this.getOwnerName().equals(b.getOwnerName()&(this.getAccountNumber()=b.getAccountNumber()&(this.getBalance()=b.getBalance();4.2 Object类类(续续)equals方法方法 的重写的重写Object类清华大学 郑莉JAVA语言程序设计57lequals方法的应用举例方法的应用举例public class Apple private String color;privat
50、e 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;public String getColor()return color;public boolean getRipe()return ripe;public String toString()if(ripe)return(A ripe +col