JAVA继承与多态

上传人:m**** 文档编号:569577630 上传时间:2024-07-30 格式:PPT 页数:85 大小:615KB
返回 下载 相关 举报
JAVA继承与多态_第1页
第1页 / 共85页
JAVA继承与多态_第2页
第2页 / 共85页
JAVA继承与多态_第3页
第3页 / 共85页
JAVA继承与多态_第4页
第4页 / 共85页
JAVA继承与多态_第5页
第5页 / 共85页
点击查看更多>>
资源描述

《JAVA继承与多态》由会员分享,可在线阅读,更多相关《JAVA继承与多态(85页珍藏版)》请在金锄头文库上搜索。

1、Java程序程序设计130 七月 2024第7章继承与多态继承与多态Java程序程序设计230 七月 2024u继承性与多态性是面向对象程序设计的另外两个重要特继承性与多态性是面向对象程序设计的另外两个重要特性。性。u在在JavaJava语言中,提供了能够实现继承性与多态性的完备语言中,提供了能够实现继承性与多态性的完备技术,这使得更多的人们愿意将技术,这使得更多的人们愿意将JavaJava作为软件开发语言,作为软件开发语言,进而充分地施展面向对象抽象性、封装性、继承性与多进而充分地施展面向对象抽象性、封装性、继承性与多态性的优势,为构筑新时代的软件开发理念奠定了坚固态性的优势,为构筑新时代的

2、软件开发理念奠定了坚固基础。基础。 Java程序程序设计330 七月 20247.1 7.1 类的继承类的继承u继承机制是面向对象程序设计不可缺少的关键概念,是继承机制是面向对象程序设计不可缺少的关键概念,是实现软件可重用的根基,是提高软件系统的可扩展性与实现软件可重用的根基,是提高软件系统的可扩展性与可维护性的主要途径。可维护性的主要途径。u继承是一种由已有的类创建新类的机制。继承是一种由已有的类创建新类的机制。u所谓继承是指一个类的定义可以基于另外一个已经存在所谓继承是指一个类的定义可以基于另外一个已经存在的类,即子类基于父类,从而实现父类代码的重用。的类,即子类基于父类,从而实现父类代码

3、的重用。u由继承而得到的类称为子类由继承而得到的类称为子类,被继承的类称为父类或超类。被继承的类称为父类或超类。Java不支持多重继承,子类只能有一个父类。不支持多重继承,子类只能有一个父类。Java程序程序设计430 七月 2024继承关系的继承关系的UMLUML图形符号表示法图形符号表示法 u两个类的继承关系可以用两个类的继承关系可以用“is ais a”表示,即子类是父类所描述的实表示,即子类是父类所描述的实体集中的子集。体集中的子集。u也就是说,父类涵盖更加共性的特征,更加具有一般性,子类增加也就是说,父类涵盖更加共性的特征,更加具有一般性,子类增加的内容更加具有个性,是一般性之外的特

4、殊内容,因此,又可以说,的内容更加具有个性,是一般性之外的特殊内容,因此,又可以说,这种类的继承关系充分地反映了这种类的继承关系充分地反映了“一般与特殊一般与特殊”的关系。的关系。Java程序程序设计530 七月 20247.1.1 7.1.1 定义子类定义子类u在在JavaJava语言中,定义子类的语法格式为:语言中,定义子类的语法格式为: 修饰符修饰符 class class 子类名子类名 extends extends 父类名父类名 子类体子类体 u其中,其中,“修饰符修饰符”是子类的访问特性说明符等;是子类的访问特性说明符等;uclassclass为定义类的关键字,为定义类的关键字,u

5、“子类名子类名”是子类的名称;是子类的名称;uextendsextends是关键字是关键字u“子类体子类体”是子类在继承父类内容的基础上,添加的特有内容。是子类在继承父类内容的基础上,添加的特有内容。 Java程序程序设计630 七月 2024EmployeeClassEmployeeClass类与类与ManagerClassManagerClass类的关系图类的关系图 Java程序程序设计730 七月 2024/ file name:EmployeeClass.javapublic class EmployeeClass / 雇员类雇员类private String name;/ 姓名姓名p

6、rivate double salary;/ 工资工资private String department;/ 部门部门public EmployeeClass() . public EmployeeClass(String name, double salary, String department) . public void setName(String name) . public void setSalary(double salary) . public void setDepartment(String department) . public String getName() .

7、 public double getSalary() . public String getDeparyment() . public String toString() . Java程序程序设计830 七月 2024public ManagerClass extends EmployeeClass / 经理类经理类private double special; / 特殊津贴特殊津贴public ManagerClass() . public ManagerClass(String name, double salary, String department, double special)

8、. public void setSpecial(double special) . public double getSpecial() . public String toString() . Java程序程序设计930 七月 2024举例:设计与几何图元有关的类。举例:设计与几何图元有关的类。 问题分析问题分析:几何图元几何图元是指可以绘制的基本几何图形,例如矩形、正是指可以绘制的基本几何图形,例如矩形、正方形、圆形、多边形等。鉴于篇幅的考虑,这里只考虑矩形与正方方形、圆形、多边形等。鉴于篇幅的考虑,这里只考虑矩形与正方形。形。 假设任何几何图元都有颜色与位置两个属性,因此应该将这些共有

9、假设任何几何图元都有颜色与位置两个属性,因此应该将这些共有特性定义在一个类中,它是顶层类;而特性定义在一个类中,它是顶层类;而矩形矩形还应该有长、宽两个属还应该有长、宽两个属性,由于矩形是一种几何图元,所以它自然应该拥有几何图元的共性,由于矩形是一种几何图元,所以它自然应该拥有几何图元的共有特性,因此可以将矩形类设计为几何图元类的子类;因为有特性,因此可以将矩形类设计为几何图元类的子类;因为正方形正方形是一种特殊的矩形,它的特殊性在于长与宽相等,所以应该将正方是一种特殊的矩形,它的特殊性在于长与宽相等,所以应该将正方形类设计为矩形的子类。形类设计为矩形的子类。 Java程序程序设计1030 七

10、月 2024ShapeClass类、类、RectangleClass类与类与SquareClass类之间的关系类图类之间的关系类图 ShapeClass类是几何图元的通用类;矩形是一种特定的几何图元,因此,类是几何图元的通用类;矩形是一种特定的几何图元,因此,RectangleClass类应该是类应该是ShapeClass的子类;正方形是一种特殊的矩形,的子类;正方形是一种特殊的矩形,所以所以SquareClass类是类是RectangleClass类的子类。类的子类。 Java程序程序设计1130 七月 2024Java程序程序设计1230 七月 2024/ file name:ShapeC

11、lass.javaimport java.util.*;public class ShapeClass / 几何图元类几何图元类 private ColorClass color; / 颜色属性颜色属性 private Point place; / 位置属性位置属性 public ShapeClass() color = new ColorClass(); place = new Point(); public ShapeClass(ColorClass color, Point place) this.color = color; this.place = place; public voi

