语言程序设计(第三版清华)第4章课件_第1页
语言程序设计(第三版清华)第4章课件_第2页
语言程序设计(第三版清华)第4章课件_第3页
语言程序设计(第三版清华)第4章课件_第4页
语言程序设计(第三版清华)第4章课件_第5页
已阅读5页,还剩180页未读 继续免费阅读

下载本文档

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

文档简介

第四章 类的重用 Java 2 实用程序-4.8-4.20(不含4.13) JAVA语言程序设计 1 清华大学 郑莉JAVA语言程序设计 目录 l4.1 类的继承 l4.2 Object类 l4.3 终结类与终结方法 l4.4 抽象类 l4.5 类的组合 l4.6 包的应用 l4.7 本章小结 2 清华大学 郑莉JAVA语言程序设计 4.1 类的继承 l继承是一种由已有的类创建新类的机制 l父类是所有子类的公共属性及方法的集合,子类 则是父类的特殊化, 子类根据需要增加它自己的新 的状态和行为。 lJava只支持类的单继承,每个子类只能有一个直 接父类 l继承机制可以提高程序的抽象程度,提高代码的 可重用性 l在Java中每个类均为Object 的子类。(java.lang) 3 清华大学 郑莉JAVA语言程序设计 一、 继承的概念 基类和派生类 l基类(base class) 也称超类、父类(superclass) 是被直接或间接继承的类 l派生类(derived-class) 也称子类 (subclass) 继承其他类而得到的类 继承所有祖先的状态和行为 派生类可以增加变量和方法 派生类也可以覆盖(override)继承的方法 4 清华大学 郑莉JAVA语言程序设计 一、 继承的概念 is_a关系 l子类对象与父类对象存在“IS A”(或“is kind of”)的关系 5 清华大学 郑莉JAVA语言程序设计 l动物类层次举例 一、 继承的概念 举例 一般 具体 动物 蛇蜥蜴鲸 爬行动物哺乳动物 狗 巨蜥 壁虎 壁虎 是一种 蜥蜴 爬行 动物是 动物的 一种 6 清华大学 郑莉JAVA语言程序设计 l错误的基础关系(HAS A) 汽车 发动机制动装置 7 清华大学 郑莉JAVA语言程序设计 二、 子类声明 l在类的声明中,通过使用关键字 extends来创建一个类的子类,格式 如下: class childClass extends parentClass /类体 8 清华大学 郑莉JAVA语言程序设计 l在一个公司中,有普通员工(Employees)及管 理人员(Magagers)两类人员 普通员工对象(Employees)可能有的属性信息包 括 l员工号(employeeNumber) l姓名(name) l地址(address) l电话号码(phoneNumber) 管理人员(Managers)除具有普通员工的属性外 ,还可能具有下面的属性 l职责(responsibilities) l所管理的职员(listOfEmployees) 三、 子类的继承性 类的设计 举例 9 清华大学 郑莉JAVA语言程序设计 lEmployee与Manager的类图 三、 子类的继承性 类的设计 举例 Employee employeeNumbe : int name : String address : String phoneNumber : String Manager responsibilities:String listOfEmployees:String 父类 子类 10 清华大学 郑莉JAVA语言程序设计 /父类Employee class Employee int employeeNumbe ; String name, address, phoneNumber ; public void work(); /子类Manager class Manager extends Employee /子类增加的成员变量 String responsibilities, listOfEmployees; 11 Employee employeeNumbe : int address : String phoneNumber : String work(): void Manager responsibilities:String manage():void person Name:String 12 清华大学 郑莉JAVA语言程序设计 三、 子类的继承性 l类可以有两种重要的成员 成员变量 成员方法 l子类的成员中有一部分是子类自己声 明定义的,另一部分是从它的父类继 承的 l子类继承父类可分两种情况 子类与父类同在一个包中 子类与父类不在同一个包中 13 清华大学 郑莉JAVA语言程序设计 子类和父类在同一包中的继 承性 l如果子类和父类在同一个包中,那么,子 类自然地继承了其父类中不是private的成 员变量作为自己的成员变量,并且也自然 地继承了父类中不是private的方法作为自 己的方法, 继承的成员变量或方法的访问权 限保持不变。 l例子: workspace/inherite/Example4_15.java 14 清华大学 郑莉JAVA语言程序设计 public class Father private int money; float weight,height; String head,hand, foot; void speak(String 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.out.println(boy.hand+“n“+boy.foot+ “n”+boy.head+“n”+“身高: “+boy.weight+boy.height+“n“+boy.hobby); 子类不能继承 子类新增属性 我是儿子 两只手 两只脚 一个头 身高:1.8120 喜欢上网,有时上课还睡 觉:) 15 清华大学 郑莉JAVA语言程序设计 子类和父类不在同一包中的继承性 l如果子类和父类不在同一个包中,子 类可继承父类的protected、public成 员变量做为子类的成员变量,并且可 继承父类的protected、public方法为 子类的方法, 继承的成员变量或方法 的访问权限保持不变。 l如果子类和父类不在同一个包中,子 类不能继承父类的友好变量和友好方 法。 16 清华大学 郑莉JAVA语言程序设计例子: Example4/inherite/ABC.java Example4/DEF.java package inherite; public class ABC protected int pro_i=5; protected void show() 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(_i); _i=10; def.show(); 如果变量pro_i 不加访问权限 ,会出现什么 情况? Error:pro_i在ABC.java中不是公共的, 无法从外部软件包中进行访问 17 清华大学 郑莉JAVA语言程序设计 public 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 getResponsibilities() return responsibilities; 4.1.2 继承的语法(续) 例4_2 类的继承 18 清华大学 郑莉JAVA语言程序设计 public class Exam4_2Test 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 = “Internet project“; System.out.println(he.getName(); System.out.println(he.getEmployeeNumber(); System.out.println(he.getResponsibilities(); 4.1.2 继承的语法(续) 例4_2测试 类的继承 19 清华大学 郑莉JAVA语言程序设计 l运行结果 Li Ming 123456 He Xia 543469 Internet project l说明 子类不能直接访问从父类中继承的私有属性及 方法,但可使用公有(及保护)方法进行访问 4.1.2 继承的语法(续) 例4_2测试结果 类的继承 20 清华大学 郑莉JAVA语言程序设计 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 tryVariables() System.out.println(a); System.out.println(b); System.out.println(getB(); System.out.println(c); 4.1.2 继承的语法(续) 例4_3 类的继承 是否有问题? 21 清华大学 郑莉JAVA语言程序设计 4.1.3 隐藏和覆盖 l隐藏和覆盖 子类对从父类继承来的属性变量及方法 可以重新定义 类的继承 22 清华大学 郑莉JAVA语言程序设计 l属性的隐藏 子类中声明了与父类中相同的成员变量名,则 从父类继承的变量将被隐藏 子类拥有了两个相同名字的变量,一个继承至 父类,另一个由自己声明 当子类执行继承至父类的操作时,处理的是继 承至父类的变量,而当子类执行它自己声明的 方法时,所操作的就是它自己声明的变量 4.1.3 隐藏和覆盖(续) 属性的隐藏 class Parent int aNumber; class Child extends Parent float aNumber; 类的继承 23 清华大学 郑莉JAVA语言程序设计 l如何访问被隐藏的父类属性 调用从父类继承的方法,则操作的是从 父类继承的属性 使用super.属性 4.1.3 隐藏和覆盖(续) 访问被隐藏的父类属性 类的继承 24 清华大学 郑莉JAVA语言程序设计 l属性的隐藏举例 class A1 int x = 2; public void setx(int i) x = i; void printa() System.out.println(x); 4.1.3 隐藏和覆盖(续) 例4_4 class B1 extends A1 int x=100; void printb() super.x = super.x +10 ; System.out.println (“super.x= “ + super.x + “ x= “ + x); 类的继承 A1 a1 = new A1(); a1.setx(4); a1.printa(); B1 b1 = new B1(); b1.printb(); b1.printa(); b1.setx(6); / 将继承来的x 值设置为6 b1.printb(); b1.printa(); a1.printa(); 25 清华大学 郑莉JAVA语言程序设计 public class Exam4_4Test public static void main(String args) A1 a1 = new A1(); a1.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测试 类的继承 26 清华大学 郑莉JAVA语言程序设计 l运行结果 4 super.x= 12 x= 100 12 super.x= 16 x= 100 16 4 4.1.3 隐藏和覆盖(续) 例4_4运行结果 类的继承 27 清华大学 郑莉JAVA语言程序设计 l 注意:子类不能继承父类中的静态属性,但可以 对父类中的静态属性进行操作。 l在上面的例子中,将“int x = 2;”改为“static int x = 2;”,再编译及运行程序,会得到什么结果? 隐藏和覆盖(续) 举例 4 super.x= 14 x= 100 14 super.x= 16 x= 100 16 16 所有对象的类变量分配相同的内存空间 改变其中一个对象的这个类变量将会影响其它对象 的这个类变量 返回 28 清华大学 郑莉JAVA语言程序设计 使用super调用父类的构造方法 l子类不继承父类的构造方法,因此,子类如 果想使用父类的构造方法,必须在子类的构造方法中 使用,并且必须使用关键字super来表示,而且 super必须是子类构造方法中的头一条语句。 注意: l如果在子类的构造方法中没有使用super调用 父类的某个构造方法,默认为调用父类不带参数的构 造方法 l如果父类定义了多个构造方法,那么Java不 提供默认构造方法。因此,当在父类中定义多个构造 方法时,应包括一个无参构造方法 例子:Example4_23 29 清华大学 郑莉JAVA语言程序设计 l方法覆盖 如果子类不需使用从父类继承来的方法的功 能,则可以声明自己的同名方法,称为方法 覆盖 覆盖方法的返回类型、方法名称、参数的个 数及类型必须和被覆盖的方法一样 只需在方法名前面使用不同的类名或不同类 的对象名即可区分覆盖方法和被覆盖方法 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; 访问权限降低,错误 30 清华大学 郑莉JAVA语言程序设计 l方法覆盖的应用场合 子类中实现与父类相同的功能,但 采用不同的算法或公式 在名字相同的方法中,要做比父类 更多的事情 在子类中需要取消从父类继承的方 法 隐藏和覆盖(续) 方法覆盖的应用场合 31 清华大学 郑莉JAVA语言程序设计 l容易混淆的概念 方法的重载(method overloading) 方法的覆盖(method overriding) 方法覆盖(override):如果子类不需使用从父类继承来 的方法的功能,则可以声明自己的同名方法,称为方法 覆盖。覆盖方法的返回类型,方法名称,参数的个数及 类型必须和 被覆盖的方法一样。子类方法不能缩小父 类方法的访问权限 。不能抛出比subclass(父类)更多 的异常 。 方法重载(overload):一个类中可以有多个方法具有相同的 名字,但这些方法的参数必须不同,或者是参数的个数不 同,或者是参数的类型不同, 或者方法的返回类型不相同、 访问修饰不同 。重载的目的是允许通过使用一个方法名 来访问多个方法。 32 清华大学 郑莉JAVA语言程序设计 l必须覆盖的方法 派生类必须覆盖基类中的抽象的方法,否则 派生类自身也成为抽象类. l不能覆盖的方法 基类中声明为final的终结方法(保持操作的 稳定性) 基类中声明为static 的静态方法 l调用被覆盖的方法 super.overriddenMethodName(); 4.1.3 隐藏和覆盖(续) 方法覆盖的注意事项 类的继承 33 清华大学 郑莉JAVA语言程序设计 4.1.4 有继承时的构造方 法 l有继承时的构造方法遵循以下的原则 子类不能从父类继承构造方法 好的程序设计方法是在子类的构造方法中调用 某一个父类构造方法,调用语句必须出现在子 类构造方法的第一行,可使用super关键字 如子类构造方法的声明中没有明确调用父类构 造方法,则系统在执行子类的构造方法时会自 动调用父类的默认构造方法(即无参的构造方 法) 类的继承 34 清华大学 郑莉JAVA语言程序设计 public class Person protected String name, phoneNumber, address; public Person() this(“, “, “); public Person(String aName, String aPhoneNumber, String anAddress) name=aName; phoneNumber=aPhoneNumber; address=anAddress; 4.1.4 有继承时的构造方法( 续) 例4_5 类的继承 35 清华大学 郑莉JAVA语言程序设计 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; 4.1.4 有继承时的构造方法( 续) 例4_5 类的继承 36 清华大学 郑莉JAVA语言程序设计 Super关键字 l如果我们在子类中想使用被子类隐藏 了的父类的成员变量或方法就可以使 用关键字super。比如:super.x、 super.play(),就是被子类隐藏的父 类的成员变量x和方法play()。 37 清华大学 郑莉JAVA语言程序设计 public class Professor extends Employee protected String research; public Professor() super(); research = “; public Professor(int aNumber, String aPhoneNumber, String aResearch) super(aNumber, aPhoneNumber); research = aResearch; 4.1.4 有继承时的构造方法( 续) 例4_5 类的继承 38 清华大学 郑莉JAVA语言程序设计 public class Professor extends Employee protected String research; public Professor() super(); research = “; public Professor(int aNumber, String aPhoneNumber, String aResearch) super(aNumber, aPhoneNumber); research = aResearch; 4.1.4 有继承时的构造方法( 续) 例4_5 类的继承 39 清华大学 郑莉JAVA语言程序设计 l在一个公司管理信息系统中,包括 普通员工(Employees),其可能有的属性信息包括 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 类的继承 40 清华大学 郑莉JAVA语言程序设计 l类层次结构 4.1.5 应用举例(续) 例4_6 Person Employee Manager Customer 类的继承 41 清华大学 郑莉JAVA语言程序设计 4.2 Object 类 lObject类 Java库类是系统提供的已实现的标准类的集合 ,是Java的API Object类是Java程序中所有类的直接或间接父 类,类库中所有类的父类,处在类层次最高点 包含了所有Java类的公共属性,其构造方法是 Object( ) 42 清华大学 郑莉JAVA语言程序设计 lObject类定义了所有对象必须具有的状态和行为, 较主要的方法如下 public final Class getClass() l获取当前对象所属的类信息,返回Class对象 public String toString() l返回当前对象本身的有关信息,按字符串对象返回 public boolean equals(Object obj) l比较两个对象是否是同一对象,是则返回true protected Object clone( ) l生成当前对象的一个拷贝,并返回这个复制对象 Public int hashCode() l返回该对象的哈希代码值 protected void finalize() throws Throwable l定义回收当前对象时所需完成的资源释放工作 4.2 Object类(续) 包含的主要方法 Object类 43 清华大学 郑莉JAVA语言程序设计 相等与同一 补充1:equals()和“”的区 别 l“”可用于比较基本数据类型和引 用型 比较两个基本数据类型时,如果两个的 值相同,则返回true 比较两个引用类型时,如果两个引用的 地址相同,则返回true lequals()用于比较两个对象的值是否 相同 44 清华大学 郑莉JAVA语言程序设计 补充2: String str1=“aaa”; String str1=new String(“aaa”); 的区别? l常量池(constant pool)指的是在编译期被确定, 并被保存在已编译的.class文件中的一些数据。它 包括了关于类、方法、接口等中的常量,也包括字 符串常量。 lstr1 属于字符串常量,被创建时的地址为常量池 中,如果常量池中已有相同字符串常量,则新创建 的常量将指向已有的引用;如果没有,则使用 String中的intern()在常量池中增加一个Unicode 等于str的字符串,并返回它的引用。 (注:于String类型,有一张固定长度的 CONSTANT_String_info表用来存储文字字符串 值 ) l使用new String()创建的是对象,不同对象指向不 同的内存地址。 45 清华大学 郑莉JAVA语言程序设计 l举例 String str1=“aaa”; String str2=“aaa”; str1 = str2 ; str1.equals(str2); 地址同,true 值相同,true 46 清华大学 郑莉JAVA语言程序设计 String str3 = new String(“aaa”); str1=str3; str1.equals(str3); 地址不同,false 值相同,true 47 清华大学 郑莉JAVA语言程序设计 public 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); if(str1=str3) System.out.println(“true“); else System.out.println(“false“); if(str1.equals(str3) System.out.println(“true“); else System.out.println(“false“); 48 清华大学 郑莉JAVA语言程序设计 先看两个例子 public class Exam4_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.out.println(“NO“); NO 49 清华大学 郑莉JAVA语言程序设计 public class EqualsTest public 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.println(“YES“); else System.out.println(“NO“); NO 50 清华大学 郑莉JAVA语言程序设计 这两个例子equals() 和前面的String类有何 不同,到底是什么原 因? 51 清华大学 郑莉JAVA语言程序设计 l相等和同一的概念 两个对象具有相同的类型,及相同的属性值, 则称二者相等(equal) 如果两个引用变量指向的是同一个对象,则称 这两个变量(对象)同一(identical=) 两个对象同一,则肯定相等 两个对象相等,不一定同一 比较运算符“=” 判断的是这两个对象是否同一 (即对象地址是否相同) 4.2 Object类(续) 相等和同一 Object类 52 清华大学 郑莉JAVA语言程序设计 l判断两个对象是否同一 public class Exam4_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.out.println(“NO“); lBankAccount类在2.5.1中声明,此程序运行的结果 为“NO”,原因是使用等号“=”判断的是两个对象是 否同一,显然a和b是两个对象 4.2 Object类(续) 例4_7 Object类 53 清华大学 郑莉JAVA语言程序设计 l修改刚才的程序 public class Exam4_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“); l将a所指对象的引用赋给b,因此a与b指向的是同一 个对象,a与b同一。输出结果为“YES” 4.2 Object类(续) 例4_7 Object类 54 清华大学 郑莉JAVA语言程序设计 lequals 方法 由于Object是类层次结构中的树根节点, 因此所有其他类都继承了equals()方法 Object类中的 equals() 方法的定义如下, public boolean equals(Object x) return this = x; 4.2 Object类(续) equals方法 Object类 比较接收对象与参数对象是否是同一个对象,即 对象地址是否相同。因此,Object中的equals()方法 判断的是两个对象是否同一,而不是属性值是否相同。 可见,也是判断两个对象是否同一 55 清华大学 郑莉JAVA语言程序设计 lObject类中equals方法的使用举例 public class EqualsTest public 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.println(“YES“); else System.out.println(“NO“); l由于不是同一对象,运行结果仍然是“NO” 4.2 Object类(续) 例4_8 56 清华大学 郑莉JAVA语言程序设计 lequlas方法的重写 要判断两个对象各个属性域的值是否相 同,则不能使用从Object类继承来的 equals方法,而需要在类声明中对 equals方法进行重写 答案:String类中已经重写了Object类 的equals方法,可以判别两个字符串是 否内容相同 4.2 Object类(续) equals方法 的重写 Object类 57 清华大学 郑莉JAVA语言程序设计 l在BankAccount类中增加equals方法,由于是对 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() 4.2 Object类(续) equals方法 的重写 Object类 58 清华大学 郑莉JAVA语言程序设计 lequals方法的应用举例 public class Apple private String color; 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; public String getColor() return color; public boolean getRipe() return ripe; public String toString() if (ripe) return(“A ripe “ + color + “ apple“); else return(“A not so ripe “ + color + “ apple“); Object类 4.2 Object类(续) 例4_9 59 清华大学 郑莉JAVA语言程序设计 public boolean equals(Object obj) if (obj instanceof Apple) Apple a = (Apple) obj; return (color.equals(a.getColor() return false; public class AppleTester public static void main(String args) Apple 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); 4.2 Object类(续) 例4_9 Object类 60 清华大学 郑莉JAVA语言程序设计 l运行结果 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 4.2 Object类(续) 例4_9运行结果 Object类 61 清华大学 郑莉JAVA语言程序设计 lClone方法 根据已存在的对象构造一个新的对象 在根类Object 中被定义为protected, 所以需要覆盖为public 实现Cloneable 接口,赋予一个对象被 克隆的能力(cloneability) class MyObject implements Cloneable / Object类 4.2 Object类(续) Clone方法 62 清华大学 郑莉JAVA语言程序设计 lgetClass方法 final 方法,返回一个Class对象,用来代表对 象隶属的类 通过Class 对象,你可以查询Class对象的各种 信息:比如它的名字,它的基类,它所实现接 口的名字等。 void PrintClassName(Object obj) System.out.println(“The Objects class is “ + obj.getClass().getName(); 4.2 Object类(续) getClass方法 Object类 63 清华大学 郑莉JAVA语言程序设计 lnotify、notifyAll、wait方法 final方法,不能覆盖 这三个方法主要用在多线程程序中 4.2 Object类(续) notify、notifyAll、wait 方法 Object类 64 清华大学 郑莉JAVA语言程序设计 4.3 终结类与终结方法 l终结类与终结方法 被final修饰符修饰的类和方法 终结类不能被继承 终结方法不能被当前类的子类重写 65 清华大学 郑莉JAVA语言程序设计 4.3.1 终结类 l终结类的特点 不能有派生类 l终结类存在的理由 安全: 黑客用来搅乱系统的一个手法是建 立一个类的派生类,然后用他们的类代 替原来的类 设计: 你认为你的类是最好的或从概念上 你的类不应该有任何派生类 终结类与终结方法 66 清华大学 郑莉JAVA语言程序设计 l声明ChessAlgorithm 类为final 类 final class ChessAlgorithm . . . l如果写下如下程序: class BetterChessAlgorithm extends ChessAlgorithm 编译器将显示一个错误 Chess.java:6: Cant subclass final classes: class ChessAlgorithm class BetterChessAlgorithm extends ChessAlgorithm 1 error 4.3.1 终结类(续) 一个例子 终结类与终结方法 final类不能被继承 67 清华大学 郑莉JAVA语言程序设计 l终结方法 不能被当前类的子类所重载的方法 l终结方法的特点 当前类的子类不能再重新声明与此方法同名的 方法 子类只能继承该方法 l终结方法存在的理由 防止子类对父类重要方法的错误重写 4.3.2 终结方法 终结类与终结方法 68 清华大学 郑莉JAVA语言程序设计 4.3.1 终结方法(续) 例4_10 lfinal 方法举例 class Parent public Parent() /构造方法 final int getPI() return Math.PI; /终结方法 l说明 getPI()是用final修饰符声明的终结方法,不能在子 类中对该方法进行重载,因而如下声明是错的 Class Child extends Parent public Child() /构造方法 int getPI() return 3.14; /重写父类中的终结方 法,不允许 终结类与终结方法 69 清华大学 郑莉JAVA语言程序设计 4.4 抽象类 l抽象类 代表一个抽象概念的类 没有具体实例对象的类,不能使用new方法进 行实例化 类前需加修饰符abstract 可包含常规类能够包含的任何东西,例如构造 方法,非抽象方法;也可包含抽象方法,这种 方法只有方法的声明,而没有方法的实现 70 清华大学 郑莉JAVA语言程序设计 l存在意义 抽象类是类层次中较高层次的概括,抽象类的 作用是让其他类来继承它的抽象化的特征 抽象类中可以包括被它的所有子类共享的公共 行为 抽象类可以包括被它的所有子类共享的公共属 性 在程序中不能用抽象类作为模板来创建对象; 在用户生成实例时强迫用户生成更具体的实例 ,保证代码的安全性 抽象类 4.4 抽象类(续) 存在意义 71 清华大学 郑莉JAVA语言程序设计 l将所有图形的公共属性及方法抽象到抽象类Shape。再将2D及 3D对象的特性分别抽取出来,形成两个抽象类 TwoDimensionalShape及ThreeDimensionalShape 2D图形包括Circles、Triangles、Rectangles和Squares 3D图形包括Cube、Sphere、或Tetrahedron 在UML中,抽象类的类名为斜体,以与具体类相区别 4.4 抽象类(续) 几何形状的例子 Shape CircleTriangle Rectangle Square TwoDimensionalShapeThreeDimensionalShape CubeSphere Tetrahedron 抽象类 72 清华大学 郑莉JAVA语言程序设计 l例4-6中,如果在应用系统中涉及到的人员只包括: Customers,Employees 及 Managers。则Person 类的子类对象覆盖了应用中的对象,可以将Person 类声明为抽象类 4.4 抽象类(续) 人员的例子 Person Employee Manager Customer 抽象类 73 清华大学 郑莉JAVA语言程序设计 4.4.1 抽象类的声明 l抽象类声明的语法形式为 abstract class Number . . . 如果

温馨提示

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

评论

0/150

提交评论