面向对象的程序设计-java张白一第三版第5章.ppt
《面向对象的程序设计-java张白一第三版第5章.ppt》由会员分享,可在线阅读,更多相关《面向对象的程序设计-java张白一第三版第5章.ppt(154页珍藏版)》请在三一办公上搜索。
1、第5章 消息、继承与多态,5.1 消息 5.2 访问控制 5.3 多态机制 5.4 继承机制 5.5 抽象类、接口与包,5.1 消 息在面向对象技术中,对象与对象之间并不是彼此孤立的,它们之间存在着联系,对象之间的联系是通过消息来传递的。在面向对象的程序中,消息就是数据成员及成员方法的引用。5.1.1 消息的概念在日常生活中,人与人之间要进行交流。某人可以向别人提供服务,例如,他可以开汽车、教学生学习等;同时他也需要别人为他提供服务,例如,他要吃饭但不可能自己去种地,要穿衣不可能自己去织布,他必须请求别人的帮助;同样,他什么时间讲课,也必须得到他人的请求或命令。“请求”或“命令”便是人与人进行
2、交流的手段。,在面向对象的系统中,把“请求”或“命令”抽象成“消息”,对象之间的联系是通过消息传递来实现的。当系统中的其他对象请求这个对象执行某个服务时,它就响应这个请求,完成指定的服务。通常,我们把发送消息的对象称为发送者,把接收消息的对象称为接收者。对象间的联系,只能通过消息传递来进行。对象也只有在收到消息时才被激活,去完成消息要求的功能。,消息就是向对象发出服务请求,是对数据成员和成员方法的引用。因此,它应该含有这些信息:提供服务的对象标识对象名、服务标识方法名、输入信息实际参数、回答信息返回值或操作结果。消息具有三个性质:(1)同一对象可接收不同形式的多个消息,产生不同的响应。(2)相
3、同形式的消息可以发送给不同的对象,各对象所做出的响应可以是截然不同的。(3)消息的发送可以不考虑具体的接收者,对象可以响应消息,也可以对消息不予理会,对消息的响应并不是必须的。,5.1.2 公有消息和私有消息在面向对象系统中,消息分为两类:公有消息和私有消息。当有一批消息同属于一个对象时,由外界对象直接发送给这个对象的消息称为公有消息;对象发送给自己的消息称为私有消息。私有消息对外是不开放的,外界不必了解它。外界对象只能向此对象发送公有消息,而不能发送私有消息,私有消息是由对象自身发送的。,5.1.3 特定于对象的消息特定于对象的消息是指将所有能支持此对象可接收消息的方法集中在一起,形成一个大
4、消息,称为特定于对象的消息。这些消息让对象执行这个方法而不管它可能做什么及怎么做。特定于对象的消息可分为以下三种类型:(1)可以返回对象内部状态的消息。(2)可以改变对象内部状态的消息。(3)可以做一些特定操作,改变系统状态的消息。,【示例程序C5_1.java】不同类型消息的传递示例。class Student public String name;public char sex;public int no;public int age;Student(int cno,String cname,char csex,int cage)name=cname;sex=csex;no=cno;age
5、=cage;,public void showNo()System.out.println(No:+no);public void showName()System.out.println(Name:+name);public void showSex()System.out.println(Sex:+sex);public void showAge()System.out.println(age:+age);class StudentScore private int no;private double score;public void sendScore(int cno,double c
6、score),/下面两条语句是对象发送给自身的消息,要求给自己的数据成员赋值,/这是一种私有消息,外界是不知道的 no=cno;score=cscore;void printScore()System.out.println(No:+no+score:+score);public class C5_1 public static void main(String args),int m;/下面两句发送new消息给类Student,要求创建st1、st2的对象 Student st1=new Student(101,zhang li,F,18);Student st2=new Student(1
7、02,hong bing,M,17);/发送new消息给类StudentScore,要求创建sc1、sc2的对象 StudentScore sc1=new StudentScore();StudentScore sc2=new StudentScore();/*向st1的对象发送显示学号、名字、年龄的消息。这些消息都是公有消息。它们形成 了同一对象可接收不同形式的多个消息,产生不同的响应*/,st1.showNo();/这是一条消息,消息响应的结果是显示st1的对象的学号 st1.showName();/显示对象姓名的消息 st1.showAge();/显示对象年龄的消息 st1.age=20
8、;/修改对象的数据成员的消息,修改st1对象的年龄 m=st1.age;/返回对象的数据成员的消息,将返回消息赋给变量m System.out.println(m=+m);/*向st2的对象发送两个显示信息的消息,与st1的对象相同,显示学号及名字。这些消 息都是公有消息,说明了相同形式的消息可以送给不同的对象,各对象所做出的响应 可以是截然不同的*/,st2.showNo();st2.showName();/向sc1、sc2的对象各发送一个按学号输入成绩单的消息,这些消息都是公有消息 sc1.sendScore(101,97);sc2.sendScore(102,84);/向sc1、sc2的
9、对象各发送一个打印消息,这些消息都是公有消息 sc1.printScore();sc2.printScore();,该程序的运行结果如下:No:101Name:zhang liage:18m=20No:102Name:hong bingNo:101 score:97.0No:102 score:84.0,5.2 访 问 控 制一个类总能够访问自己的数据成员和成员方法。但是,其他类是否能访问这个类的数据成员或成员方法,是由该类的访问控制符及该类数据成员和成员方法的访问控制符决定的。这就是说,访问控制符是一组限定类、数据成员或成员方法是否可以被其他类访问的修饰符。类的访问控制符只有public一个
10、,缺省访问控制符时具有“友好访问”的特性。数据成员和成员方法的访问控制符有public、private、protected和缺省访问控制符等几种。类、数据成员和成员方法的访问控制符及其作用见表5.1。,表5.1 类、数据成员和成员方法的访问控制符及其作用,通过声明类的访问控制符可以使整个程序结构清晰、严谨,减少可能产生的类间干扰和错误。,5.2.1 公共访问控制符publicJava的类是通过包的概念来组织的,简单地说,定义在同一个程序文件中的所有类都属于同一个包。处于同一个包中的类都是可见的,即可以不需任何说明而方便地互相访问和引用。而对于不同包中的类,一般说来,它们相互之间是不可见的,当然
11、也不可能互相引用。然而,当一个类被声明为public时,只要在其他包的程序中使用import语句引入这个public类,就可以访问和引用这个类,并创建这个类的对象,访问这个类内部可见的数据成员和引用它的可见的方法。例如,Java类库中的许多类都是公共类,我们在程序中就是通过import语句将其引入的。,当一个类的访问控制符为public时,表明这个类作为整体对其他类是可见和可使用的,这个类就具有了被其他包中的类访问的可能性。但是,处于不同包中的public类作为整体对其他类是可见的,并不代表该类的所有数据成员和成员方法也同时对其他类是可见的,这得由这些数据成员和成员方法的修饰符来决定。只有当p
12、ublic类的数据成员和成员方法的访问控制符也被声明为public时,这个类的所有用public修饰的数据成员和成员方法才同时对其他类也是可见的。在程序设计时,如果希望某个类能作为公共工具供其他的类和程序使用,则应该把类本身和类内的方法都声明为public。例如,把Java类库中的标准数学函数类math和标准数学函数方法都声明为public,以供其他的类和程序使用。,需要注意的是,数据成员和成员方法的访问控制符被声明为public时,会造成安全性和封装性下降,所以一般应尽量少用。【示例程序A.java和B.java】有无public访问控制符的不同。(1)A.java程序:package c5
13、1;public class A double x1;/友好访问的数据成员 public double x2;/公共的数据成员 public double ar(double x)/公共的成员方法 double s;s=x;return s;,(2)B.java程序:package c52;import c51.A;public class B public static void main(String args)double s1;A p1=new A();/创建A类p1的对象/p1.x1=7;x1不是公共数据成员,不能访问 p1.x2=5.2;/访问A类p1的对象的数据成员 s1=p1.
14、ar(8);/访问A类p1的对象的成员方法 System.out.println(“p1.x2=”+p1.x2+“s1=”+s1);,上述两个程序文件的位置及其关系如图5.1左上窗口所示,其运行结果见图5.1右下窗口所示。程序说明:为了说明有无public访问控制符的不同,我们在c51包的A.java文件中创建了A类,并定义了一个没有public访问控制符的数据成员x1和一个由public修饰的数据成员x2;然后,我们又在c52包的B.java文件中创建B类,在B类中创建A类p1的对象实例,并访问该对象的数据成员及成员方法。可以看出,在B类中对于没有public访问控制符的A类p1的对象的数据
15、成员x1是不能访问的,编译时会报错,所以,程序中将其注释掉了。,图5.1 程序A.java和B.java的位置图及运行结果,5.2.2 缺省访问控制符如果一个类没有访问控制符,说明它具有缺省的访问控制特性,这种缺省的访问控制特性称为“友好访问”。友好访问规定只有在同一个包中的对象才能访问和引用这些类,因此,友好访问又称为包访问性。同样道理,类内的数据成员和成员方法如果没有访问控制符来限定,那么它们同样具有“友好访问”的特性,它们也具有包访问性,可以被同一个包中的其他类所访问和引用。,【示例程序C5_2.java和ClassArea.java】缺省访问控制符的程序示例。在ch5包中创建两个类:C
16、lassArea类和C5_2类。其中,ClassArea是缺省访问控制符的类,其功能是计算矩形面积;C5_2是一个公共类,在这个类中创建ClassArea类的实例对象ss,并访问该对象的成员方法。,(1)ClassArea.java文件:package ch5;class ClassArea double lon,wid;/数据成员的修饰符为缺省 double area(double x,double y)/成员方法的修饰符为缺省 double s;/方法内的变量 lon=x;wid=y;s=lon*wid;/求矩形面积 return s;/返回面积值,(2)C5_2.java文件:packa
17、ge ch5;public class C5_2 public static void main(String args)double a=2.2,b=3.1,z;/*在类C5_2中创建被访问ClassArea类的ss的对象,并访问对象的成员方法。这就是说,包中类是可见的,可以互相引用*/ClassArea ss=new ClassArea();z=ss.area(a,b);/访问ss的对象的成员方法 System.out.println(“z=”+z);,上述两个程序文件的位置及其关系如图5.2左上窗口所示,其运行结果见图5.2右下窗口,是z=6.820000000000001。,图5.2
18、程序C5_2.java和ClassArea.java位置图及运行结果,5.2.3 私有访问控制符private用private修饰的数据成员或成员方法只能被该类自身访问和修改,而不能被任何其他类(包括该类的子类)访问和引用。它提供了最高的保护级别。当其他类希望获取或修改私有成员时,需要借助于类的方法来实现。【示例程序C5_3.java】同一个包中,用private修饰的父类的数据成员不能被子类的实例对象引用,故程序中将该语句变成了注释语句。,class P1 private int n=9;/私有数据成员n int nn;P1()/构造方法 nn=n+;/可以被该类的对象自身访问和修改 voi
19、d ma()System.out.println(n=+n);/可以被该类的对象自身访问public class C5_3 extends P1/类class C5_3是类P1的子类 public static void main(String args),P1 m1=new P1();System.out.println(“m1.nn=”+m1.nn);/System.out.println(“m1.n=”+m1.n);错,不能引用父类的私有成员 m1.ma();/可以引用P1类自身的成员方法 该程序的运行结果如下:m1.nn=9 n=10,5.2.4 保护访问控制符protected用pr
20、otected修饰的成员变量可以被三种类引用:该类自身,与它在同一个包中的其他类以及在其他包中的该类的子类。使用protected修饰符的主要作用是允许其他包中的它的子类来访问父类的特定属性。【示例程序C41.java和C42.java】当父类的数据成员用protected修饰时,其他包的子类引用该数据成员的情况。具体情况见程序中的注释。,(1)C41.java程序:package c51;public class C41 protected double x1;double x2;protected double ar(double x)double s;s=x;return s;,(2)C
21、42.java程序:package c52;import c51.C41;public class C42 extends C41 public static void main(String args)double s1;C42 p1=new C42();p1.x1=7;/可以访问,属性x1是protected修饰的 s1=p1.ar(4);/可以访问,方法ar()是protected修饰的,/p1.x2=9;错,不能访问,x2没有访问控制符,不能被另一包的实例对象访问 System.out.println(“p1.x1=”+p1.x1+“s1=”+s1);程序C41.java和C42.ja
22、va的位置及其关系见图5.3左上窗口所示,其运行结果见图5.3右下窗口,为p1.x1=7.0 s1=4.0。,图5.3 程序C41.java和C42.java位置图及运行结果,5.3 多 态 机 制多态是面向对象系统中的又一重要特性,它描述的是同名方法可以根据发送消息的对象传送参数的不同,采取不同的行为方式的特性。面向对象系统中采用多态,大大提高了程序的抽象程度和简洁性,更重要的是,它最大限度地降低了类和程序模块之间的耦合性,提高了类模块的封闭性,使得它们不需了解对方的具体细节,就可以很好地共同工作。这一点对程序的设计、开发和维护都有很大的好处。,5.3.1 多态的概念多态是指一个程序中具有相
23、同名字而内容不同的方法共存的情况。这些方法同名的原因是它们的最终功能和目的都相同,但是由于在完成同一功能时可能遇到不同的具体情况,因此需要定义包含不同具体内容的方法,来代表多种具体实现形式。多态是面向对象程序设计中的一个重要特性,其目的是提高程序的抽象度、封闭性和简洁性,统一一个或多个相关类对外的接口。Java中提供了两种多态机制:重载与覆盖。,5.3.2 重载当在同一类中定义了多个同名而不同内容的成员方法时,我们称这些方法是重载(override)的方法。重载的方法主要通过形式参数列表中参数的个数、参数的数据类型和参数的顺序等方面的不同来区分。在编译期间,Java编译器要检查每个方法所用的参
24、数数目和类型,然后调用正确的方法。,【示例程序C5_5.java】加法运算重载的例子。import;import;public class C5_5 extends Applet int add(int a,int b)/重载的方法1 return(a+b);double add(double x,double y)/重载的方法2 return(x+y);double add(double x,double y,double z)/重载的方法3 return(x+y+z);,public void paint(Graphics g)g.drawString(“Sum is:”+add(8.5,
25、2.3),5,10);g.drawString(“Sum is:”+add(21,38),5,30);g.drawString(“Sum is:”+add(8.5,2.3,8.5+2.3),5,50);该程序的运行结果如下:Sum is:10.8Sum is:59Sum is:21.6,该类中定义了三个名为add的方法:第一个方法是计算两个整数的和;第二个方法是计算两个浮点数的和;第三个方法是计算三个浮点数的和。编译器根据方法被引用时提供的实际参数,选择并执行对应的重载方法。,5.3.3 覆盖由于面向对象系统中的继承机制,子类可以继承父类的方法。但是,子类的某些特征可能与从父类中继承来的特征有
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计 java 张白一 第三
链接地址:https://www.31ppt.com/p-6435962.html