《Java程序设计课件Java程序设计 (4).pdf》由会员分享,可在线阅读,更多相关《Java程序设计课件Java程序设计 (4).pdf(104页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Java语言程序设计(第2版)第 4 章 类的重用BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRC+语言程序设计(第4版),郑莉,清华大学2BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRR
2、RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学目录 3.1 类的继承 3.2 Object类 3.3 终结类与终结方法 3.4 抽象类 3.5 泛型 3.6 类的组合3BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计
3、(第2版),郑莉,清华大学类的继承 如何充分重用已有的设计和实现,在已有类的基础上设计新的类?继承已有类的全部属性和行为,在此基础上改造、扩展4BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学Object类 所有Java类的直接或间接超类。如果一个类没有继承任何超类,那么就隐含直接继承了Obje
4、ct类5BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学终结类与终结方法 有些类,或类的方法从安全的角度或者算法的角度不希望被修改,就可以设为终结类、终结方法 终结类不可以被继承(扩展)终结方法不可以被覆盖6BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
5、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学抽象类 如果希望统一规定整个类家族的共同属性和行为,但是又没有统一抽象的行为实现,就可以声明一个抽象超类,包括所有需要子类具有的属性和实现的方法,在超类中无法实现的方法就声明为抽象方法,留待子类各自去实现。由于抽象类中允许有未实现的方法,因此不能生成对象,只能当做超类使用,主要是为了设计的目的和隐藏实现细节7BBBBBBBBBBBBB
6、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学泛型 不仅数据可以作为参数,类型也可以作为参数。使用类型参数,可以使程序更为通用,适用于处理不同类型的数据 这就是泛型8BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
7、BBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学类的组合 组合是另一种类重用机制部件组装的思想 在声明一个新的类时,用已有类的对象作为成员9BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRC+
8、语言程序设计(第4版),郑莉,清华大学 这就是第3章将要学习的主要内容10结束语BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRC+语言程序设计(第4版),郑莉,清华大学、11BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
9、BBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学类继承的概念 一种由已有的类创建新类的机制,是面向对象程序设计的基石之一12BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),
10、郑莉,清华大学类继承的概念 根据已有类来定义新类,新类拥有已有类的所有功能 Java只支持类的单继承,每个子类只能有一个直接超类 超类是所有子类的公共属性及方法的集合,子类则是超类的特殊化 继承机制可以提高程序的抽象程度,提高代码的可重用性13BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学超类
11、和子类 超类(superclass)也称基类(base class)是被直接或间接继承的类 子类(subclass)也称派生类(derived-class)继承其他类而得到的类 继承所有祖先的状态和行为 派生类可以增加变量和方法 派生类也可以覆盖(override)继承的方法14BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程
12、序设计(第2版),郑莉,清华大学超类和子类 子类对象与超类对象存在“是一个.”(或“是一种.”)的关系15BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学子类对象 从外部来看,它应该包括 与超类相同的接口 可以具有更多的方法和数据成员 其内包含着超类的所有变量和方法16BBBBBBBBBBBBB
13、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学17继承的语法BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
14、RRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学继承的语法ClassModifier class ClassName extends SuperClassName/类体18BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学类继承举例 设有三个类:Pers
15、on,Employee,Manager。其类层次如图:19PersonEmployeeManagerBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR例:类继承public class Person public String name;public String getName()return name;public class Emplo
16、yee extends Person public int employeeNumber;public int getEmployeeNumber()return employeeNumber;public class Manager extends Employee public String responsibilities;public String getResponsibilities()return responsibilities;BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
17、BBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR例:类继承public 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
18、 Manager();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();运行结果Li Ming123456He Xia543469Internet projectBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
19、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR例:访问从超类继承的成员子类不能直接访问从超类中继承的私有属性及方法,但可使用公有(及保护)方法进行访问public 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 t
20、ryVariables()System.out.println(a);/允许System.out.println(b);/不允许System.out.println(getB();/允许System.out.println(c);/允许 22BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRC+语言程序设计(第4版),郑莉,清华大学 这一节我
21、们学习了类继承的概念、语法,并通过简单的例题观察了如何从一个已有的类派生出辛德雷。23结束语BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRC+语言程序设计(第4版),郑莉,清华大学子类对从超类继承来的属性变量及方法可以重新定义24BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
22、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学属性的隐藏25BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,
23、清华大学属性的隐藏 子类中声明了与超类中相同的成员变量名 从超类继承的变量将被隐藏 子类拥有了两个相同名字的变量,一个继承自超类,另一个由自己声明 当子类执行继承自超类的操作时,处理的是继承自超类的变量,而当子类执行它自己声明的方法时,所操作的就是它自己声明的变量26class Parent Number aNumber;class Child extends Parent Float aNumber;BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRR
24、RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学访问被隐藏的超类属性 调用从超类继承的方法,则操作的是从超类继承的属性 本类中声明的方法使用“super.属性”访问从超类继承的属性27BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
25、例:属性的隐藏class A1 int x=2;public void setx(int i)x=i;void printa()System.out.println(x);class B1 extends A1 int x=100;void printb()super.x=super.x+10;System.out.println(super.x=+super.x+x=+x);public class Exam4_4Test public static void main(String args)A1 a1=new A1();a1.setx(4);a1.printa();B1 b1=new B
26、1();b1.printb();b1.printa();b1.setx(6);/将继承x值设置为6b1.printb();b1.printa();a1.printa();运行结果:4super.x=12 x=10012super.x=16 x=100164BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR例:访问超类静态属性class A s
27、tatic int x=2;public void setx(int i)x=i;void printa()System.out.println(x);class B extends A int x=100;void printb()super.x=super.x+10;System.out.println(super.x=+super.x+x=+x);29public class Tester public static void main(String args)A a1=new A();a1.setx(4);a1.printa();B b1=new B();b1.printb();b1.
28、printa();b1.setx(6);b1.printb();b1.printa();a1.printa();运行结果:4super.x=14 x=10014super.x=16 x=1001616BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学方法覆盖30BBBBBBBBBBBBBBBBBB
29、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学方法覆盖 如果子类不需使用从超类继承来的方法的功能,则可以声明自己的同名方法,称为方法覆盖 覆盖方法的返回类型,方法名称,参数的个数及类型必须和被覆盖的方法一摸一样 只需在方法名前面使用不同的类名或不同类的对象名即可区分覆盖方法和被覆盖方法 覆盖方法的访问权限可以比被覆盖的宽松,但是
30、不能更为严格31BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学方法覆盖的应用场合 子类中实现与超类相同的功能,但采用不同的算法或公式;在名字相同的方法中,要做比超类更多的事情;在子类中需要取消从超类继承的方法。32BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
31、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学方法覆盖的注意事项 必须覆盖的方法 派生类必须覆盖基类中的抽象的方法,否则派生类自身也成为抽象类.不能覆盖的方法 基类中声明为final的终结方法 基类中声明为static 的静态方法 调用被覆盖的方法 super.overriddenMethodName();33BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
32、BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRC+语言程序设计(第4版),郑莉,清华大学 这一节我们学习了在子类中如何隐藏从超类继承的方法,如何覆盖从超类继承的成员。这样就可以在继承的基础上进行修改34结束语BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRR
33、RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRC+语言程序设计(第4版),郑莉,清华大学35BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学有继承时子类的构造方法遵循以下的原则 子类不能从超类继承构造方法 最好在子类的构造方法中使
34、用super关键字显式调用超类的某个构造方法,调用语句必须出现在子类构造方法的第一行。如子类构造方法体中没有显式调用超类构造方法,则系统在执行子类的构造方法时会自动调用超类的默认构造方法(即无参的构造方法)36BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR例:子类的构造方法public class Person protected Str
35、ing name,phoneNumber,address;public Person()this(,);public Person(String aName,String aPhoneNumber,String anAddress)name=aName;phoneNumber=aPhoneNumber;address=anAddress;BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
36、RRRRRRRRRRRRRRRRRRRRRRR例:子类的构造方法(续)public class Employee extends Person protected int employeeNumber;protected String workPhoneNumber;public Employee()/此处隐含调用构造方法 Person()this(0,);public Employee(int aNumber,String aPhoneNumber)/此处隐含调用构造方法 Person()employeeNumber=aNumber;workPhoneNumber=aPhoneNumber;
37、38BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR例:子类的构造方法(续)public class Professor extends Employee protected String research;public Professor()super();research=;public Professor(int aNumber,St
38、ring aPhoneNumber,String aResearch)super(aNumber,aPhoneNumber);research=aResearch;39BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRC+语言程序设计(第4版),郑莉,清华大学 这一节介绍了在有继承的情况下,子类的构造方法怎么写。应该首先在第一句调用超类的构造
39、方法 如果不显式地调用超类的构造方法,超类的默认构造方法将被调用。40结束语BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRC+语言程序设计(第4版),郑莉,清华大学41BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBR
40、RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学Object 类 所有类的直接或间接超类,处在类层次最高点;包含了所有Java类的公共属性。42BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设
41、计(第2版),郑莉,清华大学Object类的主要方法43BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学Object类的主要方法 public final Class getClass()获取当前对象所属的类信息,返回Class对象。public String toString()返回表示当前对
42、象本身有关信息的字符串对象。public boolean equals(Objectobj)比较两个对象引用是否指向同一对象,是则返回true,否则返回false。protected Object clone()复制当前对象,并返回这个副本。Public int hashCode()返回该对象的哈希代码值。protected void finalize()throws Throwable 在对象被回收时执行,通常完成的资源释放工作。44(按照讲解速度,逐行高亮)BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
43、BBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学相等和同一 在Object类中声明的equals()方法功能是比较两个对象引用是否指向同一对象,而不是比较两个引用指向的对象是否相等。接下来我们看一下“相等”和“同一”的区别。45BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRR
44、RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学相等和同一 两个对象具有相同的类型,及相同的属性值,则称二者相等(equal)。如果两个引用变量指向的是同一个对象,则称这两个引用变量同一(identical)。两个对象同一,则肯定相等。两个对象相等,不一定同一。比较运算符“=”判断的是这两个对象是否同一。46BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRR
45、RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR例:用“=”判断两个引用是否同一public class Tester1public 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);BankAccoun
46、t类在2.5.1中声明,此程序运行的结果为“NO”,原因是使用“=”判断的是两个引用是否同一。47BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR例:用“=”判断两个引用是否同一(续)public class Tester2 public static void main(String args)BankAccount a=new Bank
47、Account(Bob,123456,100.00f,Grade.General);BankAccount b=a;if(a=b)System.out.println(YES);else System.out.println(NO);a与b指向的是同一个对象,a与b同一。输出结果为“YES”48BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
48、RJava语言程序设计(第2版),郑莉,清华大学equals 方法 由于Object是类层次结构中的树根节点,因此所有其他类都继承了equals()方法 equals()方法是像方法名表达的意思那样,判断两个对象相等吗?49BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRJava语言程序设计(第2版),郑莉,清华大学equals 方法 Ob
49、ject类中的 equals()方法的定义如下:public boolean equals(Object x)return this=x;也是判断两个对象引用是否同一。50BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR例:equals方法public class EqualsTestpublic static void main(Stri
50、ng args)BankAccount a=new BankAccount(Bob,123456,100.00f);BankAccount b=new BankAccount(Bob,123456,100.00f);if(a.equals(b)System.out.println(YES);else System.out.println(NO);由于两个引用不是指向同一对象,运行结果仍然是“NO”BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRRRRRRRRRRRRRR