您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Java语言程序设计类与对象
Java语言程序设计-类与对象教师:段鹏飞作业面向对象特性Java语言中有三个典型的面向对象的特性:封装性、继承性和多态性。•封装的步骤修改属性的可见性创建getter/setter方法在getter/setter方法中加入属性控制语句1、如何使用封装设为private用于属性的读写对属性值的合法性进行判断classStudent{privatefloatjava=0;privatefloatdatabase=0;privatefloathtml=0;publicfloatgetJava(){returnjava;}publicvoidsetJava(intjava){if(java100||java0){this.java=60;System.out.println(“Java成绩在0和100之间,默认值是60);}elsethis.java=java;}//其它getter/setter方法}this代表当前对象12231、如何使用封装1、如何使用封装•类成员(属性和方法)的可见性–属性是private–访问操作是public•getXXX()•setXXX()–普通方法不限制61、如何使用封装•类的可见性78继承性–为什么会有继承?•建立一个类后,发现另一个新的类有相同的特性,两个选择:重新定义一个新的类;在已有类的基础上,修改(加加/减减)–父类和子类,子类继承(拥有)父类所有的数据和方法,同时子类可以有新的数据和方法,“青出于蓝,而胜于蓝”–树型结构(层次化结构)–根(基类)2、继承运输工具航空运输工具陆地运输工具水上运输工具人力驱动引擎驱动二轮四轮客运货运2、继承问题:一个类能否继承两个或多个父类?10语法//父类classSuperClass{//classbody}//子类classThisClassextendsSuperClass{//classbody}2、继承11classWheel{publicvoidinflate(inti){}}classWindow{publicvoidrollup(){}publicvoidrolldown(){}}classDoor{publicWindowwindow=newWindow();publicvoidopen(){}publicvoidclose(){}}2、继承与组合classEngine{publicvoidstart(){}publicvoidrev(){}publicvoidstop(){}}publicclassCar{publicEngineengine=newEngine();publicWheel[]wheel=newWheel[4];publicDoorleft=newDoor();publicDoorright=newDoor();publicCar(){for(inti=0;i4;i++)wheel[i]=newWheel();}publicstaticvoidmain(Stringargs[]){Carcar=newCar();car.left.window.rollup();car.wheel[0].inflate(72);}}组合:有一个(has-a)继承:是一个(is-a)122、类的继承•父类与子类的关系(extends)•基本内容1.子类可调用父类的方法和变量,子类可增加父类中没有的方法和变量2.子类可重新定义父类的静态/实例变量3.子类可重新定义父类的静态/实例方法4.继承中的构造方法5.类成员访问修饰符与继承的关系13类的继承•子类可调用父类的方法和变量•子类可增加父类中没有的方法和变量classVehicle{Stringbrand;voidsetB(Strings){brand=s;}voidshowB(){System.out.println(brand);}}classBusextendsVehicle{intline;voidsetL(intl){line=l;}voidshowL(){System.out.println(line);}}Busb=newBus();b.setB(“audi”);//**b.setL(710);b.showB();//**b.showL();子类继承父类的方法和变量,则这些方法和变量就属于子类,则子类对象对这些方法和变量的调用是显而易见的14类的继承•子类可重新定义父类中已有的变量–父类中同名的变量无效(隐藏)–通过“super.变量名”和父类名.变量名(static变量)引用classA{inti=256,j=64;staticintk=32;finalfloate=2.718f;}classBextendsA{publiccharj=‘x’;finaldoublek=5;staticinte=321;voidshow(){System.out.println(i+““+j+““+k+““+e);}voidshowA(){System.out.println(super.j+““+A.k+““+super.e);}}Bb=newB();b.show();b.showA();256x5.032164322.718this.变量名this.方法名this()super.变量名super.方法名super()super?当前对象/当前对象的父对象/其他15父类子类实例化一个子类对象thissuper调用父类的变量和方法调用子类的变量和方法2、继承中的super对象NamehidingCaseStudy:Hide.java输出:doh(float)doh(char)doh(float)初始化和类的装载•CaseStudy:Beetle.java输出:staticInsect.x1initializedstaticBeetle.x2initializedBeetleconstructori=9,j=0Beetle.kinitializedk=63j=3918–表现在继承中方法的重写•子类从父类继承(extends扩展)而来•多个子类同属一个父类,所有子类有相同的父类•继承父类的方法•在不同的子类中有不同的表现形式–表现在用一个类中方法的重载3、多态性193、多态性在继承中的表现3多态•3.1覆盖•3.2向上类型转换•3.3绑定早绑定vs晚绑定静态联编vs动态联编3.1覆盖Override•定义:子类的方法覆盖了父类的方法•相同的方法签名–方法名称–输入参数表21多态什么是多态?多态(Polymorphism),即多种状态,指程序运行时,依据对象所属类,引发对应类的方法,从而有不同的行为实现机制多态的由向上类型转换和动态绑定机制结合完成3.2向上转型Methodcallbinding•早绑定vs.晚绑定(动态/运行时刻)–CaseStudy:Shapes.java•Java中所有的绑定都是晚绑定,除了final的方法.finalfinal:Thiscannotbechanged•finalfordata•finalformethods•finalforaclassFinaldata•只能被赋值一次的变量•CaseStudy:FinalData.javaFinalmethods•有两种final方法:1.在方法上加一把锁,防止继承者改变它的意义。2.编译器把对该方法的调用变成inline调用。•privateisfinal.Finalclasses•Finalclasses是不允许被继承的。试讨论:–Finalfieldsinafinalclass?–Finalmethodsinafinalclass?抽象类和抽象方法•一个类的作用仅仅是表达接口,而不是具体的实现细节•抽象的方法是不完全的,它只是一个申明,没有方法体.•包含一个抽象方法的类被称作抽象类,抽象类必须要用abstract声明.•不能制造抽象类的对象.•从抽象类继承的类必须override所有的抽象方法,否则它自己成为一个抽象类.•可以申明一个抽象类但是里面没有一个抽象方法.Case:Shapes2.java抽象类与接口31•接口是对abstract类的进一步扩展•接口中的方法都是未实现的(类似于抽象方法),目的是在实现接口的类之间建立一种协议•接口中的变量都是常量•定义–一个类符合某个或一组接口,利用implements[public]interface接口名{成员变量;方法声明;}class类名implements接口1,接口2……{………}接口实现interface•实现interface的类,其interface中所有的方法必须被“实现”,否则这个类成为一个抽象类。•所有实现interface中的方法必须被申明为public.•Interface可以从多个interface得到继承,但是不能继承类.•一个类可以实现多个interface.Anclassimplementsaninterfacetohavetheinterface.33无修饰但在实现接口方法的类中,修饰符为publicinterfaceFigure{doublehalf=0.5,pi=3.14159;voidparameter();voidarea();}classTriangleimplementsFigure{doubleb,h;Triangle(doubleu,doublev){b=u;h=v;}publicvoidparameter(){System.out.println(b+““+h);}publicvoidarea(){System.out.println(half*h*b);}}classCircleimplementsFigure{doublex,y,r;Circle(doubleu,doublev,doublem){x=u;y=v;r=m;}publicvoidparameter(){System.out.println(x+““+y+““+r);}publicvoidarea(){System.out.println(pi*r*r);}}Trianglet=newTriangle(2,3);Circlec=newCircle(4,5,6);Figure[]f={t,c};for(inti=0;if.length;i++){f[i].parameter();f[i].area();}4、接口方法练习1、关于被私有访问控制符private修饰的成员变量,以下说法正确的是(A)可被三种类引用:该类自身、与它在同一个包中的其他类、在其他包中的该类的子类(B)可以被两种类访问和引用:该类本身、该类的所有子类(C)只能被该类自身所访问和修改(D)只能被同一个包中的类访问2、下列代码是否存在问题?publicclassTest{longa[]=newlong[10];publicstaticvoidmain(Stringarg[]){System.out.println(a[6]);}}练习3、下面哪个函数是publicvoidexample(){...}的重载函数()(A)publicdoubleexample2(intm){...}(B)publicintexample(){...}(C)publicvoidexample2(){...}(D)publicintexample(intm,floatf){...}4、抽象方法必须在抽象类中,所以抽象类中的方法都必须是抽象方法?5、一个Java类可以有多个父类?6、接口里的方法必须全部都声明成abstract?7、最终类不能派生子类,最终方法不能被重载?8、在Java程序中,通过类的定义只能实现__________重继承,但通过接口的定义可以实现_________重继承关系。9、______方法是一种仅有方法头,没有具体方法体和操作实现的方法,该方法必须在抽象类或接口之中定义。______方法是不能被当前类的子类重新定义的方法。练习10、写出执行结果练习11、
本文标题:Java语言程序设计类与对象
链接地址:https://www.777doc.com/doc-3748603 .html