12、d setColor(ColorClass color) this.color = color; public void setPlace(Point place) this.place = place; public ColorClass getColor() return color; public Point getPlace() return place; public String toString() return color.toString() + n + place.toString(); Java程序程序设计1330 七月 2024/ file name:Rectangle

13、Class.javapublic class RectangleClass extends ShapeClass / 矩形类矩形类private int length; / 长长private int width; / 宽宽public RectangleClass() super(); length = 0; width = 0;public RectangleClass(ColorClass color, Point place, int length, int width) super(color, place); this.length = length; this.width = w

14、idth;public int area() return length * width; / 计算矩形的面积计算矩形的面积public int permeter() return 2* (length * width); / 计算矩形的周长计算矩形的周长public int getLength() return length; public int getWidth() return width; public void setLW(int length, int width) this.length = length; this.width = width; public String t

15、oString() return length: + length + width: + width; Java程序程序设计1430 七月 2024/ file name:SquareClass.javapublic class SquareClass extends RectangleClass / 正方形类正方形类public SquareClass() super(); public SquareClass(ColorClass color, Point place, int edge) super(color, place, edge,edge); public int getEdge

16、() return getLength(); public void setEdge(int edge) setLW(edge, edge); Java程序程序设计1530 七月 20247.1.2 7.1.2 子类对父类成员的可访问特性子类对父类成员的可访问特性l实际上,子类是对父类概念的延伸,它不但继承了父类实际上,子类是对父类概念的延伸,它不但继承了父类的内容,还可以扩展父类的某些功能。的内容,还可以扩展父类的某些功能。l在在JavaJava语言中,子类将继承父类的成员,但对父类成员语言中,子类将继承父类的成员,但对父类成员的可访问性却由访问特性控制。的可访问性却由访问特性控制。l如果子

17、类与父类在同一个包中,子类可以直接访问父类如果子类与父类在同一个包中,子类可以直接访问父类具有具有publicpublic、protecedproteced与默认访问特性的成员,不能直与默认访问特性的成员,不能直接访问接访问privateprivate成员,这部分内容需要通过父类提供的操成员,这部分内容需要通过父类提供的操作接口实现间接访问。作接口实现间接访问。u如果子类和父类不在同一个包中,那么,子类如果子类和父类不在同一个包中,那么,子类继承了父继承了父类的类的protected、public成员变量成员变量做为子类的成员变量,做为子类的成员变量,并且并且继承了父类的继承了父类的prote

18、cted、public方法方法为子类的方法,为子类的方法,继承的成员或方法的继承的成员或方法的访问权限访问权限保持不变。保持不变。u Java程序程序设计1630 七月 2024子类对象的构造过程用用子子类类创创建建对对象象时时,不不仅仅子子类类中中声声明明的的成成员员变变量量被被分分配配了了内内存存,而而且且父父类类的的成成员员变变量量也也都都分分配配了了内内存存空空间间,但但只只将将其其中中一一部部分分(子子类类继继承承的的那那部部分分)作作为为分配给子类对象的变量分配给子类对象的变量。 Java程序程序设计1730 七月 2024Java程序程序设计1830 七月 2024Java程序程

19、序设计1930 七月 20247.1.3 7.1.3 子类构造方法的定义与执行子类构造方法的定义与执行在在JavaJava程序中,子类不负责调用父类中带参数的构造方法。程序中,子类不负责调用父类中带参数的构造方法。在创建子类对象时需要在构造方法中利用在创建子类对象时需要在构造方法中利用super(super() ) 调用父类的构调用父类的构造方法,以便能够对从父类继承过来的成员变量初始化。造方法,以便能够对从父类继承过来的成员变量初始化。JavaJava语言规定,必须将调用父类构造方法的这条语句放在子类构造语言规定,必须将调用父类构造方法的这条语句放在子类构造方法的第一条语句位置。如果第一条语

20、句没有调用父类的构造方法,方法的第一条语句位置。如果第一条语句没有调用父类的构造方法,系统将会自动地在这个位置上插入一条调用父类默认构造方法的语系统将会自动地在这个位置上插入一条调用父类默认构造方法的语句。句。Java程序程序设计2030 七月 2024由于默认的构造方法不带参数,所以,如果在父类中定由于默认的构造方法不带参数,所以,如果在父类中定义了带参数的构造方法,而没有定义不带参数的构造方义了带参数的构造方法,而没有定义不带参数的构造方法将会出现编译错误。这也正是建议大家在定义带参数法将会出现编译错误。这也正是建议大家在定义带参数的构造方法时,一定要定义一个不带参数的构造方法的的构造方法

21、时,一定要定义一个不带参数的构造方法的原因所在。原因所在。父类中那些带参数的构造方法,子类将不会自动地调用父类中那些带参数的构造方法,子类将不会自动地调用它们,必须人工地将调用它们的语句写入子类的构造方它们,必须人工地将调用它们的语句写入子类的构造方法中。法中。Java程序程序设计2130 七月 2024supersuper关键字关键字u子类可以隐藏从父类继承的成员变量和方法,如果在子类可以隐藏从父类继承的成员变量和方法,如果在子类中想使用被子类隐藏的成员变量或方法就可以使子类中想使用被子类隐藏的成员变量或方法就可以使用关键字用关键字super。u使用使用super调用父类的构造方法调用父类的

22、构造方法 子类不继承父类的构造方法,因此,子类如果想子类不继承父类的构造方法,因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用,使用父类的构造方法,必须在子类的构造方法中使用,并且必须使用关键字并且必须使用关键字super来表示,而且来表示,而且super必须是必须是子类构造方法中的头一条语句。子类构造方法中的头一条语句。Java程序程序设计2230 七月 2024例:例:public class Student int number; String name; Student() Student(int number,String name) this.number=numbe

23、r; this.name=name; public int getNumber() return number; public String getName() return name; public class UniverStudent extends Student boolean isMarriage; /子子类新增的新增的结婚属性婚属性 UniverStudent(int number,String name,boolean b) super(number,name); public boolean getIsMarriage() return isMarriage; Java程序程

24、序设计2330 七月 2024使用super操作被隐藏的成员变量和方法u在子类中想使用被子类隐藏的成员变在子类中想使用被子类隐藏的成员变量或方法就可以使用关键字量或方法就可以使用关键字super。u 比如比如super.x、super.play()就是访问就是访问和调用被子类隐藏的成员变量和调用被子类隐藏的成员变量x和方法和方法play()。Java程序程序设计2430 七月 2024例:例:public class Sum int n; public double f() double sum=0; for(int i=1;i=n;i+) sum=sum+i; return sum; pub

