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

下载本文档

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

文档简介

1、第四章 类的重用Java 2 实用程序-4.8-4.20(不含4.13)JAVA语言程序设计1目录4.1 类的继承4.2 Object类 4.3 终结类与终结方法4.4 抽象类4.5 类的组合 4.6 包的应用4.7 本章小结24.1 类的继承继承是一种由已有的类创建新类的机制父类是所有子类的公共属性及方法的集合,子类则是父类的特殊化, 子类根据需要增加它自己的新的状态和行为。Java只支持类的单继承,每个子类只能有一个直接父类继承机制可以提高程序的抽象程度,提高代码的可重用性在Java中每个类均为Object 的子类。(java.lang)3一、 继承的概念基类和派生类基类(base cla

2、ss)也称超类、父类(superclass)是被直接或间接继承的类派生类(derived-class)也称子类 (subclass)继承其他类而得到的类继承所有祖先的状态和行为派生类可以增加变量和方法派生类也可以覆盖(override)继承的方法4一、 继承的概念is_a关系子类对象与父类对象存在“IS A”(或“is kind of”)的关系5动物类层次举例一、 继承的概念举例一般具体动物蛇蜥蜴鲸爬行动物哺乳动物狗巨蜥 壁虎壁虎 是一种 蜥蜴 爬行动物是 动物的 一种6错误的基础关系(HAS A)汽车发动机制动装置7二、 子类声明在类的声明中,通过使用关键字extends来创建一个类的子类,

3、格式如下:class childClass extends parentClass /类体8在一个公司中,有普通员工(Employees)及管理人员(Magagers)两类人员普通员工对象(Employees)可能有的属性信息包括员工号(employeeNumber)姓名(name)地址(address)电话号码(phoneNumber)管理人员(Managers)除具有普通员工的属性外,还可能具有下面的属性职责(responsibilities)所管理的职员(listOfEmployees)三、 子类的继承性 类的设计举例9Employee与Manager的类图三、 子类的继承性 类的设计举

4、例EmployeeemployeeNumbe : intname : Stringaddress : StringphoneNumber : StringManagerresponsibilities:StringlistOfEmployees:String父类子类10/父类Employeeclass Employee int employeeNumbe ; String name, address, phoneNumber ; public void work();/子类Managerclass Manager extends Employee /子类增加的成员变量 String respo

5、nsibilities, listOfEmployees;11EmployeeemployeeNumbe : intaddress : StringphoneNumber : Stringwork(): voidManagerresponsibilities:Stringmanage():voidpersonName:String12三、 子类的继承性类可以有两种重要的成员成员变量成员方法子类的成员中有一部分是子类自己声明定义的,另一部分是从它的父类继承的子类继承父类可分两种情况子类与父类同在一个包中子类与父类不在同一个包中 13子类和父类在同一包中的继承性 如果子类和父类在同一个包中,那么,

6、子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且也自然地继承了父类中不是private的方法作为自己的方法, 继承的成员变量或方法的访问权限保持不变。例子:workspace/inherite/Example4_15.java 14public 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 hob

7、by;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

8、.hobby); 子类不能继承子类新增属性我是儿子两只手 两只脚一个头身高:1.8120喜欢上网,有时上课还睡觉:)15子类和父类不在同一包中的继承性 如果子类和父类不在同一个包中,子类可继承父类的protected、public成员变量做为子类的成员变量,并且可继承父类的protected、public方法为子类的方法, 继承的成员变量或方法的访问权限保持不变。如果子类和父类不在同一个包中,子类不能继承父类的友好变量和友好方法。16例子:Example4/inherite/ABC.java Example4/DEF.javapackage inherite;public class ABC

9、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中不是公共的,无法从外部软件包中进行访问17public class

10、 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 resp

11、onsibilities; 4.1.2 继承的语法(续)例4_2 类的继承18public 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.employeeNumbe

12、r = 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运行结果Li Ming123456He Xia543469Internet project说明子类不能直接访问从父类中继承的私有属性及方法,但可使用公有(及保护)方法进行访问4.1.2 继承的语法(续

13、)例4_2测试结果 类的继承20public 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

