淮海工学院计算机课程第4章深入面向对象的程序设计4.1Java的继承与多态4.2构造函数的继承与重载4.3Java的非访问控制符4.4Java的包与访问控制符4.5Java的接口4.6Java的异常处理淮海工学院计算机课程学习提要1.熟练掌握定义继承关系extends、属性的继承和隐藏、方法的继承与覆盖;2.熟悉多态,包括方法的重载、构造函数的继承与重载、this与super、父类对象与子类对象的使用和转化;3.掌握Java的非访问控制符:static、abstract、final4.掌握包package的定义与使用方法;5.掌握Java的访问控制符:public、protected、private、privateprotected6.熟悉接口interface与多重继承、了解定义接口、实现接口;7.掌握异常处理的定义和使用方法。淮海工学院计算机课程再回首:Java关键字•数据类型:bytebooleanchardoublefloatintlongshort•特殊的值:falsetruevoidnulllength•程序流程控制:ifelse、switchcase、breakdefault、do–while、for、continue、return•类的定义:classextendsimplementsimportinterfacepackagesuperthis•非访问控制符:abstractfinalstaticnative•特殊运算符:instanceofnew•访问控制符:publicprivateprotected•异常处理:trycatchfinallythrowthrows•线程:threadtransientsynchronized淮海工学院计算机课程4.1Java的继承与多态4.1.1继承与多态的概念(1)继承继承是存在于面向对象程序中两个类之间的一种关系,通过Extends关键字来实现,被继承的类称为父类或超类,继承了父类的所有数据和操作的类称为子类。新定义的子类可以从父类继承所有非private的属性和方法作为自己的成员。一个父类可以同时拥有多个子类。单重继承:任何一个类都只有一个单一的父类。程序结构为树状,比较简单。多重继承:一个类可以有一个以上的父类,其静态的数据属性和操作从所有这些父类中继承。程序结构为网状,比较复杂。淮海工学院计算机课程图4.1各种图形类及其间的继承关系淮海工学院计算机课程在面向对象的程序设计中,采用继承的机制来组织、设计系统中的类的优点:•可以提高程序的抽象程度,使之更接近于人类的思维方式;•使得程序结构清晰,降低编码和维护的工作量。注意:Java只支持单重继承,而采用接口来实现多重继承。淮海工学院计算机课程淮海工学院计算机课程(2)多态多态是指一个程序中同名的不同方法共存的情况。实现多态的途径:1)覆盖(override)——在子类中对从父类继承的方法进行重新定义,即重写。2)重载(overload)——在同一个类中定义多个同名的定义内容不同但最终功能相同的方法。比如,程序中定义多个名为print方法,用来打印不同类型的数据,如字符型、数值型等。区分同名方法的措施:采用不同的形式参数列表,包括形式参数的个数、类型、顺序的不同。注意:只是改变方法的返回值类型不改变参数是不行的。淮海工学院计算机课程类的继承示例淮海工学院计算机课程4.1.2属性的继承与隐藏(1)属性的继承:子类从父类继承属性而不是把父类属性的定义部分复制一遍,可以减少程序维护的工作量。(2)属性的隐藏:对子类从父类继承来的属性变量重新加以定义。即:子类定义了与父类同名的属性变量,即出现了子类变量对同名父类变量的隐藏。区别:子类执行继承自父类的操作时,处理的是继承自父类的变量。子类执行它自己定义的方法时,操作的是自己定义的变量,而把继承自父类的变量“隐藏”起来。淮海工学院计算机课程淮海工学院计算机课程4.1.3方法的继承、重载与覆盖(1)方法的继承父类的非私有方法作为类的非私有成员,可以被子类所继承。(2)方法的覆盖子类定义与父类同名的方法,除非使用super关键字或父类名为前缀,否则调用的都是自己定义的方法。注意:子类在重新定义父类已有的方法时应保持与父类完全相同的方法头声明,其访问权限不可窄于父类的访问权限。(3)方法的重载即类对自身已有的同名方法重新定义。方法的重载是同类中同名方法共存的情况,需通过参数列表(包括类型、顺序和数目)来区分不同的方法。注意:不能通过方法的返回值来区分同名的不同方法。淮海工学院计算机课程淮海工学院计算机课程4.1.4父类对象与子类对象的使用与转化super和this是用来指代父类对象和子类对象的关键字。Java系统默认每个类都缺省地具有null、this和super三个量,null代表“空”。(1)thisthis表示的是当前对象本身,代表当前对象的一个引用,如可以利用this写成:淮海工学院计算机课程This的使用场合•在构造函数中使用指代该构造函数创建的对象,放在另一个构造函数的第一行•在实例方法中使用指代该对象,在不影响理解的情况下可省略•使用this区分参数和成员变量避免混淆同名的参数与成员变量•使用this区分成员变量和局部变量恢复被隐藏的同名成员变量淮海工学院计算机课程淮海工学院计算机课程super代表当前对象的直接父类对象,是当前对象的直接父类对象的引用。super的两种使用方法:•使用super调用父类的构造函数放在子类构造函数的第一行•使用super操作被隐藏的成员变量和方法在子类重新定义了与父类同名的成员变量和方法时,可用super调用父类的同名属性和方法。(2)super淮海工学院计算机课程淮海工学院计算机课程淮海工学院计算机课程淮海工学院计算机课程淮海工学院计算机课程(3)父类对象与子类对象的转换原则1)子类对象可以被视为是父类的一个对象;2)父类对象不能被当作其某一个子类的对象;3)如果一个方法的形式参数定义的是父类对象,则调用这个方法时,可以使用子类对象作为实际参数;4)如果父类对象引用指向的实际是一个子类对象,则这个父类对象的引用可以用强制类型转换成子类对象的引用。淮海工学院计算机课程关于对象的上转型对象•设B类是A类的子类或间接子类,当出现下列情况时,称A类对象a是子类对象b的上转型对象。Aa;//声明A类对象Bb=newB();//声明B类(子类)对象a=b;//将子类对象赋值给父类对象注意:(1)上转型对象不能操作子类新增的成员变量,不能使用子类新增的方法;(2)不可以将父类创建的对象的引用赋值给子类声明的对象,即不可以是b=a;(3)可以将对象的上转型对象再强制转换为一个子类对象,即:b=(B)a;这时该子类对象又具备了子类的所有属性和功能。淮海工学院计算机课程上转型对象示意图对象的上转型对象a对象b新增的变量新增的方法继承或隐藏的变量继承或隐藏的方法Aa;//声明A类对象Bb=newB();//声明B类(子类)对象a=b;//将子类对象赋值给父类对象淮海工学院计算机课程淮海工学院计算机课程关于Java中对象的引用和实体•当用类创建一个对象时,类中的成员变量被分配空间,这些内存空间称为该对象的实体,而对象中放着引用,以确保实体由该对象操作使用。例:Pointp1=newPoint(12,16);Pointp2=newPoint(6,18);当执行p1=p2;后0xAB1612P1xy0xDD186P2xy对象内存模式10xDD186P2xy0xDDP1对象内存模式2淮海工学院计算机课程4.2构造方法的继承与重载4.2.1构造方法的重载指同一个类中存在着若干个具有不同参数列表的构造方法。出现重载情况时,创建该类对象的语句会自动根据给出的实际参数的数目、类型和顺序来确定调用哪个构造方法来完成新对象的初始化工作。一个类的若干构造方法之间可以通过关键字this来互相调用,目的是最大限度地利用已有程序,提高程序的抽象、封装程度,减少程序维护工作量。注意:this语句必须是整个构造方法的第一个可执行语句。淮海工学院计算机课程4.2.2构造函数的继承指子类可以继承父类的构造方法。构造方法继承应遵循的原则:1)子类无条件地继续父类的不含参数的构造方法;2)如果子类自己没有构造方法,则将继承父类的无参构造方法作为自己的构造方法;如果子类自己定义了构造方法,则在创建新对象时,先执行从父类继承来的无参构造方法,然后再执行自己的构造方法;3)对于父类的含参构造方法,子类可以通过在自己构造方法中使用super关键字来调用它,但这个调用语句必须是子类构造方法的第一个可执行语句。淮海工学院计算机课程淮海工学院计算机课程淮海工学院计算机课程关于构造函数的访问权限•一个类没有定义构造函数时,系统提供的默认无参构造函数的访问权限与该类的访问权限相同;•当类的访问权限与该类的构造函数的访问权限定义的范围不同时,则对该构造函数的访问权限是其与该类的访问权限的交集。比如:类A的构造函数是protected,而类A本身是默认的,则对类A的构造函数的访问权限是默认的。淮海工学院计算机课程4.3Java的非访问控制符•Java的非访问控制符static静态修饰符修饰属性和方法abstract抽象修饰符修饰类和方法final最终修饰符修饰类、属性和方法淮海工学院计算机课程4.3.1静态属性、静态方法与静态初始化器(1)静态属性被static修饰的属性不属于任何一个类的具体对象,是公共的存储单元。任何对象访问它时,取到的都是相同的数值。静态属性是类属性。当需要引用或修改一个static限定的类属性时,可以使用类名,也可以使用某一个对象名,效果相同。淮海工学院计算机课程(2)静态方法用static修饰符修饰的方法,是属于整个类的方法。用static修饰的方法的含义:1)调用这个方法时应该使用类名做前缀,一般不用某个具体的对象名(尽管可以用);2)该方法属于整个类,它在内存中的代码段随着类的定义而分配和装载;3)该方法不能操纵属于某个对象的成员变量,即static方法只能处理static属性。淮海工学院计算机课程淮海工学院计算机课程淮海工学院计算机课程(3)静态初始化器直接用static当名字、用{}包起来的一段特殊代码。与构造函数类似,完成初始化工作,但两者的区别是:静态初始化器对每个类初始化,构造函数对每个新创建的对象初始化。静态初始化器在所属的类加载入内存时由系统调用运行,构造函数则在产生新对象时由系统自动执行。静态初始化器不是方法,没有方法名、返回值和参数列表。总之,静态初始化器对整个类完成初始化操作,包括给static类成员赋初值。淮海工学院计算机课程淮海工学院计算机课程4.3.2抽象类和抽象方法用abstract修饰的类或方法。1)抽象类抽象类是没有具体实例对象的类,主要用来实现类之间的继承关系。使用抽象类的优点就是可以充分利用公共属性来提高开发和维护程序的效率。2)抽象方法抽象方法仅有方法头而没有具体的方法体,方法体的实现由当前类的不同子类在各自的类定义中完成。抽象方法只能存在于抽象类中。淮海工学院计算机课程抽象类与抽象方法的关系•抽象类中可以有0个或多个抽象方法,也可以包含非抽象的方法。•抽象类中可以没有抽象方法,但是,有抽象方法的类必须是抽象类。•抽象类派生的子类中必须实现抽象类中定义的所有抽象方法。淮海工学院计算机课程抽象类示例淮海工学院计算机课程淮海工学院计算机课程淮海工学院计算机课程淮海工学院计算机课程淮海工学院计算机课程4.3.3最终类、最终属性、最终方法用final最终修饰符来修饰的类、属性和方法。1)最终类用final修饰的最终类不能有子类。2)最终属性用final修饰的最终属性在整个执行过程中都不会变,一般用来修饰常量。修饰常量时需要说明常量的数据类型和常量的具体取值。为了节省空间,常量通常还同时被声明为static。3)最终方法用final修饰的最终方法其功能和语句都不能再被修改,即不能被当前类的子类重载。目的是为了预防不必要的重复定义