25、lic class Average extends Sum double n; /子子类继承的承的int型型变量量n被被隐藏藏 public double f() double c; /子子类double型型变量量n进行行int转换运算的运算的结果果赋值给隐藏的藏的int型型变量量n super.n=(int)n; c=super.f(); return c+n; public double g() double c; c=super.f(); return c-n; Java程序程序设计2530 七月 2024this 关键字uthis是Java的一个关键字,表示某个对象。this可以出现在

26、实例方法和构造方法中,但不可以出现在类方法中。u在构造方法中使用在构造方法中使用thisuthis关键字出现在类的构造方法中时,代表使用该构造关键字出现在类的构造方法中时,代表使用该构造方法所创建的对象。方法所创建的对象。Java程序程序设计2630 七月 2024在实例方法中使用thisu当当this关键字出现实例方法中时,代表正在调用该方法关键字出现实例方法中时,代表正在调用该方法的当前对象。的当前对象。u 当实例成员变量在实例方法中出现时,默认的格式是:当实例成员变量在实例方法中出现时,默认的格式是:this.成员变量。成员变量。u 当当static成员变量在实例方法中出现时,默认的格式

27、成员变量在实例方法中出现时,默认的格式是:是:类名类名.成员变量。成员变量。 Java程序程序设计2730 七月 2024例:例:this的使用的使用public class People int leg,hand; String name; People(String s) name=s; this.init(); /可以省略this,即将this.init();写成init(); void init() leg=2; hand=2; System.out.println(name+有+hand+只手+leg+条腿); public static void main(String args)

28、 People boshi=new People(布什); /当调用构造方法People创建boshi时,其中的this就是对象boshi Java程序程序设计2830 七月 2024final关键字关键字1) final修饰成员变量如果一个成员变量前面有final修饰,那么这个成员变量就变成了常量,一经赋值,就不允许在程序的其他地方修改。u定义方式如下: final type variableName;例如class ConstTimeExpress final int MaxHour=23; final int MaxMinute=59; final int MaxSecond=59;Ja

29、va程序程序设计2930 七月 20242) final修饰方法修饰方法 方法的方法的final修饰符表明方法不能被子类覆盖。带有修饰符表明方法不能被子类覆盖。带有final修饰符的方法称为最终方法。修饰符的方法称为最终方法。Java的方法除非被说的方法除非被说明为最终方法,否则方法是可以被覆盖的。明为最终方法,否则方法是可以被覆盖的。Java之所以这之所以这样规定,主要是因为样规定,主要是因为Java的纯面向对象特性,它把覆盖当的纯面向对象特性,它把覆盖当作面象对象的重要特性,给予了最大限度的实现。作面象对象的重要特性,给予了最大限度的实现。 把方法声明为最终方法有时可增加代码的安全性。把方

30、法声明为最终方法有时可增加代码的安全性。u使用方式如下。使用方式如下。 final returnType methodName(paramList) u例如:例如: final int getLength(String s) Java程序程序设计3030 七月 20243)final类类ufinal类不能被继承。类不能被继承。u由于安全性的原因或者是面向对象的设计上的考虑,由于安全性的原因或者是面向对象的设计上的考虑,有时候希望一些类不能被继承,例如,有时候希望一些类不能被继承,例如,Java中的中的String类,它对编译器和解释器的正常运行有很重要的类,它对编译器和解释器的正常运行有很重要

31、的作用,不能轻易改变它,因此把它修饰为作用,不能轻易改变它,因此把它修饰为final类,使类,使它不能被继承,这就保证了它不能被继承,这就保证了String类型的唯一性。同时,类型的唯一性。同时,如果你认为一个类的定义已经很完美,不需要再生成如果你认为一个类的定义已经很完美,不需要再生成它的子类,这时也应把它修饰为它的子类,这时也应把它修饰为final类。类。u定义一个定义一个final类的格式如下:类的格式如下: final class finalClassName Java程序程序设计3130 七月 20247.2 7.2 类成员方法的重载与覆盖类成员方法的重载与覆盖成员的隐藏成员的隐藏u

32、在子类继承父类成员的同时,子类自己还可以定义新的在子类继承父类成员的同时,子类自己还可以定义新的成员。成员。u当子类中定义的新成员变量与父类中某个成员变量的名当子类中定义的新成员变量与父类中某个成员变量的名字相同时,子类会把父类中的相应成员变量隐藏起来。字相同时,子类会把父类中的相应成员变量隐藏起来。u当子类中定义的成员方法与父类中某个成员方法的名字当子类中定义的成员方法与父类中某个成员方法的名字相同时属于成员方法的重载或覆盖,这是常用的程序设相同时属于成员方法的重载或覆盖,这是常用的程序设计技术。计技术。 Java程序程序设计3230 七月 20247.2.1 7.2.1 重载与覆盖重载与覆

33、盖u在子类中,除了从父类继承的成员方法之外,还可以自定义一些成在子类中,除了从父类继承的成员方法之外,还可以自定义一些成员方法,其中主要包括下列几种形式:员方法,其中主要包括下列几种形式:u在父类中没有的、全新的成员方法。在父类中没有的、全新的成员方法。u对父类中已有的成员方法进行重载。对父类中已有的成员方法进行重载。u对父类中已有的成员方法进行覆盖。对父类中已有的成员方法进行覆盖。 u方法覆盖方法覆盖的语法规则的语法规则 如果子类可以继承父类的某个实例方法,那么子类就有权利重如果子类可以继承父类的某个实例方法,那么子类就有权利重写这个方法。写这个方法。 方法重写是指:子类中定义一个方法,这个

34、方法的类型和父类方法重写是指:子类中定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型,并且这个的方法的类型一致或者是父类的方法的类型的子类型,并且这个方法的名字、参数个数、参数的类型和父类的方法完全相同。方法的名字、参数个数、参数的类型和父类的方法完全相同。 u方法覆盖方法覆盖的目的的目的子类通过方法的重写可以隐藏继承的方法,子类通过方法的重写子类通过方法的重写可以隐藏继承的方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。可以把父类的状态和行为改变为自身的状态和行为。Java程序程序设计3330 七月 20241.1.成员方法的重载成员方法

35、的重载u成员方法的重载是指当子类中定义与父类中同名的成员成员方法的重载是指当子类中定义与父类中同名的成员方法,但参数列表不同,或者在一个类中定义多个同名方法,但参数列表不同,或者在一个类中定义多个同名的成员方法,但它们之间的参数列表不同。的成员方法,但它们之间的参数列表不同。u无论是在子类与父类之间重载成员方法,还是在一个类无论是在子类与父类之间重载成员方法,还是在一个类中重载成员方法,其主要目的都是为了扩展操作的接口中重载成员方法,其主要目的都是为了扩展操作的接口格式,使之更加适于人们的操作习惯,提高软件系统操格式,使之更加适于人们的操作习惯,提高软件系统操作的方便性与灵活性。作的方便性与灵