14、 类的继承是否有问题?214.1.3 隐藏和覆盖隐藏和覆盖子类对从父类继承来的属性变量及方法可以重新定义类的继承22属性的隐藏子类中声明了与父类中相同的成员变量名,则从父类继承的变量将被隐藏子类拥有了两个相同名字的变量,一个继承至父类,另一个由自己声明当子类执行继承至父类的操作时,处理的是继承至父类的变量,而当子类执行它自己声明的方法时,所操作的就是它自己声明的变量4.1.3 隐藏和覆盖(续)属性的隐藏 class Parent int aNumber;class Child extends Parent float aNumber;类的继承23如何访问被隐藏的父类属性调用从父类继承的方法,则

15、操作的是从父类继承的属性使用super.属性4.1.3 隐藏和覆盖(续)访问被隐藏的父类属性类的继承24属性的隐藏举例class A1 int 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); 类的继承 A1 a1 = new

16、 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();25public 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

17、); / 将继承来的x值设置为6 b1.printb(); b1.printa(); a1.printa(); 4.1.3 隐藏和覆盖(续)例4_4测试类的继承26运行结果4super.x= 12 x= 10012super.x= 16 x= 1001644.1.3 隐藏和覆盖(续)例4_4运行结果类的继承27 注意:子类不能继承父类中的静态属性,但可以对父类中的静态属性进行操作。在上面的例子中,将“int x = 2;”改为“static int x = 2;”,再编译及运行程序,会得到什么结果?隐藏和覆盖(续)举例4super.x= 14 x= 10014super.x= 16 x= 10

18、01616所有对象的类变量分配相同的内存空间改变其中一个对象的这个类变量将会影响其它对象的这个类变量返回28使用super调用父类的构造方法子类不继承父类的构造方法,因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用,并且必须使用关键字super来表示,而且super必须是子类构造方法中的头一条语句。 注意:如果在子类的构造方法中没有使用super调用父类的某个构造方法,默认为调用父类不带参数的构造方法如果父类定义了多个构造方法,那么Java不提供默认构造方法。因此,当在父类中定义多个构造方法时,应包括一个无参构造方法例子:Example4_2329方法覆盖如果子类不需使用从父类继

19、承来的方法的功能,则可以声明自己的同名方法,称为方法覆盖覆盖方法的返回类型、方法名称、参数的个数及类型必须和被覆盖的方法一样只需在方法名前面使用不同的类名或不同类的对象名即可区分覆盖方法和被覆盖方法SuperTest(见后)方法覆盖时,不能降低方法的访问权限。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方法覆盖的应用场合子

20、类中实现与父类相同的功能,但采用不同的算法或公式 在名字相同的方法中,要做比父类更多的事情 在子类中需要取消从父类继承的方法隐藏和覆盖(续)方法覆盖的应用场合31容易混淆的概念方法的重载(method overloading)方法的覆盖(method overriding)方法覆盖(override):如果子类不需使用从父类继承来的方法的功能,则可以声明自己的同名方法,称为方法覆盖。覆盖方法的返回类型,方法名称,参数的个数及类型必须和 被覆盖的方法一样。子类方法不能缩小父类方法的访问权限 。不能抛出比subclass(父类)更多的异常 。方法重载(overload):一个类中可以有多个方法具有

21、相同的名字,但这些方法的参数必须不同,或者是参数的个数不同,或者是参数的类型不同, 或者方法的返回类型不相同、访问修饰不同 。重载的目的是允许通过使用一个方法名来访问多个方法。32必须覆盖的方法派生类必须覆盖基类中的抽象的方法,否则派生类自身也成为抽象类.不能覆盖的方法基类中声明为final的终结方法(保持操作的稳定性)基类中声明为static 的静态方法调用被覆盖的方法super.overriddenMethodName();4.1.3 隐藏和覆盖(续)方法覆盖的注意事项类的继承334.1.4 有继承时的构造方法有继承时的构造方法遵循以下的原则子类不能从父类继承构造方法好的程序设计方法是在子

