资源预览内容
第1页 / 共154页
第2页 / 共154页
第3页 / 共154页
第4页 / 共154页
第5页 / 共154页
第6页 / 共154页
第7页 / 共154页
第8页 / 共154页
第9页 / 共154页
第10页 / 共154页
亲,该文档总共154页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第5章 消息、继承与多态,5.1 消息 5.2 访问控制 5.3 多态机制 5.4 继承机制 5.5 抽象类、接口与包,5.1 消 息 在面向对象技术中,对象与对象之间并不是彼此孤立的,它们之间存在着联系,对象之间的联系是通过消息来传递的。在面向对象的程序中,消息就是数据成员及成员方法的引用。 5.1.1 消息的概念 在日常生活中,人与人之间要进行交流。某人可以向别人提供服务,例如,他可以开汽车、教学生学习等;同时他也需要别人为他提供服务,例如,他要吃饭但不可能自己去种地,要穿衣不可能自己去织布,他必须请求别人的帮助;同样,他什么时间讲课,也必须得到他人的请求或命令。“请求”或“命令”便是人与人进行交流的手段。,在面向对象的系统中,把“请求”或“命令”抽象成“消息”,对象之间的联系是通过消息传递来实现的。当系统中的其他对象请求这个对象执行某个服务时,它就响应这个请求,完成指定的服务。通常,我们把发送消息的对象称为发送者,把接收消息的对象称为接收者。对象间的联系,只能通过消息传递来进行。对象也只有在收到消息时才被激活,去完成消息要求的功能。,消息就是向对象发出服务请求,是对数据成员和成员方法的引用。因此,它应该含有这些信息:提供服务的对象标识对象名、服务标识方法名、输入信息实际参数、回答信息返回值或操作结果。消息具有三个性质: (1) 同一对象可接收不同形式的多个消息,产生不同的响应。 (2) 相同形式的消息可以发送给不同的对象,各对象所做出的响应可以是截然不同的。 (3) 消息的发送可以不考虑具体的接收者,对象可以响应消息,也可以对消息不予理会,对消息的响应并不是必须的。,5.1.2 公有消息和私有消息 在面向对象系统中,消息分为两类:公有消息和私有消息。当有一批消息同属于一个对象时,由外界对象直接发送给这个对象的消息称为公有消息;对象发送给自己的消息称为私有消息。私有消息对外是不开放的,外界不必了解它。外界对象只能向此对象发送公有消息,而不能发送私有消息,私有消息是由对象自身发送的。,5.1.3 特定于对象的消息 特定于对象的消息是指将所有能支持此对象可接收消息的方法集中在一起,形成一个大消息,称为特定于对象的消息。这些消息让对象执行这个方法而不管它可能做什么及怎么做。特定于对象的消息可分为以下三种类型: (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=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 cscore), /下面两条语句是对象发送给自身的消息,要求给自己的数据成员赋值, /这是一种私有消息,外界是不知道的 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(102,“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; /修改对象的数据成员的消息,修改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的对象各发送一个打印消息,这些消息都是公有消息 sc1.printScore( ); sc2.printScore( ); ,该程序的运行结果如下: No:101 Name:zhang li age:18 m=20 No:102 Name:hong bing No:101 score:97.0 No:102 score:84.0,5.2 访 问 控 制 一个类总能够访问自己的数据成员和成员方法。但是,其他类是否能访问这个类的数据成员或成员方法,是由该类的访问控制符及该类数据成员和成员方法的访问控制符决定的。这就是说,访问控制符是一组限定类、数据成员或成员方法是否可以被其他类访问的修饰符。类的访问控制符只有public一个,缺省访问控制符时具有“友好访问”的特性。数据成员和成员方法的访问控制符有public、private、protected和缺省访问控制符等几种。类、数据成员和成员方法的访问控制符及其作用见表5.1。,表5.1 类、数据成员和成员方法的访问控制符及其作用,通过声明类的访问控制符可以使整个程序结构清晰、严谨,减少可能产生的类间干扰和错误。,5.2.1 公共访问控制符public Java的类是通过包的概念来组织的,简单地说,定义在同一个程序文件中的所有类都属于同一个包。处于同一个包中的类都是可见的,即可以不需任何说明而方便地互相访问和引用。而对于不同包中的类,一般说来,它们相互之间是不可见的,当然也不可能互相引用。然而,当一个类被声明为public时,只要在其他包的程序中使用import语句引入这个public类,就可以访问和引用这个类,并创建这个类的对象,访问这个类内部可见的数据成员和引用它的可见的方法。例如,Java类库中的许多类都是公共类,我们在程序中就是通过import语句将其引入的。,当一个类的访问控制符为public时,表明这个类作为整体对其他类是可见和可使用的,这个类就具有了被其他包中的类访问的可能性。但是,处于不同包中的public类作为整体对其他类是可见的,并不代表该类的所有数据成员和成员方法也同时对其他类是可见的,这得由这些数据成员和成员方法的修饰符来决定。只有当public类的数据成员和成员方法的访问控制符也被声明为public时,这个类的所有用public修饰的数据成员和成员方法才同时对其他类也是可见的。在程序设计时,如果希望某个类能作为公共工具供其他的类和程序使用,则应该把类本身和类内的方法都声明为public。例如,把Java类库中的标准数学函数类math和标准数学函数方法都声明为public,以供其他的类和程序使用。,需要注意的是,数据成员和成员方法的访问控制符被声明为public时,会造成安全性和封装性下降,所以一般应尽量少用。 【示例程序A.java和B.java】 有无public访问控制符的不同。 (1) A.java程序: package c51; 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.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的对象的数据成员x1是不能访问的,编译时会报错,所以,程序中将其注释掉了。,图5.1 程序A.java和B.java的位置图及运行结果,5.2.2 缺省访问控制符 如果一个类没有访问控制符,说明它具有缺省的访问控制特性,这种缺省的访问控制特性称为“友好访问”。友好访问规定只有在同一个包中的对象才能访问和引用这些类,因此,友好访问又称为包访问性。同样道理,类内的数据成员和成员方法如果没有访问控制符来限定,那么它们同样具有“友好访问”的特性,它们也具有包访问性,可以被同一个包中的其他类所访问和引用。,【示例程序C5
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号