单元3Java的面向对象编程.ppt_第1页
单元3Java的面向对象编程.ppt_第2页
单元3Java的面向对象编程.ppt_第3页
单元3Java的面向对象编程.ppt_第4页
单元3Java的面向对象编程.ppt_第5页
已阅读5页,还剩125页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单元3Java的面向对象编程,任务导入,任务一:用面向对象的方法实现一个企业内部员工管理系统的员工建模。员工具有两种身份:普通员工和经理,经理也是员工,他具有员工的一切属性,此外也有属于自身的属性。要求如下。1)首先设计一个员工类Employee,并描述它的一些基本属性:员工号、姓名、工资等,同时提供一个print()方法用于输出员工的基本信息。2)创建员工类Employee的对象,并访问其成员。3)为类Employee定义构造方法,并调用不同的构造方法创建对象。4)为类Employee增加静态成员变量公司名(company)。5)实现员工类Employee的数据封装。6)定义类Employee的子类Manager,在子类中定义新的属性奖金bonus,增加新的成员方法printBonus()。7)在子类Manager中重写父类的print()方法。,教学目标,知识目标理解类与对象的概念。掌握类的定义和对象的创建。理解构造方法的概念和定义。理解面向对象的三大特征:封装、继承和多态。技能目标能够利用面向对象的方法设计Java程序,相关知识,类与对象构造方法类成员内部类Java实现面向对象的三大特征,类与对象,面向对象编程是软件设计与实现的有效方法,它将客观世界中存在的事物看作对象,每个客观事物都有自己的特征和行为。,对象的示例,收银员对象,顾客对象,顾客姓名:朱丽叶年龄:28体重:52千克操作:购买商品,状态,姓名:布兰尼职衔:收银员年龄:35体重:60千克操作:收款打印帐单,行为,对象的基本概念,变量,方法,客观世界的实体,程序中对象,对象具有两方面的含义(考虑从哪些方面描述对象),对象,“对象是存在的具体实体,具有明确定义的状态和行为。”,消息传递,“消息指一个对象为执行某项特定操作而向另一个对象发送的请求”,类,类是抽象的,对象是具体的,具有相同特征和行为的对象被抽象为类。类是对象的模板,包括一个对象的所有数据和代码。,类的示例,形状类,动物类,汽车类,面向对象技术的实现,对象、类和实体的关系,类是创建对象的模板,对象是类的实例,类定义,类定义中必须要写类名,应该使用Java语言合法的标识符来命名类名不能与java中已定义好的类名相同,格式:修饰符class类名extends父类名implements接口名表成员变量声明方法成员声明,其中class、extends和implements都是Java的关键字。,类中的方法6-1,方法的名称,参数列表,方法的主体,方法返回的对象类型或原始类型,方法体,若局部变量与类的成员变量同名,则类的成员变量被隐藏。,方法体是对方法的实现,它包括局部变量的声明以及所有合法的Java指令。方法体中声明的局部变量的作用域在该方法内部。,任务一第一步,【实战】:定义一个名为Rectangle表示长方形的类,它包含double类型的长length和宽width两个数据成员和设置长方形长宽值的方法setDim()、计算长方形面积的方法area()。,练习,对象的创建,声明,类名对象名;,声明并不为对象分配内存空间,而只是分配一个引用空间,实例化,类名对象名=new类名();,例:Employeee1=newEmployee();,运算符new为对象分配内存空间,它调用对象的构造方法,返回引用,初始化,另外执行构造方法,可进行初始化,当一个变量被创建时,会对其中各种类型的成员变量自动按下表进行初始化赋值。,对象的使用,访问对象成员的一般形式为:对象名.成员变量名对象名.成员方法名(),运算符”.”在这里称为成员运算符,任务一第二步,按照前面设计Employee.类来充当生产车间,创建Employee类的对象,构造方法,在Java中,任何变量在被使用前都必须先设置初值。Java提供了为类的成员变量赋初值的专门功能:构造方法。,构造方法的特点,构造方法名与类名相同。构造方法不返回任何值,也没有返回类型。每一个类可以有零个或多个重载的构造方法。若没有为一个类显式的定义构造方法,则当创建类对象时,编译器将自动为它创建一个没有参数的默认构造方法.构造方法只能在创建对象时通过new关键字来自动调用。,注意:一旦我们自己定义了构造方法,系统将不再为我们提供默认的不带参数的构造方法。,classEmployeeintid;Stringname;floatsalary;publicEmployee()publicEmployee(intx)id=x;,任务一第三步,publicEmployee(intx,Strings)id=x;name=s;publicEmployee(intx,Strings,floaty)id=x;name=s;salary=y;publicvoidprint()System.out.println(工号:+id+姓名:+name+工资:+salary);,classTestEmployeepublicstaticvoidmain(Stringargs)Employeee1=newEmployee(1);Employeee2=newEmployee(2,王强);Employeee3=newEmployee(3,李明,3500f);e1.print();e2.print();e3.print();,通过构造方法赋初值,关键字this的作用,this代表对当前对象的引用。利用关键字this,可以在构造方法和非静态方法中引用当前对象的任何成员。构造方法的形式参数与类的成员变量名相同在构造方法中调用其他重载的构造方法,用this(参数列表)的形式参照P72、P73的代码,publicclassLeafinti=0;Leaf(inti)this.i=i;Leafincreament()i+;returnthis;voidprint()System.out.println(i=+i);publicstaticvoidmain(Stringargs)Leafleaf=newLeaf(100);leaf.increament().increament().print();,类成员静态成员变量,假如要表示IBM公司的所有员工,在Employee类中增加一个成员变量公司(company),如何实现?,思考?,类变量,Company=“IBM”,static,静态变量或类变量,静态变量的访问:类名.变量名,任务一的第四步为Employee类增加静态成员变量company,classEmployeeintid;Stringname;floatsalary;staticStringcompany=IBM;publicEmployee(intid)this.id=id;publicEmployee(intid,Stringname)this(id);=name;publicEmployee(intid,Stringname,floatsalay)this(id,name);this.salary=salay;publicvoidprint()System.out.println(工号:+id+姓名:+name+工资:+salary);classTestEmployeepublicstaticvoidmain(Stringargs)Employeee1=newEmployee(1);Employeee2=newEmployee(2,王强);Employeee3=newEmployee(3,李明);e1.print();e2.print();e3.print();System.out.println(Epany);,类变量的应用访问量统计,classCountpublicstaticvoidmain(Stringargs)Useru1=newUser();u1.login();Useru2=newUser();u2.login();,classUserstaticintcount=0;voidlogin()count+;System.out.println(你是第+count+位访问者);,静态成员方法static修饰符,static修饰符修饰的方法叫静态方法,目的:使方法独立于类的实例,使用类去访问,类方法,调用静态方法的语法为:classname.methodname();,类方法的应用,思考,为什么main()方法要用static来修饰?,内部类,在类的内部定义的类称为内部类,内部类的主要作用是将逻辑上相关联的类放在一起。在解决一个复杂的问题时,可能希望创建一个类,用来辅助自己的程序方案,但是又不希望将其公开,内部类则可以实现这一点。内部类经常用于GUI(图形用户界面)的事件处理。,内部类的定义,简单的内部类定义如下:classAclassB()此时类B就是类A的内部类,类A称为类B的外部类。,内部类的特性,名字不能与包含它的类名相同。可以使用包含它的类的静态和实例成员变量,也可以使用它所在方法的局部变量。可以定义为abstract类型。可以声明访问权限为private或protected。若想在内部类中声明任何static成员,则该内部类必须声明为static类型。,内部类的定义和使用案例3-2,Java实现面向对象的三大特征,封装性、继承性、多态性是面向对象的三个主要特性。,封装性的引入,classEmployeeintid;Stringname;floatsalary;staticStringcompany=IBM;publicEmployee()publicEmployee(intid)this.id=id;publicEmployee(intid,Stringname)this(id);=name;,publicEmployee(intid,Stringname,floatsalay)this(id,name);this.salary=salay;publicvoidprint()System.out.println(工号:+id+姓名:+name+工资:+salary);classTestEmployeepublicstaticvoidmain(Stringargs)Employeee1=newEmployee(1);=刘华;e1.salary=-1000f;e1.print();,通过实例启发学生思考为什么引入封装性?,封装性的实现,外部世界,所谓封装,就是信息隐藏,隐藏对象的实现细节,不让用户看到,封装的示例3-1,接口,采购经理,罗杰斯先生,法拉力公司,.,迪斯尼汽车公司,.,市场经理,雪莉女士,要求,封装的示例3-2,有选择地提供数据,法拉力公司,迪斯尼汽车公司,封装的示例3-3,实体法拉力公司,实体迪斯尼汽车公司,AutiLtd,.,ButoLtd,.,设置器和访问器方法,任务一的第五步,实现封装的Employee类,classEmployeeintid;Stringname;privatefloatsalary;/数据私有化publicvoidsetSalary(floati)if(i5000)/规定员工的工资在10005000之间return;elsesalary=i;publicfloatgetSalary()returnsalary;,将其设为私有的,方法设为公有,封装的好处,继承性,类继承是指一个类可以继承其他类的非私有成员,实现代码复用。被继承的类称为父类,继承父类后产生的类称为子类。,继承,父类,子类,继承的实现,classSubClassextendsSuperClass,Java中的继承是通过extends关键字来实现的。,关键字,任务一的第六步,定义Employee类的子类Manager类,继承的特点,注意:在Java语言中,只允许单继承。,继承的优点,子类对象的初始化,构造方法不能继承,但子类在创建对象时要对继承来自父类的成员进行初始化,因此,在创建子类时除了执行子类的构造方法外,还需要调用父类的构造方法,具体遵循原则如下:,当子类未定义构造方法时,创建对象时将无条件地调用父类的无参构造方法;对于父类的含参数构造方法,子类可以在自己构造方法中使用super调用它,但super调用语句必须是子类构造方法中的第一个可执行语句;子类在自己的构造方法中如果没有用super明确调用父类的构造方法,则在创建对象时,将自动先执行父类的无参构造方法,然后再执行自己定义的构造方法。,类成员的覆盖,在继承中,若子类(派生类)新增的成员名称与父类(超类)成员相同,则称为成员覆盖(overriding)。,成员变量的覆盖,若子类声明了与父类同名的变量,则父类的变量被隐藏起来,直接使用的是子类的变量,但父类的变量仍占据空间,可通过super或父类名来访问。,程序运行结果:Subclass:200Superclass:100,成员变量的覆盖,案例3-3:子类与父类的成员变量同名classAintx=100;classBextendsAintx=200;voidprint()System.out.println(Subclass:+x);System.out.println(Superclass:+super.x);publicstaticvoidmain(Stringargs)(newB().print();,成员变量的覆盖,super关键字的第二个作用是访问被子类覆盖的父类成员。需要注意的是super不能用于静态方法中,因为静态方法只能访问静态的变量,在静态方法中,父类的静态变量可通过类名前缀来引用。,成员方法的覆盖,子类也可以定义与父类同名的方法,实现对父类方法的覆盖。成员方法的覆盖与成员变量的覆盖不同之处在于:子类覆盖父类的成员变量只是使它不可见,父类的同名成员变量在子类的对象中仍占据自己的空间;而子类覆盖父类的成员方法将清除父类方法所占用的空间,从而使得父类的方法在子类中不复存在。,方法重写,成员方法覆盖应注意的问题,覆盖方法的方法名、返回类型和参数列表必须与它所覆盖的方法相同覆盖方法不能比它所覆盖的方法访问性更低覆盖方法不能比它所覆盖的方法抛出更多的异常,任务一的第七步,在子类Manager中重写父类的print()方法。,final修饰符,类对象之间的类型转换,父类对象和子类对象的转换需要注意以下原则:,子类对象可以被视为是其父类的一个对象,反之则不可。若一个方法的形式参数定义的是父类的对象,则调用该方法的实际参数可以使用子类对象。若父类对象引用指向的实际是一个子类对象,则这个父类对象的引用可以用强制类型转换转化成子类对象的引用。,案例3-4子类对象转换成父类,子类对象转换成父类,说明:1)通过运行结果可看到程序在编译时能够自动把类B的对象转换成类A的类型,运行时JVM根据实际的对象类型,调用子类的方法。2)但是如果在程序中添加被注释的代码a.func3(),编译时就会报错。因为对于编译器来说,只分析程序的语法,只知道变量a的类型是类A,而类A又没有func3()这个方法,所以编译无法通过。,父类对象转换成子类,父类对象转换成子类需进行强制类型转换。在进行强制类型转换之前首先判断参数的类型,只有在确保实参是子类的对象时才进行类型转换,判断对象的类型可以使用instanceof操作符,语法格式如下:对象instanceof类(接口),父类对象转换成子类,publicstaticvoidcallA(Aa)if(ainstanceofB)Bb=(B)a;b.func1();b.func2();b.func3();elsea.func1();a.func2();,多态性,方法重写实现的动态多态性(运行时多态),方法重载实现的静态多态性(编译时多态),多态性,多态性,1编译时多态编译时多态是指在程序编译阶段即可确定下来的多态性,编译时多态主要体现在方法的重载,重载表现为同一个类中方法的多态性。一个类中声明多个重载方法就是为一种功能提供多种实现。在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来确定调用相应的方法。2运行时多态运行时多态是指必须等到程序运行时才可确定的多态性,主要通过继承结合动态绑定获得。前面讲到的子类对象自动转换为父类的例子中,Java运行时系统根据调用该方法的实例的类型,来决定调用哪个方法。对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子类继承了父类的方法(未重写),则运行时系统调用父类的方法。因为存在类型的兼容性,所以有些方法只有在运行时才能确定是调用父类的还是子类的方法,这就是运行时多态。,多态的好处,通过引入多态,可以大幅提高程序的可复用性和灵活性,简化代码,练习,【实战】:通过分析,编程实现上图,任务导入,任务二:利用接口描述动物的继承关系,具体要求如下。1)定义动物接口,规定动物有吃东西的行为。2)定义食肉动物类和食草动物类。3)定义会飞的接口。4)定义鸟类。5)通过接口的继承定义会飞的动物接口。6)动物接口的引用。7)把所有动物类都放在同一个包(com.animal)中。,教学目标,知识目标学会抽象类和接口的定义与使用。掌握包的概念。理解各种访问修饰符的作用范围。技能目标能够定义接口并实现接口。能够定义和使用包。能够灵活运用各种访问修饰符。,相关知识,抽象类接口包Java中的访问控制符,抽象类,由abstract修饰的方法叫抽象方法,抽象方法没有方法体;包含抽象方法的类叫抽象类,由abstract修饰。抽象方法必须声明在抽象类中。抽象方法语法:abstracttypemethod_name(parameter_list);声明抽象类语法:abstractclass使用:父类中的某些抽象不包含任何逻辑,并需要在子类中重写,子类提供这种抽象方法的实现细节,案例3-5计算底面半径为2、高为3的圆柱体的体积和长、宽、高分别为2、3、4的长方体体积。,abstractclassShape.doublelength;doublewidth;doubleheight;doubleradius;.abstractdoublevol();,classCircleextendsShape*计算圆柱体的体积.doublevol()returnMath.PI*radius*radius*height;,classRectangleextendsShape*计算长方体的体积.doublevol()returnlength*width*height;,抽象类,抽象类可以具有指向子类对象的对象引用,接口,接口的定义,使用interface关键字定义一个接口:,接口的定义包括接口声明和接口体。接口声明的格式如下:publicinterfaceinterfaceNameextendslistOfSuperInterfaceextends子句与类声明的extends子句基本相同,不同的是一个接口可有多个父接口,用逗号隔开,而一个类只能有一个父类。,接口的定义,接口体包括常量定义和方法定义。常量定义格式为typeNAME=value;该常量被实现该接口的多个类共享,具有public,static,final的属性。方法(具有public和abstract属性)定义格式为returnTypemethodName(paramlist);,任务二的第一步,定义接口Animal,规定动物有吃的行为。,接口的实现,注意:在接口的实现类中,重写接口的方法必须声明为public,因为接口中定义的方法为public(默认)。,在类的声明中用implements子句来表示一个类实现某个接口,在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法,任务二的第二步,任务二的第二步,接口的实现食草类动物。,任务二的第二步,接口的实现食肉类动物。,一个类实现多个接口,一个类可以实现多个接口,在implements子句中用逗号分开。Java语言中只有单继承,但通过接口可以间接地实现多继承。,一个类实现多个接口,如动物不光具有吃的功能,有些动物还会飞,而有些动物会游泳,该如何设计实现?方案一:可以在接口中增加飞的功能,代码如下:,存在的问题:所有接口的实现类,将都具有飞的功能,这显然不能满足要求,因为只有一部分动物会飞。,一个类实现多个接口,方案二:任务二的第三步,单独定义飞的接口Fly。,一个类实现多个接口,任务二的第四步:定义一个Bird类,同时实现Animal和Fly接口。,注意:一个类实现多个接口时,必须重写所有抽象的方法。,接口的继承,接口可以通过关键字extends继承其他接口例如:InterfaceBInterfaceAextendsB,接口的继承,任务二的第五步,定义会飞的动物接口AnimalFly,Bird类只需实现AnimalFly接口,接口的引用,接口可以作为一种引用类型来使用。这样做的好处如下:,把变量定义成使用接口的对象引用而不是类的对象引用。任何实现了所声明接口的类的实例都可以被这样的一个变量引用。当通过这些引用调用方法时,在实际引用接口的实例的基础上,方法被正确调用。被执行的方法在运行时动态操作。调用代码在完全不知被调用代码的情况下可以通过接口来调度。,接口的引用,任务二的第六步。,接口的优点,接口的使用使得方法的描述说明和方法功能的分开,有助于降低程序的复杂性,使程序设计灵活,便于扩充修改。这也是Java面向对象程序设计方法中多态特性的体现。,包,包将类和接口有机地组织成层次结构,与具体的文件系统的目录树结构层次一致。包允许将类组合成较小的单元,使其易于找到和使用相应的类文件。有助于避免命名冲突。包允许在更广的范围内保护类、数据和方法。,一组相关的类和接口的集合称为包。,包的创建,package包名1.包名2.;,语法格式如下:,注意:1、包的命名规范:全部用英文小写字母,用网址的倒叙命名。如:com.ibm.2、在Java程序中,package语句必须是程序的第一条非空格、非注释语句。,包的创建,任务二的第七步,把所有动物类都放在同一个包(com.animal)中,只需在每个类文件的第一行插入下面的语句即可。packagecom.animal;说明:1)很多初学者常常误以为把一个类放在某个目录下,这个目录名就是这个类的包名。其中不是有了目录结构,就等于有了包名,包名必须在程序中通过package语句指定,而不是由目录结构来指定的,是先有了包名,才生成相应的目录结构。2)当需要引入某个包中的类时,需要将包所在的路径添加到classpath环境变量中。,包的使用,1、使用import语句import包名.类名;import包名.*;,2、直接使用包java.applet.Appletap=newjava.applet.Applet();,JavaAPI的主要包,Java中的访问控制符,访问修饰符,访问修饰符,说明:1)default是默认的,即不使用修饰符的情况。2)类通常只用两种访问权限:default和public。因为类封装了类成员,因此类成员的访问权限也与类的访问权限有关。,Java异常处理任务导入,任务三:编写一个除法运算的程序,能够处理除数为零的异常,要求如下:1)用积极的方式处理程序中的异常。2)用消极的方式处理程序中的异常。,教学目标,知识目标理解异常的概念。掌握处理异常的两种方式。学会自定义异常类。技能目标能够在Java程序中进行异常处理,相关知识,什么是异常异常处理的两种方式自定义异常,Java异常处理,publicclassExceptionDemo1publicintcalculate(intoperand1,intoperand2)intresult=operand1/operand2;returnresult;publicstaticvoidmain(Stringargs)ExceptionDemo1obj=newExceptionDemo1();intresult=obj.calculate(9,0);System.out.println(result);,异常情况,异常,程序突然终止并将控制交给操作系统,在运行时发生的错误,案例3-6简单的算术运算。,什么是异常,在程序运行过程中发生的、会打断程序正常执行的事件称为异常(Exception),也称为例外。,例如,零用作除数(产生算术异常ArithmeticException)、在指定的磁盘上没有要打开的文件(产生文件未找到异常FileNotFoundException)数组下标越界(产生数组下标越界异常ArrayIndexOutOfBoundsException)等,常见异常,异常类的层次,为内部错误,因此在正常情况下不期望用户的程序捕获它们,Java虚拟机在运行时生成的例外,由系统检测,用户可不做处理,系统将它们交给缺省的异常处理程序,程序中可预知的问题,可能会带来意想不到的结果,Java程序必须捕获或声明所有的非运行时异常,异常处理的两种方式,捕获异常,声明抛出异常,throws,Try-catch,消极的处理方式,积极的处理方式,积极的处理方式,采用try-catch-finally语句,在程序中进行异常处理,try,finally,catch,try-catch-finally语句的一般形式,try/要监控错误的代码块catch(异常类型1异常的变量名1)程序代码/异常的处理语句catch(异常类型2异常的变量名2)程序代码/异常的处理语句finally/在try结束前要执行的代码块,任务三的第一步,用积极的方式处理案例3-6中的异常。,指明catch可以捕获并处理的异常类型,调用异常类的方法,任务三的第一步,用积极的方式处理案例3-6中的异常。,程序的运行结果如下:/byzero除数为零程序没有终止啊,呵呵!0,由此可以看到程序发生异常时由catch语句进行捕获处理,处理后继续向下执行。Java语言异常处理的目的是提高程序的健壮性,可以在catch和finally代码块中给程序一个修正机会,使得程序不因异常而终止或发生意外的改变。同时,通过获取Java异常信息,也为程序的开发维护提供了方便,一般通过异常信息能很快找到出现异常的问题(代码)所在。,异常类的常用方法,多重catch块2-1,一段代码可能会生成多个异常当引发异常时,按顺序查看每个catch语句,并执行第一个类型与异常类型匹配的语句执行其中的一条catch语句之后,其他的catch语句将被忽略,try.catch(ArrayIndexOutOfBoundsExceptione)catch(Exceptione),多重catch块2-2,try.catch(Exceptione)catch(ArrayIndexOutOfBoundsExceptione),使用多重catch语句时,异常子类一定要位于异常父类之前。,案例3-7有多个catch子句的try语句,finally块,try、catch和finally块的执行流程,finally子句可以保证,无论try块中是否抛出异常,finally块中的语句都会被执行到,这样可以对程序的状态作统一的管理。finally语句对增强程序的鲁棒性非常重要。,try块,finally块,ca

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论