22、类的构造方法中调用某一个父类构造方法,调用语句必须出现在子类构造方法的第一行,可使用super关键字如子类构造方法的声明中没有明确调用父类构造方法,则系统在执行子类的构造方法时会自动调用父类的默认构造方法(即无参的构造方法)类的继承34public class Person protected String name, phoneNumber, address; public Person() this(, , ); public Person(String aName, String aPhoneNumber, String anAddress) name=aName; phoneNumbe

23、r=aPhoneNumber; address=anAddress; 4.1.4 有继承时的构造方法(续)例4_5 类的继承35public class Employee extends Person protected int employeeNumber; protected String workPhoneNumber; public Employee() /此处隐含调用构造方法 Person() this(0, ); public Employee(int aNumber, String aPhoneNumber) /此处隐含调用构造方法 Person() employeeNumber

24、=aNumber; workPhoneNumber = aPhoneNumber; 4.1.4 有继承时的构造方法(续)例4_5 类的继承36Super关键字如果我们在子类中想使用被子类隐藏了的父类的成员变量或方法就可以使用关键字super。比如:super.x、super.play(),就是被子类隐藏的父类的成员变量x和方法play()。 37public class Professor extends Employee protected String research; public Professor() super(); research = ; public Professor(i

25、nt aNumber, String aPhoneNumber, String aResearch) super(aNumber, aPhoneNumber); research = aResearch; 4.1.4 有继承时的构造方法(续)例4_5 类的继承38public class Professor extends Employee protected String research; public Professor() super(); research = ; public Professor(int aNumber, String aPhoneNumber, String aR

26、esearch) super(aNumber, aPhoneNumber); research = aResearch; 4.1.4 有继承时的构造方法(续)例4_5 类的继承39在一个公司管理信息系统中,包括普通员工(Employees),其可能有的属性信息包括员工号(employeeNumber)姓名(name)地址(address)电话号码(phoneNumber)管理者(Magagers),除具有普通员工所具有的属性及行为外,还具有下面的属性和行为职责(responsibilities)所管理的职员(listOfEmployees)工资的计算方法与一般员工不同;福利与一般员工不同顾客(

27、Customers),可能有的属性信息包括姓名(name)地址(address)电话号码(phoneNumber)4.1.5 应用举例例4_6 类的继承40类层次结构4.1.5 应用举例(续)例4_6 PersonEmployeeManagerCustomer类的继承414.2 Object 类Object类Java库类是系统提供的已实现的标准类的集合,是Java的APIObject类是Java程序中所有类的直接或间接父类,类库中所有类的父类,处在类层次最高点包含了所有Java类的公共属性,其构造方法是Object( )42Object类定义了所有对象必须具有的状态和行为,较主要的方法如下pu

28、blic final Class getClass() 获取当前对象所属的类信息,返回Class对象public String toString() 返回当前对象本身的有关信息,按字符串对象返回public boolean equals(Objectobj) 比较两个对象是否是同一对象,是则返回trueprotected Object clone( ) 生成当前对象的一个拷贝,并返回这个复制对象Public int hashCode() 返回该对象的哈希代码值protected void finalize() throws Throwable 定义回收当前对象时所需完成的资源释放工作4.2 O

29、bject类(续)包含的主要方法 Object类43相等与同一补充1:equals()和“”的区别“”可用于比较基本数据类型和引用型比较两个基本数据类型时,如果两个的值相同,则返回true比较两个引用类型时,如果两个引用的地址相同,则返回trueequals()用于比较两个对象的值是否相同44 补充2: String str1=“aaa”; String str1=new String(“aaa”); 的区别?常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。 str1 属于字符串常

30、量,被创建时的地址为常量池中,如果常量池中已有相同字符串常量,则新创建的常量将指向已有的引用;如果没有,则使用String中的intern()在常量池中增加一个Unicode等于str的字符串,并返回它的引用。(注:于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值 )使用new String()创建的是对象,不同对象指向不同的内存地址。45举例String str1=“aaa”;String str2=“aaa”;str1 = str2 ; str1.equals(str2);地址同,true值相同,true46String str3 = ne

31、w String(“aaa”); str1=str3; str1.equals(str3); 地址不同,false值相同,true47public 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=st