36、活性。Java程序程序设计3430 七月 2024EmployeeClass / 雇员类雇员类private String name;/ 姓名姓名private double salary;/ 工资工资private String department;/ 部门部门 / 其他成员方法其他成员方法public void setInfo (String name, double salary, String department) this.name = new String(name);this.salary = salary;this.department = new String(depar

37、tment);public ManagerClass extends EmployeeClass / 经理类经理类private double special; / 特殊津贴特殊津贴 / 其他成员方法其他成员方法public void setInfo(String name, double salary, String department, double special) super(name, salary, department);this.special = special;Java程序程序设计3530 七月 20242.2.成员方法的覆盖成员方法的覆盖u当子类中定义的成员方法与父类中

38、某个成员方法的名称当子类中定义的成员方法与父类中某个成员方法的名称与参数列表完全一样时被称为成员方法的覆盖。与参数列表完全一样时被称为成员方法的覆盖。u在在JavaJava中,成员方法的名称与参数列表统称为签名。其中,成员方法的名称与参数列表统称为签名。其主要原因是父类中成员方法提供的操作功能不能满足子主要原因是父类中成员方法提供的操作功能不能满足子类的需求,采用覆盖手段将父类中相应的成员方法隐藏类的需求,采用覆盖手段将父类中相应的成员方法隐藏起来,而用子类中定义的成员方法替代。起来,而用子类中定义的成员方法替代。Java程序程序设计3630 七月 2024 在定义具有覆盖特征的成员方法时,通

39、常有下面两种形在定义具有覆盖特征的成员方法时,通常有下面两种形式:式:在子类定义的成员方法中,首先调用父类中被覆盖的在子类定义的成员方法中,首先调用父类中被覆盖的成员方法,再添加一些操作语句,这种形式可以达到成员方法,再添加一些操作语句,这种形式可以达到对父类被覆盖成员方法的功能给予补充、增强。对父类被覆盖成员方法的功能给予补充、增强。在子类定义的成员方法中,没有调用父类中被覆盖的在子类定义的成员方法中,没有调用父类中被覆盖的成员方法,而是全新的语句组,这种形式可以达到对成员方法,而是全新的语句组,这种形式可以达到对父类被覆盖成员方法的全部覆盖。当子类对象的某项父类被覆盖成员方法的全部覆盖。当

40、子类对象的某项操作与父类对象相应的操作过程完全不同时,常常采操作与父类对象相应的操作过程完全不同时,常常采取这种方式实现。取这种方式实现。 Java程序程序设计3730 七月 2024/ file name:ComplexNumber.javapublic class ComplexNumber / 复数类复数类private double re;/ 实部实部private double im;/ 虚部虚部public ComplexNumber() . public ComplexNumber(double re, double im) . public void setRe(double

41、re) . public void setIm(double im) . public double getRe() . public double getIm() . public boolean equals(Object otherObject) if (this = otherObject) return true; / 是否引用同一个对象是否引用同一个对象 if (otherObject = null) return false; / otherObject是否为空是否为空 if (getClass() != otherObject.getClass()/ 是否属于同一个类型是否属于

42、同一个类型 return false; ComplexNumber other = (ComplexNumber)otherObject; if (re = other.re) & ( im = other.im) return true; else return false;public String toString() . Java程序程序设计3830 七月 2024ComplexNumber c1,c2;c1 = new ComplexNumber(2,3);c2 = new ComplexNumber(2,-3.4);if (c1.equals(c2) System.out.prin

43、tln( + c1 + ) = ( + c2 + );else System.out.println( + c1 + ) ( + c2 + );Java程序程序设计3930 七月 20247.2.2 7.2.2 多态性的实现多态性的实现u面向对象程序设计提出了消息驱动的概念。面向对象程序设计提出了消息驱动的概念。u所谓消息是指一个对象请求另外一个对象帮助完成某项所谓消息是指一个对象请求另外一个对象帮助完成某项操作的规格说明。消息中至少应该包含接收方的信息及操作的规格说明。消息中至少应该包含接收方的信息及具体请求的操作说明。具体请求的操作说明。u当一个对象向另外一个对象发送消息时,接收到消息的当

44、一个对象向另外一个对象发送消息时,接收到消息的对象就会给予响应,这就使得静止的对象被激活,这就对象就会给予响应,这就使得静止的对象被激活,这就是人们常说的消息驱动。是人们常说的消息驱动。 Java程序程序设计4030 七月 2024u将同一个消息发送给不同的类对象,可能会得到完全不将同一个消息发送给不同的类对象,可能会得到完全不同的相应效果,称此现象为多态性。同的相应效果,称此现象为多态性。u在在JavaJava程序中,多态性是指不同的类对象调用同一个签程序中,多态性是指不同的类对象调用同一个签名的成员方法时将执行不同代码段的现象。名的成员方法时将执行不同代码段的现象。 Java程序程序设计4

45、130 七月 2024具体实现方式是:具体实现方式是:u首先,在子类中覆盖父类的某个成员方法,然后,定义首先,在子类中覆盖父类的某个成员方法,然后,定义父类的对象引用,并由它引用创建的子类对象。父类的对象引用,并由它引用创建的子类对象。u当在调用成员方法时,根据实际引用的对象类型确定最当在调用成员方法时,根据实际引用的对象类型确定最终调用哪个成员方法。终调用哪个成员方法。u由于直到程序执行时才会得知引用的对象类型,所以究由于直到程序执行时才会得知引用的对象类型,所以究竟执行哪个成员方法在程序执行时才能够动态地确定,竟执行哪个成员方法在程序执行时才能够动态地确定,而不是在程序编译时确定,这种连接

46、机制称为动态联编。而不是在程序编译时确定,这种连接机制称为动态联编。 Java程序程序设计4230 七月 2024实现多态性需要具备下面两个条件。实现多态性需要具备下面两个条件。(1 1)多态性作用于子类对象,它是依赖于类层次结构中的一)多态性作用于子类对象,它是依赖于类层次结构中的一项功能。在项功能。在JavaJava语言中,允许父类对象的引用具体指向其语言中,允许父类对象的引用具体指向其任何子类对象,人们将此称为置换法则,即在出现父类对任何子类对象,人们将此称为置换法则,即在出现父类对象的地方可以用其子类对象置换。这是实现多态性的先决象的地方可以用其子类对象置换。这是实现多态性的先决条件,

47、因此需要先定义一个指向父类的引用,然后,根据条件,因此需要先定义一个指向父类的引用,然后,根据需要在程序的运行过程中让它引用其子类的对象,并根据需要在程序的运行过程中让它引用其子类的对象,并根据当前引用的对象类型调用相应的成员方法。当前引用的对象类型调用相应的成员方法。(2 2)具有多态性的成员方法必须同时包含在父类与子类中,)具有多态性的成员方法必须同时包含在父类与子类中,且对应的成员方法签名完全一样,即是子类覆盖父类的那且对应的成员方法签名完全一样,即是子类覆盖父类的那些成员方法。些成员方法。Java程序程序设计4330 七月 2024举例:设计学校的人事管理系统 Java程序程序设计44

