05-高级面向对象编程应用.pdf
《05-高级面向对象编程应用.pdf》由会员分享,可在线阅读,更多相关《05-高级面向对象编程应用.pdf(101页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、5-高级面向对象应用高级面向对象应用高级面向对象应用高级面向对象应用田登山2010年3月16日星期二教学内容1.包与import2.限定修饰符3.重载4.this5.继承6.接口与抽象类7.对象类与字符串处理类一、包与import 考虑到文件可以采用分区、目录、子目录的方式加以管理,在不同目录下放置相同名称的文件。Java借鉴了这种思路,通过包对字节码进行管理。包的定义通过“package”关键字完成,包名中定义字节码的存放目录。如果有子目录,则通过“.”加以分割,并定义出包之间的包含关系。这样一来,我们可以在不同包下定义相同名字的类了。一、包与import 在Java命名规范中,要求通过域名
2、倒置的方法,来定义各个单位的包名。这样一来各个单位即使同时定义了相同名称的类,也可以通过包名来相互区分。比如IBM公司(中国)的网站为,那么IBM中国公司在开发程序的时候,相应的包名应该是以“.ibm”开头,然后再以部门、项目的名字再作为子包,对代码加以管理。package mon;package .ibm.project.business;package .ibm.project.util;一、包与import 定义包必须在类定义(class标识符)之前,import之前。package my.lib;class CirleUtil static final double PI=3.1415
3、926;static double length(double r)return PI*r*2;static double area(double r)return PI*r*r;一、包与import 在UML中,类和类之间有依赖关系。依赖描述了两个模型元素之间的关系,即被依赖的类元素发生变化就会影响到另一个类元素,被依赖的类称作服务类,服务类发生变化被影响到的类被称使用类。一、包与import 服务类的调用方法有以下几种:(1)在使用类中声明package之后,定义使用类之前,导入服务类,格式为:import 包全名.服务类的类名;导入服务类后,在使用类中就可以直接使用服务类了(构建服务类对
4、象然后向该对象发送消息、调用服务类的静态方法)。一、包与import package another;import my.lib.CirleUtil;/导入服务类 class ImportDemo public static void main(String args)double r=1;double area=CirleUtil.area(r);/调用了服务类的静态方法System.out.println(area);一、包与import(2)在使用类中声明package之后,定义使用类之前,导入服务类所在包的所有类,格式为:import 服务类所在包的全名.*;比如import my.l
5、ib.*;该语句将导入my.lib包下所有的字节码为使用类所用。笔者不主张使用这种方法。一、包与import(3)不导入,使用全路径随时使用 在使用类代码中,不用import导入,而是直接用“服务类所在包的全名.服务类名”的方式直接使用服务类。一、包与import package another;class ImportDemo public static void main(String args)double r=1;double area=my.lib.CirleUtil.area(r);/调用了服务类的静态方法System.out.println(area);一、包与import Ja
6、va虚拟机已经自动为Java类导入了java.lang.*,也就是java.lang包下的所有的类。String、System以及前边提过的包装类都是定义在java.lang包中,所以无需导入就可以直接使用。二、限定修饰符 通过定义包,字节码被存放于放置在不同的目录。如果两个类中包的定义部分完全相同,则称为两个类位于相同包中;反之,如果两个类中包的定义部分不相同,则称为两个类位于不同包中。二、限定修饰符 小组协同开发模块时,每个模块对外开放的接口越少越好。这样一来,外部用户通过少数几个接口即可完成与被调用模块的交互。通过定义包,不同的模块定义的包名不同,通过限定修饰符,可以控制类对外是否可见,
7、类内部数据成员和成员方法对外是否可见。二、限定修饰符 服务类A和使用类B之间存在依赖关系,且使用类B依赖于服务类A。如果服务类A能够被使用类B所访问,称之为服务类A对使用类B可见;反之,如果服务类A不能被使用类B所访问,称之为服务类A对使用类B不可见。服务类A对使用类B可见,在使用类B中就可以导入服务类A,就可以构建服务类A的对象,并向新构建对象发送消息或者访问对象的状态。反之,如果服务类A对使用类B不可见,在使用类B中就无法导入服务类A自然无法构建服务类A的对象。2.1 类修饰符 类的修饰符有两个,一个是public,另一个是默认情况friendly。2.1 类修饰符 当类的定义(class
8、部分)之前不加任何的修饰符的时候,此时为默认的友好访问(friendly)。当某服务类定义为友好访问类型,该服务类只对相同包下的其他类可见。相同包下的使用类在不需要import服务类即可使用该服务类。2.1 类修饰符 如果类中没有定义包,java会给该类加上一个所谓的“匿名包”。“匿名包”中的类,只对匿名包(没有定义包)中的类不可见,对非匿名包(定义了包)中的类不可见。也就是说,某类没有定义包,该类因对外不可见而不能作为服务类。2.1 类修饰符 当类的定义(class部分)之前加入了限定修饰符public,并且定义了包名,此时该类变成了公共类。如果某类class声明部分声明为public,该类
9、不仅对相同包下的类整体可见,还对其他包中的类整体可见。因为Java类作为类库可以互相访问,类的限定修饰符使用public居多。如果不希望某类被其他包中的类所import,当然声明该类为友好访问类型。2.2 数据成员修饰符 数据成员有3个限定修饰符:private,默认的friendly和public。需要注意的是,只有类对外整体可见之后,类中数据成员才可能对外可见。2.2 数据成员修饰符 如果某类的某个数据成员前边有“private”的限定修饰符,那么,该数据成员只对该类自身可见。2.2 数据成员修饰符 如果某个类的某个数据成员前没有任何的限定修饰符,那么,该数据成员对该类自身可见,并且对相同
10、包中的类可见。2.2 数据成员修饰符 如果某个类的某个数据成员前边有“public”的限定修饰符,那么,该数据成员对该类自身可见、对相同包中的类可见、并且对不同包中的类也可见。显然,从对外可见度上来看,private最小,friendly稍大,public最大。2.2 数据成员修饰符 对于代码清单4-11中的收音机类,如果把频率和音量两个数据成员定义为public:代码清单5-12 Radio.java使用public修饰数据成员的版本 package lib;public class Radio public boolean on;public double freq;public int
11、vol;2.2 数据成员修饰符那外部如果就可以直接修改该收音机的状态了:package test;import lib.Radio;class UseRadiopublic static void main(String args)Radio r=new Radio();r.freq=107;r.freq+=10;r.freq+=10;显然代码清单中的main()方法执行完第三次修改频率后,对象r的频率最终变成了127,自然超出了FM波段的范围2.2 数据成员修饰符 数据成员的修饰符使用上,最好遵循下边的规则:要尽量按照小的方向去限定数据成员,如果在尽可能小的限定修饰符情形下程序能够编译通过,
12、就不要再声明为更大的限定修饰符;否则逐步增大限定修饰符,直至变为public。类似于收音机这样的对象,其内部属性通常声明为private。使用public声明的数据成员通常都是常数,而且为了节省内存空间,通常与static和final一起修饰该数据成员2.2 数据成员修饰符 Radio.java 数据成员声明的最终版本 package lib;public class Radio public final int MIN_VOL=0;public final int MAX_VOL=100;public final double MIN_FREQ=87.5;public final int M
13、AX_FREQ=108;private boolean on;private double freq;private int vol;2.3 方法修饰符 成员方法也有3个限定修饰符:private,默认的friendly和public。与数据成员相同,也只有类对外整体可见之后,类中成员方法才可能对外可见。2.3 方法修饰符 private:如果某类的某成员方法前有“private”的限定修饰符,那么,该成员方法只对该类自身可见。2.3 方法修饰符 friendly:如果某个类的某个成员方法前边没有任何的限定修饰符,那么,该成员方法不仅对该类自身可见,也对相同包中的类可见。2.3 方法修饰符 p
14、ublic:如果某个类的某个成员方法前边有“public”的限定修饰符,那么,该成员方法对该类自身可见、对相同包中的类可见,也对不同包中的类可见。2.3 方法修饰符 同数据成员一样,读者要尽量按照小的方向去限定成员方法,如果在尽可能小的限定修饰符情形下程序能够编译通过,就不要声明为更大的限定修饰符;否则逐步增大限定修饰符,直至变为public。在一般情况下:如果某个方法只是本方法调用,声明为private或者友好访问,如果某方法需要被不同包下的类调用,那么只能声明为public。2.4 getter/setter 在数据成员声明为private之后,外部用户如何获取和修改数据成员的值呢。Sun
15、公司提出的JavaBean规范中的getter()和setter()方法,刚好可以提供此项服务。2.4 getter/setter 按照Java编程规范,数据成员名称的第一个字母和第二个字母必须是小写。若数据成员名为xxx,那么 要提供方法getXxx()用来获取属性;setXxx()用来修改属性;对于boolean类型的成员变量,用isXxx()获取boolean类型属性;setXxx()用来修改属性。getter()和setter()方法的限定修饰符通常为public 2.4 getter/setter public class Student private int id;private
16、 String name;private boolean male;public int getId()return id;public void setId(int i)id=i;2.4 getter/setter public String getName()return name;public void setName(String n)name=n;public boolean isMale()return male;public void setMale(boolean m)male=m;2.4 getter/setter Student s=new Student();s.setI
17、d(10);s.setName(me);s.setMale(true);System.out.println(s.getId();System.out.println(s.getName();if(s.isMale()System.out.println(男);else System.out.println(女);三、重载 对于成员方法,如果方法名相同,形式参数列表中参数的个数、参数的数据类型和参数的顺序不同,被称作成员方法的重载(override)。重载的方法主要通过形式参数列表中参数的个数、参数的数据类型和参数的顺序等方面的不同来区分。在编译期间,Java编译器能检查每个方法所用的参数数目
18、和类型,在执行时虚拟机能调用正确的方法。三、重载 买机票的时候,可以登记身份证,也可以是驾照,还可以是士官证,目的都是为了证实购买者的有效身份。同时付款可以是现金付款,也可以是网上付款。自然买机票需要填写有效身份并付款,却有6种可能情形(三乘二的组合)。为此,在构建机票对象的时候,就需要通过重载机制对各种情形作出处理。三、重载 在Java命名规范中明确规定,标识符一定要明确表明其代表的含义,如果都是处理相同的功能,则标识符肯定相同。但是有些时候同名方法可能会遇到不同的情形,处理部分的代码自然就变得不相同。反映到代码中,就是形参声明不相同,实现代码不同,但是效果一致(即方法名相同)。3.1 成员
19、方法重载 Sun公司提供的JDK中有一个java.util.Random类,该类可以生成随机数。使用时只需要构建该类的对象后,即可向该对象发送消息去生成随机数:int nextInt()int nextInt(int n)以上的两个方法都是生成随机整数,但是第一个方法生成的随机数可以是正数,也可是负数。而第二个方法是生成零到n之间的随机数。两个方法目的都是生成随机整数,方法名相同。第一个生成的随机数没有限制,所以形参为空;而第二个则是零到n之间,为此形参部分加入了“intn”,用于告知随机数的范围。这就是nextInt()方法的重载。3.1 成员方法重载 java.util.Random r=
20、new java.util.Random();int x=r.nextInt();int y=r.nextInt(100);3.2 构造方法重载构造方法属于特殊的成员方法,同样可以重载。public class Student int id;String name;public Student(int i)id=i;public Student(String n)name=n;public Student(int i,String n)id=i;name=n;以下情形是重载么?public class Student int id;String name;public Student(int
21、i)id=i;public void Student(int i)id=i;四、this this有两个用法,一个是标识的当前的对象;另一个是实现构造方法的互相调用四、this 如果本类中定义的成员方法如果需要使用该类的某个数据成员,可以直接通过数据成员名进行访问,以此访问当前操作对象的某个状态值。比如代码清单中构造方法、getter()和setter()方法中访问该类属性id和name的代码:四、this public class Student int id;/学号public int getId()return id;/返回该学生对象的学号public void setId(int i)
22、/i什么含义?id=i;/把i的值赋给该学生对象的学号四、this 类先于对象定义的。对于类而言,将来对象的名称是不是不可预测。在构造方法代码中,可以使用this关键字,去标识那个将来要构建的对象;在成员方法代码中,this关键字表示的就是当前的对象四、this public class Student int id;/学号public int getId()return id;/返回该学生对象的学号public void setId(int id)this.id=id;四、this 错误的写法:public void setName(String name)name=name;/错误的代码,
23、编译器编译会通过,但是没有意义 捷径:使用Eclipse生成getter/setter()四、this 使用this访问该类的方法 public Student(int id)this.setId(id);public Student(String name)this.setName(name);四、this this可以实现构造方法的互相调用。通过“this()”语句并在在“()”内加入实参,可以调用与传入实参对应形参声明的构造方法,但是该调用语句须出现在构造方法中的第一条语句,否则编译出错!五、继承Bachelor-idnameagegendermajor:int:String:int:c
24、har:String+getId()setId(int newId)getName()setName(String newName)getAge()setAge(int newAge)getGender()setGender(char newGender)getMajor()setMajor(String newMajor):int:void:String:void:int:void:char:void:String:voidGraduate-idnameagegendertutor:int:String:int:char:String+getId()setId(int newId)getNa
25、me()setName(String newName)getAge()setAge(int newAge)getGender()setGender(char newGender)getTutor()setTutor(String newTutor):int:void:String:void:int:void:char:void:String:voidDoctor-idnameagegendermajorspendYears:int:String:int:char:String:int+getId()setId(int newId)getName()setName(String newName)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 05 高级 面向 对象 编程 应用
限制150内