32、r3)System.out.println(true); elseSystem.out.println(false); if(str1.equals(str3) System.out.println(true); elseSystem.out.println(false); 48先看两个例子public class Exam4_7public static void main(String args) BankAccount a = new BankAccount(Bob, 123456, 100.00f); BankAccount b = new BankAccount(Bob, 12345

33、6, 100.00f); if (a = b) System.out.println(YES); else System.out.println(NO); NO49public 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.println(YES); else Sys

34、tem.out.println(NO); NO50这两个例子equals()和前面的String类有何不同,到底是什么原因?51相等和同一的概念两个对象具有相同的类型,及相同的属性值,则称二者相等(equal)如果两个引用变量指向的是同一个对象,则称这两个变量(对象)同一(identical=)两个对象同一,则肯定相等两个对象相等,不一定同一比较运算符“=” 判断的是这两个对象是否同一(即对象地址是否相同)4.2 Object类(续)相等和同一 Object类52判断两个对象是否同一public class Exam4_7public static void main(String args)

35、 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); BankAccount类在2.5.1中声明,此程序运行的结果为“NO”,原因是使用等号“=”判断的是两个对象是否同一,显然a和b是两个对象4.2 Object类(续)例4_7 Object类53修改刚才的程序public class Exam4_7

36、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); 将a所指对象的引用赋给b,因此a与b指向的是同一个对象,a与b同一。输出结果为“YES”4.2 Object类(续)例4_7 Object类54equals 方法由于Object是类层次结构中的树根节点,因此所有其他类都继承了equals()方法O

37、bject类中的 equals() 方法的定义如下,public boolean equals(Object x) return this = x; 4.2 Object类(续)equals方法 Object类比较接收对象与参数对象是否是同一个对象,即对象地址是否相同。因此,Object中的equals()方法判断的是两个对象是否同一,而不是属性值是否相同。可见,也是判断两个对象是否同一55Object类中equals方法的使用举例public class EqualsTestpublic static void main(String args)BankAccount a = new Ban