48、30 七月 2024/ file name:TestPersonClass.javapublic class TestPersonClass public static void main(String agrs) PersonClass info = new PersonClass3; info0 = new PersonClass(1, Wang, true, 88, 10, 2); info1 = new TeacherClass(2, Zhang, true, 70, 8, 12, software, professor, 5000.0); info2 = new StudentCla

49、ss(3, Sun, false, 87, 3, 22, Compter, 610); for (int i = 0; i info.length; i+) System.out.println(infoi); Java程序程序设计4530 七月 20247.3 7.3 抽象类抽象类uJava语言中,用abstract关键字来修饰一个类时,这个类叫做抽象类。u一个abstract 类只关心它的子类是否具有某种功能,并不关心该功能的具体实现,功能的具体行为由子类负责实现的。u在在JavaJava语言中,抽象类的定义格式为:语言中,抽象类的定义格式为: 修饰符修饰符 abstract class

50、abstract class 抽象类名抽象类名 / / 成员变量与成员方法成员变量与成员方法 u用abstract来修饰一个方法时,该方法叫做抽象方法。bstract类必须被继承,abstract方法必须被重写。Java程序程序设计4630 七月 2024u抽象类中可以包含抽象方法,为所有子类定义一个统一的接口,对抽象方法只需声明,而不需实现,因此它没有方法体。u其格式如下: abstrac returnType bstractMethod(paramlist);u说明:说明: 抽象类中既可定义抽象方法,也可以定义非抽象方法。抽象类中既可定义抽象方法,也可以定义非抽象方法。即抽象类中不是所有的

51、方法都是抽象方法。即抽象类中不是所有的方法都是抽象方法。Java程序程序设计4730 七月 2024/file name:Animal.javapublic abstract class Animal protected String type; / 种类种类 protected String name; / 名称名称 protected String breed; / 品种品种 public Animal(String type,String name,String breed) this.type = new String(type); this.name = new String(nam

52、e); this.breed = new String(breed); public String toString() return This is a + type + nIts + name + the + breed; public abstract void sound(); / 抽象方法抽象方法Java程序程序设计4830 七月 2024/ file name:Dog.javapublic class Dog extends Animal / 狗类狗类 public Dog(String name) super(Dog ,name, Unknow); public Dog(Stri

53、ng name,String breed) super(Dog, name, breed); public void sound() System.out.println(Woof Woof); / file name:Cat.javapublic class Cat extends Animal / 猫类猫类 public Cat(String name) super(Cat, name, Unknow); public Cat(String name,String breed) super(Cat, name, breed); public void sound() System.out.

54、println(Miiaooww); / file name:Duck.java public class Duck extends Animal / 鸭子类鸭子类 public Duck(String name) super(Duck, name, Unknow); public Duck(String name,String breed) super(Duck, name, breed); public void sound() System.out.println(Quack quackquack); Java程序程序设计4930 七月 2024 Animal theAnimals =

55、new Dog(Rover,Poodle), new Cat(Max,Abyssinian), new Duck(Daffy,Aylesbury) ; for (int i = 0; i theAnimals.length; i+) theAnimalsi.sound(); 运行结果:运行结果: Woof Woof Miiaooww Quack quackquack Java程序程序设计5030 七月 2024 在使用抽象类时,需要注意下面几点:在使用抽象类时,需要注意下面几点:l任何包含抽象方法的类都必须声明为抽象类,否则将出现编译错任何包含抽象方法的类都必须声明为抽象类,否则将出现编译错误

56、。误。l由于抽象类不是一个完整的类,因此不能够被实例化,即不能够由于抽象类不是一个完整的类,因此不能够被实例化,即不能够创建抽象类的对象,但可以定义抽象类的引用,并用它引用该抽创建抽象类的对象,但可以定义抽象类的引用,并用它引用该抽象类的某个可实例化子类的对象,这是实现多态性的另一种常见象类的某个可实例化子类的对象,这是实现多态性的另一种常见方式。方式。l抽象类主要用于派生子类,且在子类中实现抽象类中的所有抽象抽象类主要用于派生子类,且在子类中实现抽象类中的所有抽象方法。如果在子类中没有实现全部的抽象方法,则必须继续将没方法。如果在子类中没有实现全部的抽象方法,则必须继续将没有被实现的方法声明

57、成抽象方法,此时的子类仍然需要声明为抽有被实现的方法声明成抽象方法,此时的子类仍然需要声明为抽象类。象类。lstatic、private和和final修饰符不能应用于抽象方法。修饰符不能应用于抽象方法。Java程序程序设计5130 七月 20247.4 7.4 接口接口为了克服为了克服Java单继承的缺点,单继承的缺点,Java使用了接口,一个类可以实现多使用了接口,一个类可以实现多个接口。个接口。在在JavaJava中,接口是一种特殊的抽象类中,接口是一种特殊的抽象类特殊性:接口的内部只允许包含常量和抽象方法。特殊性:接口的内部只允许包含常量和抽象方法。 常量默认为常量默认为public s

58、tatic finalpublic static final, 成员方法默认为成员方法默认为public abstractpublic abstract。使用接口的主要目的是统一公共常量、规范公共的操作接口的管理。使用接口的主要目的是统一公共常量、规范公共的操作接口的管理。接口其实就是方法定义和常量值的集合。 Java程序程序设计5230 七月 2024u接口的优点: (1)通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。 (2)通过接口可以指明多个类需要实现的方法。 (3)通过接口可以了解对象的交互界面,而不需了解对象所对应的类。u接口把方法的定义和类的层次区分开来,通

59、过它可以在运行时动态地定位所调用的方法。同时接口中可以实现“多重继承”,且一个类可以实现多个接口。Java程序程序设计5330 七月 20241.接口的声明接口的声明u使用关键字interface 来定义一个接口。u接口的定义和类的定义很相似,分为接口声明和接口体两部分。完整的接口定义格式如下: public interface interfaceName extends listOfSuperInterface 接口体接口体 u其中:public修饰符指明任意类均可以使用这个接口,缺省情况下,只有与该接口定义在同一个包中的类才可以访问这个接口。extends子句与类声明中的extends子句

60、基本相同,不同的是一个接口可以有多个父接口,用逗号隔开,而一个类只能有一个父类。子接口继承父接口中所有的常量和方法。u通常接口名称以able或ible结尾,表明接口能完成一定的行为 例如Runnable、Serializable。Java程序程序设计5430 七月 20242. 接口体接口体u接口体中包含常量定义和方法定义两部分。其中常量定义部分定义的常量均具有public、static和final属性。u其格式如下: returnType methodName(paramlist);u接口中只能进行方法的声明,而不提供方法的实现,所以,方法定义没有方法体,且用分号(;)结尾,在接口中声明的方

