资源描述:
《Java2实用教程课件(第3版第4章).ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
ProductionandOperationsManagement第4章 类、对象和接口4.1编程语言的几个发展阶段4.2类4.3对象4.4static关键字4.5this关键字4.6包4.7访问权限4.8类的继承4.9对象的上转型对象4.10多态性4.11abstract类和abstract方法4.12super关键字4.13接口4.14内部类4.15匿名类4.16异常类4.17Class类4.18基本类型的类包装4.19反编译和文档生成器4.20jar文件 ProductionandOperationsManagement4.1编程语言的几个发展阶段机器语言(如汇编语言)计算机处理信息的早期语言是所谓的机器语言,这种语言中的指令都是由0,1组成的序列,称这样的序列为一条机器指令。过程语言语言把代码组成叫做过程或函数的块。每个块的目标是完成某个任务,例如,一个C的源程序就是由若干个书写形式互相独立的函数组成。面向对象编程面向对象编程主要体现下列三个特性:1.封装性2.继承3.多态Java语言是面向对象语言,它的源程序是由若干个类组成,源文件是扩展名为.java的文本文件 ProductionandOperationsManagement4.2类类是组成Java程序的基本要素。类封装了一类对象的状态和方法。类是用来定义对象的模板。类的实现包括两部分:类声明类体 ProductionandOperationsManagement什么是类?类是描述对象的“基本原型”,它定义一种对象所能拥有的数据和能完成的操作,在面向对象的程序设计中,类是程序的基本单元。variablesmethods程序中的对象是类的一个实例,是一个软件单元,它由一组结构化的数据和在其上的一组操作构成。 ProductionandOperationsManagement变量:即指对象的所知道的状态。方法:指对象的功能单元。消息:软件对象通过相互间传递消息来相互作用和通信。一个消息由三部分组成:1.接受消息的对象2.要完成方法的名字3.方法需要的参数对象B对象Amessage ProductionandOperationsManagement1.类声明classPeople{…}“classPeople”叫做类声明;“People”是类名。习惯上类名的第一个字母大写,但这不是必须的。 ProductionandOperationsManagement2.类体写类的目的是为了描述一类事物共有的属性和功能,描述过程由类体来实现。类声明之后的一对大括号“{”,“}”以及它们之间的内容称做类体,大括号之间的内容称做类体的内容。类体的内容由两部分构:一部分是变量的定义,用来刻画属性;另一部分是方法的定义,用来刻画功能。 ProductionandOperationsManagementclass梯形{float上底,下底,高,laderArea;//变量定义部分float计算面积()//方法定义{laderArea=(上底+下底)*高/2.0f;returnladerArea;}void修改高(floath)//方法定义{高=h;}} ProductionandOperationsManagement请同学们定义一个学生类ClassStudent{String姓名;Int年龄;StaticString成份=“学生”;Char性别;Data出生年月;String籍贯;Void学习能力(){if(年龄>=15){System.out.println(姓名+“的学习能力强”);}else{System.out.println(姓名+“的学习能力一般”);}}} ProductionandOperationsManagement3.成员变量和局部变量类由两部分组成:变量的定义和方法的定义。变量的定义被称为类的成员变量——基本属性。在方法体中定义的变量和方法的参数被称为局部变量——特有属性。成员变量在整个类内都有效,局部变量只在定义它的方法内有效。成员变量又分为实例成员变量(简称实例变量)和类变量(也称静态变量).如果成员变量的类型前面加上关键字static,这样的成员变量称做是类变量或静态变量。如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏,即这个成员变量在这个方法内暂时失效.如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏。这时如果想在该方法内使用成员变量,必须使用关键字this。 ProductionandOperationsManagementclass三角形{floatsideA,sideB,sideC,lengthSum;voidsetSide(floatsideA,floatsideB,floatsideC){this.sideA=sideA;this.sideB=sideB;this.sideC=sideC;}}this.sideA,this.sideB,this.sideC就分别表示成员变量sideA,sideB,sideC实例变量类变量 ProductionandOperationsManagement4.方法类体由两部分组成:变量的定义和方法的定义。方法的定义包括两部分:方法声明和方法体。方法参数在整个方法内有效,方法内定义的局部变量从它定义的位置之后开始有效。如果局部变量的定义是在一个复合语句中,那么该局部变量的有效范围是该复合语句,即仅在该复合语句中有效;如果局部变量的定义是在一个循环语句中,那么该局部变量的有效范围是该循环语句,即仅在该循环语句中有效。 ProductionandOperationsManagementClassPeople{intboy;floata[];intz=20;//staticintboy;system.out.println(z);intf(){booleancool;Workmanzhangboy;intx,y;x=10;y=30;boy=x+y;returnboy;}intg(){intm,n,z;z=5;m=z;//m=this.zn=x+y;returnx+y;}}classWorkman{doublex;Peoplezhiwei;boy=20;}(×)//非法的引用(×)//非法的引用(×)//非法的引用 ProductionandOperationsManagement5.方法重载方法重载的意思是:一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同。 ProductionandOperationsManagementclassArea{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;}} ProductionandOperationsManagement6.构造方法构造方法是一种特殊方法,它的名字必须与它所在的类的名字完全相同,而且没有类型,构造方法也可以重载。构造方法主要是用来创建对象。例题4.1P46 ProductionandOperationsManagementclass梯形{float上底,下底,高;梯形()//名字相同,没有类型{上底=60;下底=100;高=20;}梯形(floatx,inty,floath)//名字相同,没有类型{上底=x;下底=y;高=h;}} ProductionandOperationsManagement构造方法:方法的名字必须与它所在的类名完全相同,并且不返回任何数据类型,即它用void修饰。如:classtom{intx,y;intjerry(intx){returnx;}intjerry(intx,inty){returnx+y;}voidtom(){x=67;y=100;}tom(intx,inty){this.x=x;this.y=y;}}方法重载构造方法构造方法重载 ProductionandOperationsManagement7.类方法和实例方法类中的方法也可分为实例方法和类方法.方法声明时,方法类型前面不加关键字static的是实例方法、加关键字static的是类方法。构造方法是特殊的方法,不能用static修饰构造方法。 ProductionandOperationsManagement几点值得注意的问题:⑴对成员变量的操作只能放在方法中,方法可以对成员变量和方法体中自己定义的局部变量进行操作;⑵实例方法既能对类变量操作也能对实例变量操作,而类方法只能对类变量进行操作;⑶一个类中的方法可以互相调用,实例方法可以调用该类中的其他方法;类中的类方法只能调用该类的类方法,不能调用实例方法。详见P44-45例。 ProductionandOperationsManagement4.3对象简单地说对象就是程序员在程序中可以访问的元素。它包括控件所代表的图形、窗口、屏幕、打印机等环境对象。类只是创建对象的模板,当使用一个类创建了一个对象时,我们也说给出了一个实例。一个对象就是实例。 ProductionandOperationsManagement1.创建对象创建一个对象包括两个部分:对象的声明为对象分配内存(创建)对象的内存模型参见p7-48页。 ProductionandOperationsManagement例如:classPoint{intx,y;Point(){x=12;y=16;}Point(inta,intb){x=a;y=b;}}publicclassa{publicstaticvoidmain(Stringargs[]){Pointp1,p2;//声明对象p1,p2。p1=newPoint();p2=newPoint(23,37);使用构造方法为对象p1,p2分配内存。……}}如果Point(intx,inty)如何引用X,y如果Point()方法没有定义,些程序是否正确? ProductionandOperationsManagement2.使用对象对象不仅可以操作自己的变量改变状态,而且还拥有了使用创建它的那个类中的方法的能力,对象通过使用这些方法可以产生一定的行为。通过使用运算符“.”,对象可以实现对自己的变量访问和方法的调用。当对象调用方法时,方法中出现的成员变量就是指该对象的成员变量。P49例4.3例4.4的结果 ProductionandOperationsManagementP49例4.3classXiyoujiRenwu{floatheight,weight;Stringhead,ear,hand,foot,mouth;voidspeak(Strings){head="歪着头";System.out.println(s);}} ProductionandOperationsManagementclassExample4_3{publicstaticvoidmain(Stringargs[]){XiyoujiRenwuzhubajie,sunwukong;//声明对象zhubajie=newXiyoujiRenwu();//为对象分配内存sunwukong=newXiyoujiRenwu();zhubajie.height=1.80f;//对象给自己的变量赋值zhubajie.head="大头";zhubajie.ear="一双大耳朵";sunwukong.height=1.62f;//对象给自己的变量赋值sunwukong.weight=1000f;sunwukong.head="绣发飘飘";System.out.println("zhubajie的身高:"+zhubajie.height);System.out.println("zhubajie的头:"+zhubajie.head);System.out.println("sunwukong的重量:"+sunwukong.weight);System.out.println("sunwukong的头:"+sunwukong.head);zhubajie.speak("俺老猪我想娶媳妇");//对象调用方法System.out.println("zhubajie现在的头:"+zhubajie.head);sunwukong.speak("老孙我重1000斤,我想骗八戒背我");//对象调用方法System.out.println("sunwukong现在的头:"+sunwukong.head);}} ProductionandOperationsManagement运行结果:zhubajie的身高:1.8zhubajie的头:大头sunwukong的重量:1000.0sunwukong的头:绣发飘飘俺老猪我想娶媳妇zhubajie现在的头:歪着头老孙我重1000斤,我想骗八戒背我sunwukong现在的头:歪着头为什么不“大头”呢?为什么不“绣发飘飘”呢? ProductionandOperationsManagement3.对象的引用和实体当用类创建一个对象时,类中的成员变量被分配内存空间,这些内存空间称做该对象的实体,而对象中存放着引用,以确保实体由该对象操作使用。P51页图4.5一个类创建的两个对象,如果具有相同的引用,那么就具有完全相同的实体。没有实体的对象称作空对象,空对象不能使用,即不能让一个空对象去调用方法产生行为。 ProductionandOperationsManagement4.参数传值当方法被调用时,如果方法有参数,参数必须要实例化,即参数变量必须有具体的值。在Java中,方法的所有参数都是“传值”的,也就是说,方法中参数变量的值是调用者指定的值的拷贝。例如,如果向方法的int型参数x传递一个int值,那么参数x得到的值是传递值的拷贝。方法如果改变参数的值,不会影响向参数“传值”的变量的值。 ProductionandOperationsManagement基本数据类型参数的传值对于基本数据类型的参数,向该参数传递的值的级别不可以高于该参数的级别,比如,不可以向int型参数传递一个float值,但可以向double型参数传递一个float值。例4.5设计一个实现下列要求的java小应用程序。1、设计一个people类,类包含一个face成员和一个显示face的方法;2、设计一个A类,包含一个无返回值的方法F,方法F有3个参数,其中分别为Int、double和people类型;方法现实对Int、double变量自动加1和people类中的face设置成“笑脸”,并输出Int、double和people类中的face的值;3、设计一个含main方法的公共类,在类中对Int、double类型变量进行初值化,创建people和A类的对象,people对象face=“很严肃的样子”,并输出main方法中Int、double型变量的值和face的值。 ProductionandOperationsManagementclassPeople{Stringface;voidsetFace(Strings){face=s;System.out.println(face);}}classA{voidf(intx,doubley,Peoplep){x=x+1;y=y+1;p.setFace("笑脸");System.out.println("参数x和y的值分别是:"+x+","+y);System.out.println("参数对象p的face是:"+p.face);}} ProductionandOperationsManagementpublicclassExample4_5{publicstaticvoidmain(Stringargs[]){intx=100;doubley=100.88;Peoplezhang=newPeople();zhang.setFace("很严肃的样子");Aa=newA();a.f(x,y,zhang);System.out.println("main方法中x和y的值仍然分别是:"+x+","+y);System.out.println("main方法中对象zhang的face是:"+zhang.face);}} ProductionandOperationsManagement运行结果:很严肃的样子笑脸参数x和y的值分别是:101,101.88参数对象p的face是:笑脸main方法中x和y的值仍然分别是:100,100.88main方法中对象zhang的face是:笑脸 ProductionandOperationsManagement引用类型参数的传值Java的引用型数据包括对象、数组和接口。当参数是引用类型时,“传值”传递的是变量的引用而不是变量所引用的实体。如果改变参数变量所引用的实体,就会导致原变量的实体发生同样的变化。但是,改变参数的引用不会影响向其传值的变量的引用。例4.6P53引用实体引用传值引用型参数引用型变量 ProductionandOperationsManagement课堂练习1.编写一个java程序求长方体的体积和表面积。2.设计一个类,用于表示一个学生的学号、姓名及所学的数学、英语和程序设计三门课程的成绩;设计一个类表示一个班,这些学生都学习上述三门课程;设计一个类,用于输出学生的姓名及总成绩。 ProductionandOperationsManagement练习1参考代码classchangti{ints,v;intside(inta,intb,intc){s=2*(a*b+b*c+a*c);returns;}intv1(inta,intb,intc){v=a*b*c;returnv;}} ProductionandOperationsManagementpublicclassexec1{publicstaticvoidmain(String[]args){intx,y,z,ss,vv;x=12;y=28;z=20;changtiaa=newchangti();vv=aa.v1(x,y,z);ss=aa.side(x,y,z);System.out.println("长方体的表面积="+ss);System.out.println("长方体的体积="+vv);}} ProductionandOperationsManagement练习2代码//学生类classStudent{publiclongno;publicStringname;publicfloatmath;publicfloatenglish;publicfloatjava;Student(longno,Stringname,floatmath,floatenglish,floatjava){this.no=no;this.name=name;this.math=math;this.english=english;this.java=java;}} ProductionandOperationsManagement//定义一个班级类classClassmate{Studentst[];Classmate(){}}//定义一个输出学生成绩类classPrintStudent{PrintStudent(){}voidprint(Students){System.out.println(s.name+"t"+(s.math+s.english+s.java));}} ProductionandOperationsManagementpublicclassExec2{staticintN=3;//定义班级人數为3人publicstaticvoidmain(Stringargs[]){Classmatem=newClassmate();m.st=newStudent[N];m.st[0]=newStudent(10021093,"Tom",76,89,90);m.st[1]=newStudent(10021094,"Jom",76,89,70);m.st[2]=newStudent(10021095,"张山",86,79,60);PrintStudentprt=newPrintStudent();System.out.println("Name"+"tTotalScore");for(inti=0;iD:javajava1000java4D:javajava1000java4>javacExample4_9.javaD:javajava1000java4>javaExample4_9方法二:在Example4_9.java源程序的首行添加packagejava1000.java4;进入到d:java目录。Cdd:java(当前目录的祖父目录)D:java>javajava1000.java4.Example4_9 ProductionandOperationsManagement需要注意:系统的运行问题:如使用:packagejava1000.java4系统的运行模式为:D>javajava1000.java4.类名D>java1000java4>javaExample4_5例4-9。P59。注意观察运行方式。 ProductionandOperationsManagement2.import语句使用import语句可以引入包中的类。在编写源文件时,除了自己编写类外,我们经常需要使用Java提供的许多类,这些类可能在不同的包中。在学习Java语言时,使用已经存在的类,避免一切从头做起,这是面向对象编程的一个重要方面。Java提供的系统包或类有:Applet:小应用程序类;awt、:图形、文本、窗口等类;Lang:基本语言类;等等;如何使用系统提供的类、自定义的类呢? ProductionandOperationsManagement几个需要注意的问题:①lang类:系统自动引入,不需要使用import引入;②增加引入包的数量或种类,可能会增加编译时间,但不会影响程序运行性能;③当使用了自定义的包时,一定要注意运行模式。如:如使用:packagejava1000.java4系统的运行方式为:必须在classPath中指明包的位置:在D:java1000(注意系统提示符)Setclasspath=c:jdk1.6jrelibrt.jar;.;d:④可以使用无名包类。如果使用PrimNumber类,可以将该类存放在当前程序所在的目录中。例4-12。P62。 ProductionandOperationsManagement3、将类打包我们可以将自己单独定义的类,供其他类使用,可以通过import引用。例4-13。P63。首先建立一个类:TrangleTrangle保存在d:java1000java4目录下,并编译。在D:jdk100目录下保存Example4_13.javaCdD:jdk100Setclasspath=c:jdk1.6jrelibrt.jar;.;d:再编译Example4_13.java文件最后执行Example4_13. ProductionandOperationsManagement4.7访问权限类创建了一个对象之后,该对象可以通过“.”运算符操作自己的变量、使用类中的方法,但对象操作自己的变量和使用类中的方法是有一定限制的——访问权限。所谓访问权限是指对象是否可以通过“.”运算符操作自己的变量或通过“.”运算符使用类中的方法。用来修饰成员变量或方法:private、protected和public三种。 ProductionandOperationsManagement1.私有变量和私有方法一个类在另外一个类中创建一个对象后,该对象不能访问自己的私有变量和私有方法对于一个类的私有类变量(静态成员变量),那么在另外一个类中,也不能通过类名来操作这个私有类变量。私有变量和私有方法不能跨类使用。如教材P64页例。P65例题4.14 ProductionandOperationsManagementclassExample4_14{privateintmoney;//私有变量Example4_14(){money=2000;}privateintgetMoney()//私有方法{returnmoney;}publicstaticvoidmain(Stringargs[]){Example4_14exa=newExample4_14();exa.money=3000;//引用私有变量intm=exa.getMoney();System.out.println("money="+m);}} ProductionandOperationsManagement2.共有变量和共有方法一个类在另外一个类中创建一个对象后,该对象能访问自己的public变量和public方法对于一个类的public类变量(静态成员变量),那么在另外一个类中,也能通过类名来操作这个public类变量。 ProductionandOperationsManagement3.友好变量和友好方法不用private、public、protected修饰符的成员变量和方法被称为友好变量和友好方法。一个类在另外一个类中创建一个对象后,如果两个类在同一包中,该对象能访问自己的友好变量和友好方法对于一个类的友好类变量(静态成员变量),如果两个类在同一包中,那么在另外一个类中,也能通过类名来操作这个友好类变量。 ProductionandOperationsManagement4.受保护的成员变量和方法一个类在另外一个类中创建一个对象后,如果两个类在同一包中,该对象能访问自己的protected变量和protected方法对于一个类的protected类变量(静态成员变量),如果两个类在同一包中,那么在另外一个类中,也能通过类名来操作这个protected类变量。在后面学习类的继承时,将讲述protected和“友好”之间在继承方面的区别。 ProductionandOperationsManagement5、public类和友好方法用public修饰的类为公有类,可以在任何另外一个类中,使用public创建对象。不加public修饰的称为友好类。友好类只能在同一个包中使用。注意:①不能用protected和private修饰;②访问权限的级别排列为:Public、protected、友好的、private。 ProductionandOperationsManagement访问控制权限控制小结 ProductionandOperationsManagement4.8类的继承在Java中,类是一个层次结构,其中有一个被称为Object的特殊超类,所有的类都直接或间接地继承Object类子类继承父类的属性和方法,同时也可以修改父类的属性或重载父类的方法,以及在父类的基础上添加新的属性和方法。因此,父类和子类之间反映的是“一般与特殊”、“共性与个性”的关系。 ProductionandOperationsManagement继承是一种由已有的类创建新类的机制。利用继承,我们可以先创建一个共有属性的一般类,根据该一般类再创建具有特殊属性的新类,新类继承一般类的状态和行为,并根据需要增加它自己的新的状态和行为。由继承而得到的类称为子类,被继承的类称为父类(超类)。Java不支持多重继承(子类只能有一个父类)。注意:多重继承是通过接口来实现。 ProductionandOperationsManagement1.子类在类的声明中,通过使用关键字extends来创建一个类的子类,格式如下:class子类名extends父类名{…}例如:classStudentsextendsPeople{…}Students为People的子类。《注意》没有extends,默认父类为Object只能有一个父类,即单继承子类继承父类的全部成员类继承具有传递性 ProductionandOperationsManagement2.子类的继承性类有可以有两种重要的成员:成员变量和方法。子类的成员中有一部分是子类自己声明定义的,另一部分是从它的父类继承的。所谓子类继承父类的成员变量作为自己的一个成员变量,就好象它们是在子类中直接声明一样,可以被子类中自己声明的任何实例方法操作。所谓子类继承父类的方法作为子类中的一个方法,就象它们是在子类中直接声明一样,可以被子类中自己声明的任何实例方法调用。 ProductionandOperationsManagement1)子类和父类在同一包中的继承性如果子类和父类在同一个包中,那么,子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且也自然地继承了父类中不是private的方法作为自己的方法,继承的成员或方法的访问权限保持不变。P69例题4.15 ProductionandOperationsManagementclassFather{privateintmoney;floatweight,height;Stringhead;voidspeak(Strings){System.out.println(s);}}classSonextendsFather{Stringhand,foot;} ProductionandOperationsManagementpublicclassExample4_15{publicstaticvoidmain(Stringargs[]){Sonboy;boy=newSon();boy.weight=1.80f;boy.height=120f;boy.head="一个头";boy.hand="两只手";boy.foot="两只脚";boy.speak("我是儿子");System.out.println(boy.money);System.out.println(boy.hand+boy.foot+boy.head+boy.weight+boy.height);}}上述程序是否有错,为什么? ProductionandOperationsManagement2)子类和父类不在同一包中的继承性如果子类和父类不在同一个包中,那么,子类继承了父类的protected、public成员变量做为子类的成员变量,并且继承了父类的protected、public方法为子类的方法,继承的成员或方法的访问权限保持不变。如果子类和父类不在同一个包里,子类不能继承父类的友好变量和友好方法。 ProductionandOperationsManagement3.成员变量的隐藏和方法的重写子类也可以隐藏继承的成员变量,对于子类可以从父类继承的成员变量,只要子类中定义的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量.子类通过方法的重写可以隐藏继承的方法,方法重写是指:子类中定义一个方法,并且这个方法的名字、返回类型、参数个数和类型与从父类继承的方法完全相同。对于子类创建的一个对象,如果子类重写了父类的方法,则运行时系统调用子类重写的方法,如果子类继承了父类的方法(未重写),那么子类创建的对象也可以调用这个方法,只不过方法产生的行为和父类的相同而已.P70例题4.164.17 ProductionandOperationsManagement如:classChengji{protectedfloatf(floatx,floaty){returnx*y;}}classXiangjiaextendsChengji{floatf(floatx,floaty){returnx+y;}}子类中重写父类的方法时,不可以降低方法的访问权限。上述程序是否有错,为什么? ProductionandOperationsManagement4.final关键字用final(最终)关键子可以修饰类、成员变量和方法中的参数。final类不能被继承,即不能有子类。如果一个方法被修饰为final方法,则这个方法不能被重写。如果一个成员变量被修饰为final的,就是常量,常量必须赋给初值,而且不能再发生变化。如果方法的参数被修饰为final的,该参数的值不能被改变。 ProductionandOperationsManagement用final声明的作用用final声明的类:通常是一些有固定作用、用来完成某种标准功能的类用final声明的属性:通常用来描述属于该类对象的一些常量值用final声明的方法:用来限制子类对父类方法的重载,确保程序的安全性和正确性。 ProductionandOperationsManagement4.9对象的上转型对象(自学)假设B类是A类子类或间接子类,当我们用子类B创建一个对象,并把这个对象的引用放到A类的对象中时:Aa;Bb=newB();a=b;或者:Aa;a=newB();称这个A类对象a是子类对象b的上转型对象.对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原子类对象的一些属性和功能。 ProductionandOperationsManagement上转对象不能操作子类新增的成员变量(失掉了这部分属性);不能使用子类新增的方法(失掉了一些功能)。上转型对象可以操作子类继承或隐藏成员变量,也可以使用子类继承的或重写的方法。上转型对象操作子类继承或重写的方法时,就是通知对应的子类对象去调用这些方法。因此,如果子类重写了父类的某个方法后,对象的上转型对象调用这个方法时,一定是调用了这个重写的方法。可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有属性和功能。P73例题4.19 ProductionandOperationsManagementclass类人猿{privateintn=100;voidcrySpeak(Strings){System.out.println(s);}}classPeopleextends类人猿{voidcomputer(inta,intb){intc=a*b;System.out.println(c);}voidcrySpeak(Strings){System.out.println("**"+s+"**");}} ProductionandOperationsManagementclassExample4_19{publicstaticvoidmain(Stringargs[]){类人猿monkey=newPeople();monkey.crySpeak("Ilovethisgame");Peoplepeople=(People)monkey;//把上转型对象强制转化为子类的对象。people.computer(10,10);//为什么?}}monkey.crySpeak()是父类还是子类的方法?正确吗?为什么? ProductionandOperationsManagement4.10多态性多态性就是指父类的某个方法被其子类重写时,可以各自产生自己的功能行为.当一个类有很多子类时,并且这些子类都重写了父类中的某个方法。那么当我们把子类创建的对象的引用放到一个父类的对象中时,就得到了该对象的一个上转型对象,那么这个上转的对象在调用这个方法时就可能具有多种形态.P75例题4.20 ProductionandOperationsManagement4.11abstract类和abstract方法所谓抽象类就是没有具体实例对象的类。它的主要用途是用来描述概念性的内容,这样可以提高开发效率,更好地统一用户接口。用关键字abstract修饰的类称为abstract类(抽象类)。abstractclassA{…} ProductionandOperationsManagementabstract类有如下特点1)abstract类可以有abstract方法。和普通的类相比,abstract类可以有abstract方法。对于abstract方法,只允许声明,不允许实现,而且不允许使用final修饰abstract方法。如:abstractclassA{abstractintmin(intx,inty);intmax(intx,inty){returnx>y?x:y;}} ProductionandOperationsManagement2)abstract类不能用new运算创建对象对于abstract类,我们不能使用new运算符创建该类的对象,需产生其子类,由子类创建对象。如果一个类是abstract类的子类,它必须具体实现父类的abstract方法,这就是为什么不允许使用final修饰abstract方法的原因。一个abstract类只关心它的子类是否具有某种功能,并不关心功能的具体行为,功能的具体行为由子类负责实现,抽象类中的抽象方法可以强制子类必须给出这些方法的具体实现。例4.21、4.22。 ProductionandOperationsManagementabstractclassA{abstractintmin(intx,inty);intmax(intx,inty){returnx>y?x:y;}}classBextendsA{intmin(intx,inty){returnx