首页 面向对象程序设计(高级篇)

面向对象程序设计(高级篇)

举报
开通vip

面向对象程序设计(高级篇)第4章面向对象程序设计(高级篇)主讲人:应该重点掌握以下内容:继承和多态性的基本概念继承机制多态性与重载抽象类包与接口目录4.1继承和多态性的概念4.2继承机制4.3多态性4.4抽象类4.5包与接口4.6内部类4.7匿名类4.1继承和多态性的概念4.1.1继承的概述继承,就是新的类从已有类那里得到已有的特性。已有的类称为基类或父类,产生的新类称为派生类或子类。派生类同样也可以作为基类再派生新的类,这样就形成了类的层次结构。类间的继承关系是软件复用的一种形式。子类(派生类)可以沿用父类(基类)的某些特征,并根据自己的...

面向对象程序设计(高级篇)
第4章面向对象程序设计(高级篇)主讲人:应该重点掌握以下内容:继承和多态性的基本概念继承机制多态性与重载抽象类包与接口目录4.1继承和多态性的概念4.2继承机制4.3多态性4.4抽象类4.5包与接口4.6内部类4.7匿名类4.1继承和多态性的概念4.1.1继承的概述继承,就是新的类从已有类那里得到已有的特性。已有的类称为基类或父类,产生的新类称为派生类或子类。派生类同样也可以作为基类再派生新的类,这样就形成了类的层次结构。类间的继承关系是软件复用的一种形式。子类(派生类)可以沿用父类(基类)的某些特征,并根据自己的需要对性能加以修改,添加新的属性和操作。由于巴士、卡车和出租车作为交通工具,特将它们的共同特性抽取出来,形成一个父类(也称超类),代表一般化属性,而巴士、卡车和出租车转化为子类,继承父类的一般特性包括父类的数据成员和行为如外观颜色和刹车等特性,有产生自己独特的属性和行为如巴士的最大载客数和报站,区别于父类的特性。继承的方式包括单一继承和多重继承。单一继承(singleinheritance)是最简单的方式:一个派生类只从一个基类派生。多重继承(multipleinheritance)是一个派生类有两个或多个基类。这两种继承方式如图4.1所示。请注意图中箭头的方向,本书约定,箭头表示继承的方向,由子类指向父类。4.1.2多态性的概述多态性(Polymorphism)是面向对象程序设计的重要特性之一,它与封装性和继承性一起构成了面向对象程序设计的三大特性。多态性主要体现在:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。在Java语言中,多态性体现在两个方面:由方法重载实现的静态多态性(编译时多态)和方法重写实现的动态多态性(也称动态联编)。(1)编译时多态在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。(2)动态联编程序中凡是使用父类对象的地方,都可以用子类对象来代替。在程序运行期间可以通过引用子类的实例来调用子类的方法。4.2继承机制4.2.1继承的定义编程中遇到下面的情况:定义教师类。publicclassDotNetTeacher{//教师分为.Net教师privateStringname;//教师姓名privateStringschool;//所在学校publicDotNetTeacher(StringmyName,StringmySchool){name=myName;school=mySchool;}publicvoidgiveLession(){System.out.println("启动VS2010");System.out.println("知识点讲解");System.out.println(" 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf 提问");}publicvoidintroduction(){System.out.println("大家好!我是"+school+"的"+name+".");}}定义教师类。publicclassJavaTeacher{//教师分为Java教师privateStringname;//教师姓名privateStringschool;//所在学校publicJavaTeacher(StringmyName,StringmySchool){name=myName;school=mySchool;}publicvoidgiveLession(){//授课方法的具体实现System.out.println("启动MyEclipse");System.out.println("知识点讲解");System.out.println("总结提问");}publicvoidintroduction(){//自我介绍方法的具体实现System.out.println("大家好!我是"+school+"的"+name+".");}}在程序处理中,发现两个类的定义非常相似,有很多相同点,如教师的属性姓名、所属部门类似,类的方法也基本相同。针对这种情况,将java教师类和.net教师类的共性抽取出来,形成父类Teacher类,使得.net教师和java教师成为Teacher类的子类,则子类继承父类的基本属性和方法,就简化了子类的定义。上述代码修改如下:父类Teacher:publicclassTeacher{privateStringname;//教师姓名privateStringschool;//所在学校publicTeacher(StringmyName,StringmySchool){name=myName;school=mySchool;}publicvoidgiveLesson(){//授课方法的具体实现System.out.println("知识点讲解");System.out.println("总结提问");}publicvoidintroduction(){//自我介绍方法的具体实现System.out.println("大家好!我是“+school+"的"+name+"。");}}子类JavaTeacher:publicclassJavaTeacherextendsTeacher{publicJavaTeacher(StringmyName,StringmySchool){super(myName,mySchool);}publicvoidgiveLesson(){System.out.println("启动MyEclipse");super.giveLesson();}}子类NetTeacher:publicclassDotNetTeacherextendsTeacher{publicDotNetTeacher(StringmyName,StringmySchool){super(myName,mySchool);}publicvoidgiveLesson(){System.out.println("启动VS2010");super.giveLesson();}}子类自动继承父类的属性和方法,子类中不再存在重复代码,从而实现代码的重用。完整的代码如下:【例4-1】自定义父类Teacher,创建其两个子类JavaTeacher和DotNetTeacher。/*本程序的功能是定义一个教师类Teacher,并声明该类的两个子类,并进行调试。*/文件名:test_teacher.java4.2.2继承的传递性类的继承是可以传递的。类b继承了类A,类c有继承了类b,这是c包涵a和b的所有成员,以及c自身的成员,这称为类继承的传递性。类的传递性对java语言有重要的意义。下面的代码体现这一点。publicclassVehicle{voidvehicleRun(){System.out.println("汽车在行驶!");}}publicclassTruckextendsVehicle{//直接父类为VehiclevoidtruckRun(){System.out.println("卡车在行驶!");}}publicclassSmallTruckextendsTruck{//直接父类为TruckprotectedvoidsmallTruckRun(){Console.WriteLine("微型卡车在行驶!");}pbulicstaticvoidmain(String[]args){SmallTrucksmalltruck=newSmallTruck();smalltruck.vehicleRun();//祖父类的方法调用smalltruck.truckRun();//直接父类的方法调用smalltruck.smallTruckRun();//子类自身的方法调用}}4.2.3类中属性的继承与隐藏1.属性的继承子类可以继承父类的所有非私有属性。见下面代码:publicclassPerson{publicStringname;publicintage;publicvoidshowInfo(){System.out.println(“尊敬的”+name+”,您的年龄为:”+age);}}publicclassStudentextendsPerson{publicstringschool;publicintengScore;publicintjavaScore;publicvoidsetInfo(){name=“陈冠一”;//基类的数据成员age=20;//基类的数据成员school=“郑州轻工业学院”;}}2.属性的隐藏子类也可以隐藏继承的成员变量,对于子类可以从父类继承的成员变量,只要子类中定义的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量。当子类执行它自己定义的方法时,所操作的就是它自己定义的数据成员,从而覆盖父类继承来的数据成员。子类通过成员变量的隐藏可以把父类的状态变为自身的状态。4.2.4类中方法的继承、覆盖与重载1.方法的继承父类中非私有方法都可以被子类所继承。下面的程序实现这点,详见程序中的注释。classPerson{//基类privateStringname;privateintage;publicvoidinitInfo(Stringn,inta){name=n;age=a;}publicvoidshowInfo(){System.out.println("尊敬的"+name+",您的年龄为:"+age);}}publicclassSubStudentextendsPerson{//子类privateStringschool;privateintengScore;privateintjavaScore;publicvoidsetScores(Strings,inte,intj){school=s;engScore=e;javaScore=j;}publicstaticvoidmain(String[]args){SubStudentobjStudent=newSubStudent();objStudent.initInfo("王烁",22);//来自父类继承的方法objStudent.showInfo();//来自父类继承的方法objStudent.setScores("情话大学",79,92);}}1.在子类继承父类的成员方法时,应注意:子类不能访问父类的private(私有)成员方法,但子类可以访问父类的public(公有)、protected(保护)成员方法。protected访问时,子类和同一包内的方法都能访问父类的protected成员方法,但其他方法不能访问。2.方法的覆盖子类通过方法的覆盖可以隐藏继承的方法,方法覆盖是指:子类中定义一个方法,并且这个方法的名字、返回类型、参数列表与从父类继承的方法完全相同。【例4-2】自定义父类Person,创建其子类SubStudent。/*本程序的功能是定义一个Person类和它的子类SubStudent,测试父子类具有同名方法时子类的方法覆盖父类的同名方法*/文件名:SubStudent.java3.方法的重载与方法的覆盖(overriding)不同,方法的重载(overloading)不是父子类之间的同名方法的调用,而是在一个类中允许同名的方法存在,是类对自身同名方法的重新定义。如java系统提供的输出命令的同名方法的使用如下:System.out.println();//输出一个空行System.out.println(doublesalary);//输出一个双精度类型的变量后换行System.out.println(Stringname);//输出一个字符串对象的值后换行由于重载发生在同一个类里,不能再用类名来区分不同的方法了,所以一般采用不同的形式参数列表,包括形式参数的个数、类型、顺序的不同,来区分重载的方法。只需简单地调用print方法并把一个参数传递给print,由系统根据这个参数的类型来判断应该调用哪一个print方法。方法重载有不同的表现形式,如基于不同类型参数的重载:classAdd{publicStringSum(Stringpara1,Stringpara2){…}publicintSum(intpara1,intpara2){…}}如相同类型不同参数个数的重载:classAdd{publicintSum(intpara1,intpara2){…}publicintSum(intpara1,intpara2,intpara3){…}}【例4-3】自定义父类Area,创建其携带不同参数及返回类型的同名方法。/*本程序的功能是定义一个Area类和它的同名方法,测试类中同名方法的重载*/文件名:TestArea.java4.构造方法的重载构造方法也可以重载,它是指同一个类中存在着若干个具有不同参数列表的构造方法。如Employee类中构造方法的重载。classEmployee{//定义父类:员工类………//忽略类中属性,值保留重载的构造方法Employee(){//无参的构造方法,仅仅初始化员工的编号employeeNo=employeeNextNo++;}Employee(Stringname){//有一个参数的构造方法,仅仅初始化员工的编号和姓名employeeNo=employeeNextNo++;employeeName=name;}Employee(Stringname,doubleinitSalary){//有两个参数的构造方法,仅仅初始化员工的编号、姓名和工资employeeNo=employeeNextNo++;employeeName=name;employeeSalary=initSalary;}}4.2.5在子类中使用构造方法子类不能继承父类的构造方法。子类在创建新对象时,依次向上寻找其基类,直到找到最初的基类,然后开始执行最初的基类的构造方法,再依次向下执行派生类的构造方法,直至执行完最终的扩充类的构造方法为止。注:对于无参数的构造方法,执行不会出现问题。如果是带参数的构造方法,还需要做相应的处理。如果基类中没有默认构造方法或者希望调用带参数的基类构造方法,就要使用关键字super来显式调用基类构造方法。使用关键字super调用基类构造方法的语句,必须是子类构造方法的第一个可执行语句。调用基类构造方法时传递的参数不能是关键字this或当前对象的非静态成员。【例4-4】子类中使用构造方法的实例。/*程序功能描述:在程序中声明了父类Employee和子类CommonEmployee,子类继承了父类的非私有的属性和方法,但父子类计算各自的工资的方法不同,如父类对象直接获取工资,而子类在底薪的基础上增加奖金数为工资总额,通过子类的构造方法中super的调用类初始化父类的对象,并调用继承父类的方法toString()输出员工的基本信息。*/文件名:test_constructor.java4.3.1多态性的体现在java语言中,多态性体现在两个方面:由方法重载实现的静态多态性(编译时多态)和方法覆盖实现的动态多态性(运行时多态)。静态多态性是在编译的过程中确定同名操作的具体操作对象的,而动态多态性则是在程序运行过程中动态地确定操作所针对的具体对象的。这种确定操作具体对象的过程就是联编(binding),也称为动态绑定。4.3多态性4.3.2静态多态性静态多态性是在编译的过程中确定同名操作的具体操作对象的。下面的代码体现了编译时的多态性。publicclassPerson{privateStringname;privateintage;publicvoidinitInfo(Stringn,inta){//同名方法name=n;age=a;}publicvoidinitInfo(Stringn){//同名方法name=n;}publicvoidshowInfo(){System.out.println(“尊敬的”+name+”,您的年龄为:”+age);}}4.3.3动态多态性和静态联编相对应,如果联编工作在程序运行阶段完成,则称为动态联编。在编译、连接过程中无法解决的联编问题,要等到程序开始运行之后再来确定。如果父类的引用指向一个子类对象时,当调用一个方法完成某个功能时,程序会动态地(在执行时)选择正确的子类的同样方法去实现该功能,就称为动态方法绑定。下面动态方法调用的简单例子。classParent{publicvoidfunction(){System.out.println("IaminParent!");}}classChildextendsParent{publicvoidfunction(){System.out.println("IaminChild!");}}publicclasstest_parent{publicstaticvoidmain(Stringargs[]){Parentp1=newParent();Parentp2=newChild();p1.function();p2.function();}}程序的输出结果为:"IaminParent!"IaminChild!4.3.4父类对象与子类对象间的指代使用和转化this和super关键字是常用来指代父类对象与子类对象的关键字。1.this关键字this表示的是当前对象本身,更准确地说,this代表了当前对象的一个引用。对象的引用可以理解为对象的另一个名字,通过引用可以顺利地访问对象,包括修改对象的属性、调用对象的方法。2.super关键字super表示的是当前对象的直接父类对象,是当前对象的直接父类对象的引用。所谓直接父类是相对于当前对象的其他“祖先”而言的。①通过super关键字访问父类中被隐藏的成员变量classFather{intx=0;}classChildextendsFather{intx=1;publicChild(){System.out.println(super.x);}publicstaticvoidmain(Stringargs[]){newChild();//super.x=0}}②子类的构造方法中,通过super关键字调用父类的构造方法publicclassStudentextendsPerson{publicStudent(StringmyName,intmyAge){super(myName,myAge);//调用父类的构造方法,完成对属性值的初始化}}③方法覆盖后,通过super关键字调用父类的方法publicclassStudentextendsPerson{publicvoidshowInfo(){super.showInfo();System.out.println(",你的英语成绩是:"+engScore+",JAVA成绩是:"+javaScore");}}3.父类对象与子类对象的转化假设B类是A类子类或间接子类,当我们用子类B创建一个对象,并把这个对象的引用赋给A类的对象:Aa;Bb=newB();a=b;称这个A类对象:a是子类对象b的上转型对象.子类对象可以赋给父类对象,但指向子类的父类对象不能操作子类新增的成员变量,不能使用子类新增的方法。上转型对象可以操作子类继承或隐藏成员变量,也可以使用子类继承的或重写的方法。可以将对象的上转型对象再强制转换到一个子类对象,该子类对象又具备了子类所有属性和功能。如果子类重写了父类的方法,那么重写方法的调用原则如下:Java运行时系统根据调用该方法的实例,来决定调用哪个方法。对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子类继承了父类的方法(未重写),则运行时系统调用父类的方法。总之,父类对象和子类对象的转化需要注意如下原则:①子类对象可以被视为是其父类的一个对象。②父类对象不能被当作是其某一个子类的对象。③如果一个方法的形式参数定义的是父类对象,那么调用这个方法时,可以使用子类对象作为实际参数。Java语言中,用abstract关键字来修饰一个类时,这个类叫做抽象类。抽象类只关心它的子类是否具有某种功能,并不关心该功能的具体实现,功能的具体行为由子类负责实现的。一个抽象类中可以有一个或多个抽象方法。4.4.1抽象类的定义抽象类的一般格式:abstractclassClassName{//类实现…………}如abstractclassClassOne{//类实现}4.4抽象类一旦ClassOne类声明为抽象类,则它不能被实例化,只能用作派生类的基类而存在。下面的语句会产生编译错误:ClassOnea=newClassOne();抽象方法的一般格式:abstract返回值类型抽象方法(参数列表);如语句publicabstractvoidMethod();抽象方法的一个主要目的就是为所有子类定义一个统一的接口,抽象方法必须被重写。抽象类必须被继承,抽象方法必须被重写。抽象方法只需声明,无需实现;抽象类不能被实例化,抽象类不一定要包含抽象方法。若类中包含了抽象方法,则该类必须被定义为抽象类。抽象类有以下的定义规则:抽象类必须用abstract关键字来修饰;抽象方法也必须用abstract来修饰。抽象类不能被实例化,也就是不能用new关键字去产生对象。抽象方法只需声明,而不需实现。含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是个抽象类。具体实现可参考下面两段的代码。(1)抽象类的基本实现方法abstractclassBase{intbasevar;//成员变量publicabstractvoidM1();//抽象的成员函数,只有声明,没有集体的实现,、//必须在该类的子类实现方法…….}classDerivedextendsBase{intderivedvars;//成员变量publicvoidM1(){//子类必须重写父类的抽象成员函数M1//实际实现的语句体}……..}(2)继承于抽象类的类一般应该实现抽象类中的所有抽象方法(重写)。如果没有,那么该派生类也应该声明为抽象类。abstractclassA{publicabstractvoidMethodA();}classBextendsA{//错误,子类B没有实现对象父类A中抽象方法MethodA//的重写,一次B类应声明为抽象类publicvoidMethodB(){}}classCextendsA{publicvoidMethodA(){}}。4.4.2抽象类的使用下面给出一个抽象类的使用,体会一下抽象类和抽象方法的定义,以及子类怎样实现对父类抽象方法的重写。【例4-5】抽象类的使用实例。/*程序功能介绍:Shape类是对现实世界形状的抽象,子类Rectangle和子类Circle是Shape类的两个子类,分别代表现实中两种具体的形状。在子类中根据不同形状自身的特点计算不同子类对象的面积。*/文件名:test_shape.java接下来,再给一个较为复杂的实例,它体现了java中多态性的特点,大家可细细体会。【例4-6】多态性的使用实例。/*程序功能介绍:多态性实现的工资系统中的一部分程序。Employee类是抽象的员工父类,Employee类的子类有经理Boss,每星期获取固定工资,而不计工作时间;子类普通雇员CommissionWorker类,除基本工资外还根据每周的销售额发放浮动工资等。子类Boss和CommissionWorker声明位final,表明它们不再派生新的子类。*/文件名:test_abstract.java4.5.1java中的包一个包就是一些提供访问保护和命名空间管理的相关类与接口的集合。使用包的目的就是使类容易查找使用,防止命名冲突,以及控制访问。 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 Java库被分类成许多的包,其中包括java.io、javax.swing和java.net等等。标准Java包是分层次的。就像在硬盘上嵌套有各级子目录一样,可以通过层次嵌套组织包。所有Java包都在Java和Javax包层次内。4.5包与接口1.定义包包声明的一般形式:packagepkg[.pkg1[.pkg2]];说明:package说明包的关键字pkg包名定义包的语句必须放在所有程序的最前面。也可以没有包,则当前编译 单元 初级会计实务单元训练题天津单元检测卷六年级下册数学单元教学设计框架单元教学设计的基本步骤主题单元教学设计 属于无名包,生成的class文件放在在一般与.java文件同名的目录下。package名字一般用小写。如下创建包的语句:packageemployee;packageemployee.commission;创建包就是在当前文件夹下创建一个子文件夹,以便存放这个包中包含的所有类的.class文件。上面的第二个创建包的语句中的符号“.”代表了目录分隔符,即这个语句创建了两个文件夹。第一个是当前文件夹下的子文件夹employee;第二个是employee下的子文件夹commission,当前包中的所有类就存放在这个文件夹里。2.向包添加类要把类放入一个包中,必须把此包的名字放在源文件头部,并且放在对包中的类进行定义的代码之前。例如,在文件Employee.java的开始部分如下:packagemyPackage;publicclassEmployee{……}则创建的Employee类编译后生成的Employee.class存放在子目录myPackage下。3.包引用通常一个类只能引用与它在同一个包中的类。如果需要使用其他包中的public类,则可以使用如下的几种方法。(1)直接使用包名、类名前缀一个类要引用其他的类,无非是继承这个类或创建这个类的对象并使用它的域、调用它的方法。对于同一包中的其他类,只需在要使用的属性或方法名前加上类名作为前缀即可;对于其他包中的类,则需要在类名前缀的前面再加上包名前缀。例如:employee.Employeeref=newemployee.Employee();//employee为包名(2)加载包中单个的类。用import语句加载整个类到当前程序中,在java程序的最前方加上下面的语句importemployee.Employee;Employeeref=newEmployee();//创建对象(3)加载包中多个类。用import语句引入整个包,此时这个包中的所有类都会被加载到当前程序中。加载整个包的import语句可以写为:importemployee.*;//加载用户自定义的employee包中的所有类4.编译和运行包1.CLASSPATH我们曾指出了CLASSPATH环境变量的设置是告诉Java在哪里能找到第三方提供的类库。2.编译编译的过程和运行的过程大同小异,只是一个是找出来编译,另一个是找出来装载。javac–dd:\user\chap04packTest.java3.运行d:\user\chap04\javatest.packTest5.Jar包把开发好的程序交给用户就叫发布。JDK中有一个实用工具jar.exe可以完成打包工作。打包好的文件扩展名一般为jar,所以叫JAR文件。通过编辑一个manifest.mf的文件来实现的。manifest.mf文件应该包含以下一行内容:Main-Class:主类的完整名称如:Main-Class:com.misxp.PackageExercise这一行后面必须回车换行,否则可能出错。另外,冒号后面必须空一格。这个文件必须和字节码文件放在同一目录中。使用工具jar.exe可以创建可执行的JAR文件。进入命令行状态让字节码所在文件夹成为当前文件夹执行以下命令:jar–cvmfmanifest.mfjarfilename.jarcom就可以得jarfilename.jar打包文件。Jarfilename名字可以自己取。双击jarfilename.jar就可以运行程序。6.JDK中的常用包java.lang----包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。2.java.awt----包含了构成抽象窗口工具集(abstractwindowtoolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。3.java.applet----包含applet运行所需的一些类。4.java.net----包含执行与网络相关的操作的类。5.java.io----包含能提供多种输入/输出功能的类。6.java.util----包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。4.5.2java中的接口由于Java只支持单一继承,接口是Java实现多重继承功能的一种手段,一种结构。接口只定义了与外界交流时输入、输出的格式。换句话说,通过在接口中定义一些方法(抽象方法),可以用接口大致规划出类的共同行为,而把具体的实现留给具体的类。如果一个抽象类中的所有方法都是抽象的,我们就可以将这个类用另外一种方式来定义,也就是接口定义。接口是抽象方法和常量值的定义的集合,从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。1.接口声明接口声明的一般格式:publicinterface接口名{//常量//方法声明}常量定义部分定义的常量均具有public、static和final属性。接口中只能进行方法的声明,不提供方法的实现,在接口中声明的方法具有public和abstract属性。如publicinterfacePCI{finalintvoltage;publicvoidstart();publicvoidstop();}。2.接口实现接口可以由类来实现,类通过关键字implements声明自己使用一个或多个接口。所谓实现接口,就是实现接口中声明的方法。class类名extends[基类]implements接口,…,接口{……//成员定义部分}接口中的方法被默认是public,所以类在实现接口方法时,一定要用public来修饰。如果某个接口方法没有被实现,实现类中必须将它声明为抽象的,该类当然也必须声明为抽象的。如interfaceIMsg{voidMessage();}publicabstractclassMyClassimplementsIMsg{  publicabstractvoidMessage();}【例4-7】接口实现的实例。文件名:test_interface1.java【例4-8】接口实现的实例。/*程序功能:模拟现实世界的计算机组装功能。定义计算机主板的PCI类,模拟主板的pci通用插槽,有两个方法---start(启用)和stop(停用)。接下来声明具体的子类声卡类SoundCard和网卡类NetworkCard,它们分别实现PCI接口中的start和stop方法,从而实现PCI标准的不同部件的组装和使用。*/文件名:Assembler.javaJava支持在一个类中定义另一个类中,称为嵌套类。在大多数情况下,嵌套类(静态的嵌套类除外)就是内部类(innerclass)。这样的类称作内部类,而包含内部类的类成为内部类的外嵌类。内部类的类体中不可以声明类变量和类方法。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。内部类具有自己的成员变量和成员方法。通过建立内部类的对象,可以存取其成员变量和调用其成员方法。4.6内部类例如下面的例子:pubicclassGroupOne{intcount;//外部类的成员变量publicclassStudent{//声明内部类Stringname;//内部类的成员变量publicvoidoutput(){//内部类的成员方法System.out.println(this.name+"");}}}4.6内部类内部类有如下特性:一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。Java将内部类作为外部类的一个成员,就如同成员变量和成员方法一样。因此外部类与内部类的访问原则是:在外部类中,通过一个内部类的对象引用内部类中的成员;反之,在内部类中可以直接引用它的外部类的成员,包括静态成员、实例成员及私有成员。【例4-9】内部类和外部类之间的访问/*本例的类GroupTwo中声明了内部类Student,在内部类Student中构造方法存取了外部类GroupTwo的成员变量count。*/4.6内部类文件名:GroupTwo.java匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。要采用另一种形式的new语句,如下所示:new<类或接口><类的主体>这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。下面给一个匿名类的使用。4.7匿名类abstractclassAnimal{publicabstractvoidcry();}classTestCry{publicvoidtestCry(Animalanimal){//通过Animal对象的传递模拟不同动物叫声animal.cry();}}publicclassExample{publicstaticvoidmain(String[]args){TestCrycry=newTestCry();cry.testCry(newAnimal(){//构建匿名类,模拟猫叫publicvoidcry(){System.out.println("Catiscrying!");}});cry.testCry(newAnimal(){//构建匿名类,模拟狗叫publicvoidcry(){System.out.println("Dogiscrying!");}});//...省略其他}}从技术上说,匿名类可被视为非静态的内部类,所以它们具有和方法内部声明的非静态内部类一样的权限和限制。内部和匿名类是Java为我们提供的两个出色的工具。它们提供了更好的封装,结果就是使代码更容易理解和维护,使相关的类都能存在于同一个源代码文件中(这要归功于内部类),并能避免一个程序产生大量非常小的类(这要归功于匿名类)。本章主要介绍了java中继承的定义和如何实现的。子类继承了父类的功能,并根据具体需要来添加功能体需要来添加功能。多态性(Polymorphism)是面向对象程序设计的另一个重要,它与封装性和继承性一起构成了面向对象程序设计的三大特性。本章也重点介绍了java中多态性的定义和实现。由于在java中不支持多重继承的概念,因此引入了接口的概念。本章也着重介绍了java中接口的概念,并通过一实例验证了接口的重要性。本章小结classTeacher{privateStringname;//教师姓名privateStringschool;//所在学校publicTeacher(StringmyName,StringmySchool){name=myName;school=mySchool;}publicvoidgiveLesson(){//授课方法的具体实现System.out.println("知识点讲解");System.out.println("总结提问");}publicvoidintroduction(){//自我介绍方法的具体实现System.out.println("大家好!我是“+school+"的"+name+"。");}}例4-1】自定义父类Teacher,创建其两个子类JavaTeacher和DotNetTeacher。classJavaTeacherextendsTeacher{publicJavaTeacher(StringmyName,StringmySchool){super(myName,mySchool);}publicvoidgiveLesson(){System.out.println("启动MyEclipse");super.giveLesson();}}classDotNetTeacherextendsTeacher{publicDotNetTeacher(StringmyName,StringmySchool){super(myName,mySchool);}publicvoidgiveLesson(){System.out.println("启动VS2010");super.giveLesson();}}publicclasstest_teacher{publicstaticvoidmain(Stringargs[]){//声明javaTeacherJavaTeacherjavaTeacher=newJavaTeacher("李伟","郑州轻工业学院");javaTeacher.giveLesson();javaTeacher.introduction();System.out.println("\n");//声明dotNetTeacherTeacherDotNetTeacherdotNetTeacher=newDotNetTeacher("王珂","郑州工业学院");dotNetTeacher.giveLesson();dotNetTeacher.introduction();}程序运行结果如图所示:【例4-2】自定义父类Person,创建其子类SubStudent。程序运行结果如图所示:classPerson{//基类protectedStringname;protectedintage;publicvoidinitInfo(Stringn,inta){name=n;age=a;}publicvoidshowInfo(){System.out.println("尊敬的"+name+",您的年龄为:"+age);}}publicclassSubStudentextendsPerson{//子类privateStringschool;privateintengScore;privateintjavaScore;publicvoidshowInfo(){//与父类同名的方法System.out.println(school+"的"+name+"同学"+"年龄为:"+age+"英语成绩是:"+engScore+",你的JAVA成绩是:"+javaScore);}publicvoidsetScores(Strings,inte,intj){school=s;engScore=e;javaScore=j;}publicstaticvoidmain(String[]args){SubStudentobjStudent=newSubStudent();objStudent.initInfo("王烁",22);//来自父类继承的方法objStudent.setScores("郑州轻工业学院",79,92);objStudent.showInfo();//调用自身和父类同名的方法,子类的方法覆盖父//类同名的方法}}程序输出结果如图所示:【例4-3】自定义父类Area,创建其携带不同参数及返回类型的同名方法。classArea{floatgetArea(floatr){return3.14f*r*r;}doublegetArea(floatx,inty){returnx*y;}floatgetArea(intx,floaty){returnx*y;}doublegetArea(floatx,floaty,floatz){return(x*x+y*y+z*z)*2.0;}}publicclassTestArea{publicstaticvoidmain(Stringargs[]){Areaa=newArea();System.out.println("方法getArea携带一个参数的结果:"+a.getArea(5.0f));System.out.println("方法getArea携带两个参数,且返回值为double类型的结果:"+a.getArea(5.0f,12));System.out.println("方法getArea携带两个参数,且返回值为float类型的结果的结果:"+a.getArea(5,12f));System.out.println("方法getArea携带三个参数的结果:"+a.getArea(13f,4.0f,5.0f));}}图4.6程序输出结果程序输出结果如图所示:classEmployee{//定义父类:雇员类privateStringemployeeName;//姓名privatedoubleemployeeSalary;//工资总额staticdoublemini_salary=600;//员工的最低工资publicEmployee(Stringname){//有参构造方法employeeName=name;}publicdoublegetEmployeeSalary(){//获取雇员工资returnemployeeSalary;}publicvoidsetEmployeeSalary(doublesalary){//计算员工的薪水employeeSalary=salary+mini_salary;}publicStringtoString(){//输出员工的基本信息return("姓名:"+employeeName+":工资:");}}【例4-4】子类中使用构造方法的实例。classCommonEmployeeextendsEmployee{//定义子类:一般员工类privatedoublebonus;//奖金,新的数据成员publicCommonEmployee(Stringname,doublebonus){super(name);//通过super()的调用,给父类的数据成员赋初值this.bonus=bonus;//this指当前对象}publicvoidsetBonus(doublenewBonus){//新增的方法,设置一般员工的薪水bonus=newBonus;}//来自父类的继承,但在子类中重新覆盖父类方法,用于修改一般员工的薪水publicdoublegetEmployeeSalary(){returnbonus+mini_salary;}publicStringtoString(){Strings;s=super.toString();//调用自身对象的方法getEmployeeSalary(),覆盖父类同名的该方法return(s+getEmployeeSalary()+"");}}publicclasstest_constructor{//主控程序publicstaticvoidmain(Stringargs[]){Employeeemployee=newEmployee("李平");//创建员工的一个对象employee.setEmployeeSalary(1200);//输出员工的基本信息System.out.println("员工的基本信息为:"+employee.toString()+employee.getEmployeeSalary());//创建子类一般员工的一个对象CommonEmployeecommonEmployee=newCommonEmployee("李晓云",400);//输出子类一般员工的基本信息System.out.println("员工的基本信息为:"+commonEmployee.toString());}}程序的输出结果如图所示:【例4-5】抽象类的使用实例。abstractclassShape{//定义抽象类protecteddoublelength=0.0d;protecteddoublewidth=0.0d;Shape(doublelen,doublew){length=len;width=w;}abstractdoublearea();//抽象方法,只有声明,没有实现}classRectangleextendsShape{/***@paramnum传递至构造方法的参数*@paramnum1传递至构造方法的参数*/publicRectangle(doublenum,doublenum1){super(num,num1);//调用父类的构造上函数,将子类长方形的长和宽传递给父类构造方法}/***计算长方形的面积.*@returndouble*/doublearea(){//长方形的area方法,重写父类Shape的方法System.out.print("长方形的面积为:");returnlength*width;}}classCircleextendsShape{//圆形子类/***@paramnum传递至构造方法的参数*@paramnum1传递至构造方法的参数*@paramradius传递至构造方法的参数*/privatedoubleradius;publicCircle(doublenum,doublenum1,doubler){super(num,num1);//调用父类的构造上函数,将子类圆的圆心位置和半径传递//给父类构造方法radius=r;}/***计算圆形的面积.*@returndouble*/doublearea(){//圆形的area方法,重写父类Shape的方法System.out.print("圆形位置在("+length+","+width+")的圆形面积为:");return3.14*radius*radius;}}publicclasstest_shape{publicstaticvoidmain(Stringargs[]){//定义一个长方形对象,并计算长方形的面积Rectanglerec=newRectangle(15,20);System.out.println(rec.area());//定义一个圆形对象,并计算圆形的面积Circlecircle=newCircle(15,15,4);System.out.println(circle.area());}}程序的输出结果如图所示:importjava.text.DecimalFormat;abstractclassEmployee{//抽象的父类EmployeeprivateStringname;privatedoublemini_salary=600;publicEmployee(Stringname){//构造方法this.name=name;}publicStringgetEmployeeName(){returnname;}publicStringtoString(){//输出员工信息returnname;}//Employee抽象方法getSalary(),将被他的每个子类具体实现publicabstractdoublegetSalary();}}【例4-6】多态性的使用实例。finalclassBossextendsEmployee{privatedoubleweeklySalary;//Boss新添成员,周薪publicBoss(Stringname,doublesalary){//经理Boss类的构造方法super(name);//调用父类的构造方法为父类员工赋初值setWeeklySalary(salary);//设置Boss的周薪}publicvoidsetWeeklySalary(doubles){//经理Boss类的工资weeklySalary=(s>0?s:0);}publicdoublegetSalary(){//重写父类的getSalary()方法,确定Boss的薪水returnweeklySalary;}publicStringtoString(){//重写父类同名的方法toString(),输出Boss的基本信息return"经理:"+super.toString();//调用父类的同名方法}}finalclassCommissionWorkerextendsEmplo
本文档为【面向对象程序设计(高级篇)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
机构认证用户
爱赢
公司经营范围:网络软件设计、制作、图文设计、影视制作(编辑)
格式:ppt
大小:812KB
软件:PowerPoint
页数:0
分类:教育学
上传时间:2021-02-19
浏览量:1