61、法具有public和abstract属性。另外,如果在子接口中定义了和父接口同名的常量,则父接口中的常量被隐藏。u例如: interface Summaryable final int MAX=50; / MAX具有public、static、final属性 void printone(float x); float sum(float x ,float y); u上面这段程序可以以Summaryable.java来保存,也可以写入其它Java程序中。Java程序程序设计5530 七月 20243.接口的使用接口的使用u一个类通过使用关键字implements 声明自己使用(或实现)一个或多个

62、接口。如果使用多个接口,用逗号隔开接口名。u如: class Calculate extends Computer implements Summary,Substractable u类Calculate使用了Summary 和Substractable接口,继承了Computer类。u如果一个类使用了某个接口,那么这个类必须实现该接口的所有方法,即为这些方法提供方法体。需要注意的如下:1)在类中实现接口的方法时,方法的名字,返回类型,参数个数及类型必须与接口中的完全一致。2)接口中的方法被默认是public ,所以类在实现接口方法时,一定要用public 来修饰。3)另外,如果接口的方法的返

63、回类型如果不是void 的,那么在类中实现该接口方法时,方法体至少要有一个return 语句。如果是void 型,类体除了两个大括号外,也可以没有任何语句。u也可以通过也可以通过import语句引入包中的接口语句引入包中的接口 import java.io.*;Java程序程序设计5630 七月 2024public interface SwingConstants public static final int CENTER = 0; public static final int TOP = 1; public static final int LEFT = 2; public stati

64、c final int BOTTOM = 3; public static final int RIGHT = 4; public static final int NORTH = 1; public static final int NORTH_EAST = 2; public static final int EAST = 3; public static final int SOUTH_EAST = 4; public static final int SOUTH = 5; public static final int SOUTH_WEST = 6; public static fin

65、al int WEST = 7; public static final int NORTH_WEST = 8; public static final int HORIZONTAL = 0; public static final int VERTICAL = 1; public static final int LEADING = 10; public static final int TRAILING = 11; public static final int NEXT = 12; public static final int PREVIOUS = 13;Java程序程序设计5730