38、kAccount(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”4.2 Object类(续)例4_8 56equlas方法的重写要判断两个对象各个属性域的值是否相同,则不能使用从Object类继承来的equals方法,而需要在类声明中对equals方法进行重写答案:String类中已经重写了Object类的e

39、quals方法,可以判别两个字符串是否内容相同4.2 Object类(续)equals方法 的重写Object类57在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.getOwner

40、Name() &(this.getAccountNumber() = b.getAccountNumber() &(this.getBalance() = b.getBalance(); 4.2 Object类(续)equals方法 的重写Object类58equals方法的应用举例public class Apple private String color; private boolean ripe; public Apple(String aColor, boolean isRipe) color = aColor; ripe = isRipe; public void setColor

41、(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_959pu

42、blic boolean equals(Object obj) if (obj instanceof Apple) Apple a = (Apple) obj; return (color.equals(a.getColor() & (ripe = a.getRipe(); 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 +

43、 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_9Object类60运行结果A ripe red apple is equal to A ripe red apple: truea is iden

44、tical to b: falseA ripe red apple is equal to A ripe red apple: truea is identical to c: true4.2 Object类(续)例4_9运行结果Object类61Clone方法根据已存在的对象构造一个新的对象在根类Object 中被定义为protected,所以需要覆盖为public实现Cloneable 接口,赋予一个对象被克隆的能力(cloneability) class MyObject implements Cloneable /Object类4.2 Object类(续)Clone方法 62getCl

45、ass方法final 方法,返回一个Class对象,用来代表对象隶属的类通过Class 对象,你可以查询Class对象的各种信息:比如它的名字,它的基类,它所实现接口的名字等。void PrintClassName(Object obj) System.out.println(The Objects class is + obj.getClass().getName();4.2 Object类(续)getClass方法 Object类63notify、notifyAll、wait方法 final方法,不能覆盖这三个方法主要用在多线程程序中4.2 Object类(续) notify、notify

46、All、wait方法 Object类644.3 终结类与终结方法终结类与终结方法被final修饰符修饰的类和方法终结类不能被继承终结方法不能被当前类的子类重写654.3.1 终结类终结类的特点不能有派生类终结类存在的理由安全: 黑客用来搅乱系统的一个手法是建立一个类的派生类,然后用他们的类代替原来的类设计: 你认为你的类是最好的或从概念上你的类不应该有任何派生类终结类与终结方法66声明ChessAlgorithm 类为final 类final class ChessAlgorithm . . . 如果写下如下程序:class BetterChessAlgorithm extends Chess

47、Algorithm 编译器将显示一个错误Chess.java:6: Cant subclass final classes: class ChessAlgorithmclass BetterChessAlgorithm extends ChessAlgorithm 1 error4.3.1 终结类(续)一个例子 终结类与终结方法final类不能被继承67终结方法不能被当前类的子类所重载的方法终结方法的特点当前类的子类不能再重新声明与此方法同名的方法子类只能继承该方法终结方法存在的理由防止子类对父类重要方法的错误重写4.3.2 终结方法终结类与终结方法684.3.1 终结方法(续)例4_10fi

48、nal 方法举例class Parent public Parent() /构造方法 final int getPI() return Math.PI; /终结方法说明getPI()是用final修饰符声明的终结方法,不能在子类中对该方法进行重载,因而如下声明是错的Class Child extends Parent public Child() /构造方法 int getPI() return 3.14; /重写父类中的终结方法,不允许终结类与终结方法694.4 抽象类抽象类代表一个抽象概念的类没有具体实例对象的类,不能使用new方法进行实例化类前需加修饰符abstract可包含常规类能够包

49、含的任何东西,例如构造方法,非抽象方法;也可包含抽象方法,这种方法只有方法的声明,而没有方法的实现70存在意义抽象类是类层次中较高层次的概括,抽象类的作用是让其他类来继承它的抽象化的特征抽象类中可以包括被它的所有子类共享的公共行为抽象类可以包括被它的所有子类共享的公共属性在程序中不能用抽象类作为模板来创建对象;在用户生成实例时强迫用户生成更具体的实例,保证代码的安全性抽象类4.4 抽象类(续)存在意义71将所有图形的公共属性及方法抽象到抽象类Shape。再将2D及3D对象的特性分别抽取出来,形成两个抽象类TwoDimensionalShape及ThreeDimensionalShape2D图形

50、包括Circles、Triangles、Rectangles和Squares3D图形包括Cube、Sphere、或Tetrahedron在UML中,抽象类的类名为斜体,以与具体类相区别4.4 抽象类(续)几何形状的例子ShapeCircleTriangleRectangleSquareTwoDimensionalShapeThreeDimensionalShapeCubeSphereTetrahedron抽象类72例4-6中,如果在应用系统中涉及到的人员只包括:Customers,Employees 及 Managers。则Person 类的子类对象覆盖了应用中的对象,可以将Person 类声

51、明为抽象类4.4 抽象类(续)人员的例子PersonEmployeeManagerCustomer抽象类734.4.1 抽象类的声明抽象类声明的语法形式为abstract class Number . . .如果写: new Number();抽象类不能用抽象类创建对象744.4.2 抽象方法抽象方法声明的语法形式为public abstract (.);仅有方法头,而没有方法体和操作实现具体实现由当前类的不同子类在它们各自的类声明中完成抽象类可以包含抽象方法抽象类75abstract class A public abstract int min(int x,int y); int max(

52、int x,int y) return xy?x:y; 使用final修饰abstract方法,为什么? 76abstract class A abstract int min(int x,int y); int max(int x,int y) return xy?x:y; class B extends A int min(int x,int y) return xy?x:y; public class Example4_21 public static void main(String args) A a; B b=new B(); int max=b.max(12,34); int m

53、in=b.min(12,34); System.out.println(max=+max+“ min=+min); a=b; max=a.max(12,34); System.out.println(max=+max); 运行结果max=34 min=12max=3477需注意的问题一个抽象类的子类如果不是抽象类,则它必须为父类中的所有抽象方法书写方法体,即重写父类中的所有抽象方法只有抽象类才能具有抽象方法,即如果一个类中含有抽象方法,则必须将这个类声明为抽象类除了抽象方法,抽象类中还可以包括非抽象方法 4.4.2 抽象方法(续)需注意的问题抽象类78抽象方法的优点隐藏具体的细节信息,所有的子

54、类使用的都是相同的方法头,其中包含了调用该方法时需要了解的全部信息强迫子类完成指定的行为,规定其子类需要用到的“标准”行为4.4.2 抽象方法(续)抽象方法的优点抽象类79总结final类: 表示该类不能被继承,没有子类; final类中的方法也无法被继承; final方法: 不能被子类的方法重载, 但可以被继承(使用); 抽象类中可以有具体的实现方法,也可以没有抽象方法; 抽象类中的抽象方法必须被它的子类实现,如果子类 没有实现,则该子类继续为抽象类 抽象类不能被实例化 要使用抽象类中的方法,必须有一个子类继承于这个 抽象类,并实现抽象类中的抽象方法80各种图形都需要实现绘图方法,可在它们的

55、抽象父类中声明一个draw抽象方法abstract class GraphicObject int x, y; void moveTo(int newX, int newY) . . . abstract void draw();4.4.2 抽象方法(续)一个绘图的例子抽象类81然后在每一个子类中重写draw方法,例如:class Circle extends GraphicObject void draw() . . . class Rectangle extends GraphicObject void draw() . . . 4.4.2 抽象方法(续)一个绘图的例子抽象类82LoanL

56、easeMortgageHouseLoanCarLoan贷款(Loan)分为许多种类,如租借(Lease)、抵押(Mortgage)、房屋贷款(HouseLoan)、汽车贷款(CarLoan)等将Loan声明为抽象类,并指定所有的子类对象都应具有的行为,如计算月还款值(calculateMonthlyPayment),还款(makePayment),取得客户信息(getClientInfo),其中前两个因贷款种类不同计算方法也不同,可声明为抽象方法,Loan的所有子类都必须对这两个抽象方法进行重写public abstract class Loan public abstract float

57、calculateMonthlyPayment(); public abstract void makePayment(float amount); public Client getClientInfo() 4.4.2 抽象方法(续)例4_11抽象类834.6 包的应用包为了解决类名冲突,Java提供包来管理类名空间Java利用包来组织相关的类,并控制访问权限包是一种松散的类的集合,利用包来管理类,可实现类的共享与复用同一包中的类在默认情况下可以互相访问,通常把需要在一起工作的类放在一个包里844.6.1 Java 基础类库简介(Java2实用教程-4.18、第5、6章)Java基础类库Ja

58、va提供了用于语言开发的类库,称为Java基础类库(JFC,Java Foundational Class) ,也称应用程序编程接口(API,Application Programming Interface),分别放在不同的包中Java提供的包主要有java.lang,java.io,java.math,java.utiljava.applet,java.awt,java.awt.datatransferjava.awt.event,java.awt.image,java.beans,java.rmi,java.security,java.sql等包的应用85语言包(java.lang)实用

59、包(java.util)文件包(java.text)86语言包(java.lang)语言包java.lang提供了Java语言最基础的类,包括Object类数据类型包裹类(the Data Type Wrapper)字符串类(String、StringBuffer)数学类(Math)系统和运行时类(System、Runtime)类操作类4.6.1 Java基础类库简介(续) 语言包包的应用87数据包裹类对应Java的每一个基本数据类型(primitive data type)都有一个数据包裹类每个包裹类都只有一个类型为对应的基本数据类型的属性域4.6.1 Java基础类库简介(续)数据类型包裹

60、类基本数据类型数据包裹类booleanBooleanbyteBytecharCharactershortShortintIntegerlongLongfloatFloatdoubleDouble包的应用88问题:基本础数据类型和数据包裹类的不同用处在哪? 如: int x=100 和 Integer.valueOf(“100”) 他们有什么区别?什么时候使用? 使用原始数据类型声明的变量,如: int x = 10; 这里的x只是一个变量,而不是对象; 在某些必须操作对象的场合,这样的变量就不能使用了; Java提供一系列包裹类,以便将原始数据类型当作对象进行操作; 89生成数据类型包裹类对象

温馨提示

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

评论

0/150

提交评论