66、七月 2024public class EmployeeClass implements Comparable private String name;/ 姓名姓名private double salary;/ 工资工资private String department;/ 部门部门 public int compareTo(Object otherObject) EmployeeClass other = (EmployeeClass)otherObject; if ( salary other.salary) return -1; / 比较工资多少比较工资多少 if ( salary =

67、other.salary) return 0; else return 1; Java程序程序设计5830 七月 2024EmployeeClass e1 = new EmployeeClass(Wang, 2000.0, Software);EmployeeClass e2 = new EmployeeClass(Sun, 3000.0, Math);switch (pareTo(e2) case -1: System.out.println(); break;Java程序程序设计5930 七月 2024【例】使用多重接口的例子使用多重接口的例子/ MultInterfaces.javain

68、terface I1 abstract void test(int i); interface I2 abstract void test(String s); public class MultInterfaces implements I1, I2 public void test(int i) System.out.println(In MultInterfaces.I1.test); public void test(String s) System.out.println(In MultInterfaces.I2.test); public static void main(Stri

69、ng a) MultInterfaces t = new MultInterfaces(); t.test(42); t.test(Hello); Java程序程序设计6030 七月 20247.5 7.5 包包u包是包是Java语言中有效地管理类的一个机制。语言中有效地管理类的一个机制。u 包名的目的是有效的区分名字相同的类。包名的目的是有效的区分名字相同的类。u在在JavaJava中,包是用于组织类与接口的机制。面向对象程中,包是用于组织类与接口的机制。面向对象程序设计方法强调程序代码的重用性,重用的基本单位将序设计方法强调程序代码的重用性,重用的基本单位将以类或接口的形式展现,以类或接口

70、的形式展现,u按照功能将类与接口分装在不同的包中有两点好处:一按照功能将类与接口分装在不同的包中有两点好处:一是便于将若干个已存在的类或接口整体地加载到一个程是便于将若干个已存在的类或接口整体地加载到一个程序中;二是避免出现名称冲突的现象。序中;二是避免出现名称冲突的现象。uJavaJava语言规定,在一个包中不允许有相同名称的类文件,语言规定,在一个包中不允许有相同名称的类文件,但对于在不同包中的类没有这种限制,原因在于加载每但对于在不同包中的类没有这种限制,原因在于加载每个类时将指出类所在的包,这样便可以区别不同包中的个类时将指出类所在的包,这样便可以区别不同包中的类。类。Java程序程序

71、设计6130 七月 2024uJava虚拟机(虚拟机(JVM)决定如何创建和存储包、子包以)决定如何创建和存储包、子包以及相应的编译单元,并决定哪些顶层包名称在特定的及相应的编译单元,并决定哪些顶层包名称在特定的编译中是可见的,以及决定哪些包是可访问的。包可编译中是可见的,以及决定哪些包是可访问的。包可以存储在在当地文件系统中、分布式文件系统当中,以存储在在当地文件系统中、分布式文件系统当中,或者某种形式的数据库中。或者某种形式的数据库中。uJava系统必须支持至少一个无名包(也叫缺省包),系统必须支持至少一个无名包(也叫缺省包),一般为当前目录。在开发小的或者临时的应用程序或一般为当前目录。

72、在开发小的或者临时的应用程序或者刚刚开始开发时,用无名包是非常方便的。者刚刚开始开发时,用无名包是非常方便的。Java程序程序设计6230 七月 2024upackage语语句句作作为为Java源源文文件件的的第第一一条条语语句句,为为该该源源文文件件中中声声明明的的类指定包名。类指定包名。u创建一个包且将类文件放入其中的语法格式为:创建一个包且将类文件放入其中的语法格式为: package package pkg1pkg2pkg3;u例如例如: :如果希望将类文件放入名字为如果希望将类文件放入名字为userPackageuserPackage的包中,可以这样写:的包中,可以这样写: pack

73、age userPackage; package userPackage; package java.awt.image; package ; package myPackage; package语句语句Java程序程序设计6330 七月 2024 如果要指定包中的子包就需要按层次顺序书写包序列,包如果要指定包中的子包就需要按层次顺序书写包序列,包之间用逗号分隔。之间用逗号分隔。 例如,如果希望将一个类文件放入例如,如果希望将一个类文件放入userPackage1userPackage1的子包的子包userPackage2userPackage2的子包的子包userPackage3userPa

74、ckage3中,就应该将包语句写中,就应该将包语句写成:成: package userPackage1. userPackage2. userPackage3;package userPackage1. userPackage2. userPackage3;Java程序程序设计6430 七月 2024u另外,包层次的根目录路径是由环境变量另外,包层次的根目录路径是由环境变量classpath来确来确定的。定的。Java的的JDK提供的包提供的包(也叫基础类库也叫基础类库)包括:包括:u Java.applet、java.awt、java.awt.datatransfer、java.awt.ev

75、ent、java.awt.image、javabeans、 java.io、java.lang、java.langreflect、 javamath、、java.rmi、java.security、java.sql、java.util等。等。u每个包中都包含了许多有用的类和接口。用户也可以定义每个包中都包含了许多有用的类和接口。用户也可以定义自己的包来实现自己的应用程序。自己的包来实现自己的应用程序。uJava的基础类库其实就是的基础类库其实就是JDK安装目录下面安装目录下面jrelibrt.jar这个压缩文件。学习基础类库就是学习这个压缩文件。学习基础类库就是学习rt.jar。基础类库里。基

76、础类库里面的类非常非常多。但是真正对于我们来说最核心的只有面的类非常非常多。但是真正对于我们来说最核心的只有几个,例如几个,例如java.lang.*; java.io.*; java.util.*; java.sql.*;等。等。 Java程序程序设计6530 七月 2024u通过导入语句(通过导入语句(importimport)将包中的类加载到程序中,并通)将包中的类加载到程序中,并通过类名或接口名引用这些类或接口。过类名或接口名引用这些类或接口。u导入语句的基本格式导入语句的基本格式: :import package1.package2.(classname|*);uimportimpo

77、rt后跟包名序列及类名。后跟包名序列及类名。u例如例如: :u要将上面创建的包中的类加载到程序中,应该在程序的开要将上面创建的包中的类加载到程序中,应该在程序的开始(包语句之后)书写下列导入语句:始(包语句之后)书写下列导入语句: import userPackage.*; import userPackage.*;import 语句句Java程序程序设计6630 七月 2024u引入类库中的类引入类库中的类 如果用户需要类库中的类就必须使用如果用户需要类库中的类就必须使用import语句。语句。 import java.util.Date; import java.util.*; impor

78、t javax.swing.event.*;u引入自定义包中的类引入自定义包中的类 如果用户程序可以使用如果用户程序可以使用tom.jiafei自定义包自定义包中的类,中的类,即使用即使用非类库非类库中有包名的类,也要使用中有包名的类,也要使用import语句,语句, 例如:例如: import tom.jiafei.*; Java程序程序设计6730 七月 2024u使用无包名的类使用无包名的类 如果一个类想使用无名包中的类,只要将这个无包名的类的如果一个类想使用无名包中的类,只要将这个无包名的类的字节码和当前类保存在同一目录中即可。字节码和当前类保存在同一目录中即可。u区分无包名和有包名的

79、类区分无包名和有包名的类 如果想同时使用如果想同时使用tom.jiafei包中的包中的A类和无名包中的类和无名包中的A类,就不类,就不能省略包名。能省略包名。例如:例如:A a1=new A(); tom.jiafei.A a2=new tom.jiafei.A();u区分有包名的类区分有包名的类 如果一个源文件引入了两个包中同名的类,那么在使用该类时,如果一个源文件引入了两个包中同名的类,那么在使用该类时,不允许省略包名。不允许省略包名。例如:例如: tom.jiafei.A bird=new tom.jiafei.A(); .A goat=new .A(); Java程序程序设计6830

80、七月 2024Java程序程序设计6930 七月 2024JAR文件的使用文件的使用uJAR 文件就是 Java Archive File,是 Java 的一种文档格式。JAR 文件非常类似 ZIP 文件,准确的说,它就是 ZIP 文件。uJAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的。u可以使用jar.exe 把一些文件压缩成一个JAR 文件,来发布我们的应用程序。ujar.exe是随 JDK 安装的,在 JDK 安装目录下的 bin 子目录中,文件名为 jar.e

81、xe。u我们可以把java 应用程序中涉及到的类压缩成一个JAR 文件,比如Tom.jar,然后使用java 解释器使用参数-jar 执行这个压缩文件, 如下格式 java -jar Tom.jaru或用鼠标双击该文件,就可执行这个压缩文件Java程序程序设计7030 七月 2024uJAR文件的制作步骤如下:首先,假设应用程序中有两个类A、B,其中A类是主类(其中包含了main()方法).1)首先用文本编辑器比如Windows下的记事本编写一个清单文件 Mymoon.mf Manifest-Version: 1.0 Main-Class: A Created-By: 1.2.2(Sun Mi

82、crosystems Inc.)比如,保存Mymoon.mf 到如D:userzlz。需要注意的是在编写清单文件时,在”Manifest-Version”和“1.0”之间,”Main-Class ”和主类”A”之间,以及”Created-By ”和”1.2.2”之间必须有且只有一个空格。Java程序程序设计7130 七月 20242) 生成JAR文件 D:userzlzjar cfm Tom.jar Mymoon.mf A.class B.classu其中cfm参数中c 表示要生成一个新的JAR 文件,f 表示要生成的JAR 文件的名字,m 表示文件清单文件的名字。u现在就可以将Tom.jar

83、文件拷贝到任何一个安装了java运行环境上,只要用鼠标双击该文件就可以运行该java 应用程序了。u说明: 如果机器上没有安装过中文版WinRAR 解压缩软件,那么Tom.jar 的文件类型是Executable Jar File。如果机器上安装过中文版WinRAR 解压缩软件,并将.jar 文件与该解压缩软件做了关联,那么Tom.jar 的文件类型是WinRAR,在这种情况下,当用鼠标双击该文件时WinRAR 解压缩软件会运行起来准备进行解压缩操作,使得我们的java 程序无法运行。因此在发布我们的软件时,还应该再写一个有如下内容的bat文件Tom.batuTom.bat文件中内容如下:uj

84、ava -jar Tom.jaru另外再写一个帮助文件help.txt,用来说明该应用软件的功能、使用说明的内容。u可以用鼠标双击A.bat 或Tom.jar 来运行本软件。可以将该.bat文件、.jar文件、帮助文件一同发布。Java程序程序设计7230 七月 2024javapjavap反编译反编译uJDK提供的反编译器提供的反编译器javap.exe可以将字节码反编译为可以将字节码反编译为源码,查看源码类中的源码,查看源码类中的public方法名字和方法名字和public成员变成员变量的名字量的名字u例如:例如: javap java.util.Date Java程序程序设计7330 七

85、月 2024javadocjavadoc制作文档制作文档 u使用使用JDK提供的提供的javadoc.exe可以制做源文件可以制做源文件的的html格式文档。格式文档。 假设有源文件假设有源文件Example.java,用用 javadoc Example.java 生成生成Example.java的的html格格式文挡。式文挡。public class Employee public int number; public Employee (int number) /* Employee是一个构造方法,无是一个构造方法,无类型。型。 param number是雇是雇员的号的号码 */ thi

86、s.number=number; /* getNumber是一个是一个实例方法。例方法。 return 该方法返回一个整数,即返方法返回一个整数,即返回回number. */ public int getNumber() return number; Java程序程序设计7430 七月 2024 我们还可以将这个jar 文件存放到Java 运行环境的扩展类目录下,即将该jar 文件存放在JDK 安装目录的jrelibext 文件夹中.这样,其他的程序就可以使用这个jar文件中的类来创建对象了。 有关jar.exe的详细使用方法详见JDK帮助文档。Java程序程序设计7530 七月 20247.

87、6 7.6 综合应用举例综合应用举例u继承性与多态性是面向对象程序设计的两个重要特性。继承性与多态性是面向对象程序设计的两个重要特性。是否能够设计一个可重用性高、可维护性好、安全可靠是否能够设计一个可重用性高、可维护性好、安全可靠的软件系统,在很大程度上要看是否对继承性与多态性的软件系统,在很大程度上要看是否对继承性与多态性有比较深刻地理解,并能够合理地应用在软件设计中,有比较深刻地理解,并能够合理地应用在软件设计中,u下面剖析下面剖析JavaJava类库中的几个标准类,说明定义子类、抽类库中的几个标准类,说明定义子类、抽象类、接口的应用方式,以此展示继承性与多态性的实象类、接口的应用方式,以

88、此展示继承性与多态性的实现机制。现机制。Java程序程序设计7630 七月 20241.1.数值类型数据的类层次结构数值类型数据的类层次结构l在在Java类库中,为数值类型数据的表示与处理设计了完备的类结构。类库中,为数值类型数据的表示与处理设计了完备的类结构。所有的数值类型的父类是所有的数值类型的父类是Number,这是一个抽象类,其中涵盖了,这是一个抽象类,其中涵盖了所有数值型数据应该包含的操作接口。所有数值型数据应该包含的操作接口。l这个抽象类实现了接口这个抽象类实现了接口java.io.Serializable,这是一个内容为空的标,这是一个内容为空的标准接口,准接口,Java要求凡是

89、具有串行化功能的对象所属的类必须实现这要求凡是具有串行化功能的对象所属的类必须实现这个接口。个接口。 Java程序程序设计7730 七月 2024public abstract class Number implements java.io.Serializable public abstract int intValue(); / 返回数值所对应的返回数值所对应的int值值public abstract long longValue(); / 返回数值所对应的返回数值所对应的long值值public abstract float floatValue(); / 返回数值所对应的返回数值所对应

90、的float值值public abstract double doubleValue(); / 返回数值所对应的返回数值所对应的double值值public byte byteValue() / 返回数值所对应的返回数值所对应的byte值值return (byte)intValue();public short shortValue() / 返回数值所对应的返回数值所对应的short值值return (short)intValue();Java程序程序设计7830 七月 2024 在在IntegerInteger类中定义了两个表示整型最大值与最小值的常。类中定义了两个表示整型最大值与最小值的常

91、。 public static final int MIN_VALUE = 0x80000000; public static final int MIN_VALUE = 0x80000000; public static final int MAX_VALUE = 0x7fffffff; public static final int MAX_VALUE = 0x7fffffff; 还定义了一个成员变量还定义了一个成员变量valuevalue用于存放整型数值。用于存放整型数值。Java程序程序设计7930 七月 2024Java程序程序设计8030 七月 2024Java程序程序设计8130

92、 七月 2024将同一类实体的共同特性抽取出来,并采用不可实例化的抽将同一类实体的共同特性抽取出来,并采用不可实例化的抽象类进行描述,将每个具体类别的实体特征用子类形式描象类进行描述,将每个具体类别的实体特征用子类形式描述的理念,其好处有:述的理念,其好处有:(1)(1)可以强制、统一同一类实体的操作行为与操作接口。例如,可以强制、统一同一类实体的操作行为与操作接口。例如,在在 NumberNumber类中定义的类中定义的4 4个抽象方法,在子类中必须给予实个抽象方法,在子类中必须给予实现,这就迫使各个数值类型的类用统一的接口形式拥有这现,这就迫使各个数值类型的类用统一的接口形式拥有这些操作行

93、为。些操作行为。(2)(2)利用继承关系实现多态性效果。例如,在利用继承关系实现多态性效果。例如,在NumberNumber类中定义类中定义的几个抽象方法与从的几个抽象方法与从ObjectObject类继承过来的成员方法类继承过来的成员方法toStringtoString()()与与equals()equals()都具有多态性效果。都具有多态性效果。(3)(3)有利于软件系统的扩展性。例如,如果日后需要增加新的有利于软件系统的扩展性。例如,如果日后需要增加新的数据类型,只要定义一个新的数据类型,只要定义一个新的NumberNumber子类即可。子类即可。Java程序程序设计8230 七月 20

94、242 2对象拷贝对象拷贝u对象拷贝是一个实现接口的典型实例。对象拷贝是一个实现接口的典型实例。 u深拷贝是指对象的完全复制。深拷贝是指对象的完全复制。u如果对象的某个成员变量是其他对象的引用,也对所指如果对象的某个成员变量是其他对象的引用,也对所指的子对象依次进行复制,使得拷贝后的对象双方各自拥的子对象依次进行复制,使得拷贝后的对象双方各自拥有不同的副本,只是内容相同。有不同的副本,只是内容相同。 Java程序程序设计8330 七月 2024l实现实现CloneableCloneable接口只是通知接口只是通知JavaJava编译器该类对象可以被编译器该类对象可以被拷贝,而具体实现过程是由拷

95、贝,而具体实现过程是由Object.clone()Object.clone()成员方法完成员方法完成的。默认的成的。默认的Object.clone()Object.clone()方法只提供对象的浅拷贝。方法只提供对象的浅拷贝。l如果要实现深拷贝,需要在子类中覆盖如果要实现深拷贝,需要在子类中覆盖Object.clone()Object.clone()方法,并在成员方法中先调用父类的方法,并在成员方法中先调用父类的clone()clone()完成对象的完成对象的浅拷贝,然后再对子对象进行拷贝。浅拷贝,然后再对子对象进行拷贝。l如果所有的子对象都实现了如果所有的子对象都实现了CloneableCl

96、oneable接口,只要简单地接口,只要简单地调用调用clone()clone()成员方法就可以实现对象的克隆。成员方法就可以实现对象的克隆。l对于需要深拷贝的对象,建议其子对象都实现对于需要深拷贝的对象,建议其子对象都实现CloneableCloneable接口。接口。 Java程序程序设计8430 七月 2024public class Circle implements Cloneable /圆形类圆形类 private Point centre = new Point(50,50); /表示圆心坐标表示圆心坐标 private float radius = 10.0f; /描述圆的半径描述圆的半径 / 其他的成员方法其他的成员方法 public Circle clone() throws CloneNotSupportedException Circle c = (Circle)super.clone(); c.centre = (Point) centre.clone(); return c; Java程序程序设计85 以上有不当之处,请大家给与批评指正,以上有不当之处,请大家给与批评指正,谢谢大家!谢谢大家!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号