收藏 分销(赏)

第六章 Java扩展类与继承.ppt

上传人:s4****5z 文档编号:14028160 上传时间:2026-06-09 格式:PPT 页数:49 大小:320.50KB 下载积分:10 金币
下载 相关 举报
第六章 Java扩展类与继承.ppt_第1页
第1页 / 共49页
第六章 Java扩展类与继承.ppt_第2页
第2页 / 共49页


点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Java,语言程序设计,第六章 扩展类与继承,6.1,子类与父类,上一章我们主要学习了类和对象的有关知识,讨论了类的构成以及用类创建对象等主要问题,本章的主要介绍类的继承、和继承有关的多态性以及接口等重要概念。,子类与父类,继承是一种由已有的类创建新类的机制。利用继承,我们可以先创建一个共有属性的一般类,根据该一般类再创建具有特殊属性的新类,新类继承一般类的状态和行为,并根据需要增加它自己的新的状态和行为。,由继承而得到的类称为子类,(,派生类,)(,derivated,class),,,被继承的类称为父类(超类)(,superclass,),。,6.1,子类与父类,父类可以是自己编写的类也可以是,java,类库中的类。利用继承有利于实现代码的重复使用,子类只需要添加新的功能代码即可。,Java,不支持多重继承,即子类只能有一个父类。,使用关键字,extends,来声明一个类是另外一个类的子类,格式如下:,class,子类名,extends,父类名,.,6.2,子类的继承性,1,继承的定义,所谓类继承就是子类继承父类的成员变量和方法作为自己的成员变量和方法,就好象它们是在子类中直接声明一样。当然,子类能否继承父类的变量和方法还有一定的限制。下面对其进行详细介绍。,2,子类和父类在同一包中的继承性,如果子类和父类在同一个包中,那么子类自然地继承了其父类中不是,private,的成员变量作为自己的成员变量,并且也自然地继承了父类中不是,private,的方法作为自己的方法。继承的成员变量以及方法的访问权限保持不变。,例子,6.2,子类的继承性,下面我们看一个,例子,。,程序的运行结果见下图,6.2,子类的继承性,3,子类和父类不在同一包中的继承性,如果子类和父类不在同一个包中,那么子类只能继承父类的,protected,、,public,成员变量和方法,继承的成员或方法的访问权限不变。,6.3,子类对象的构造过程,当用子类的构造方法创建一个子类的对象时,子类的构造方法总是先调用父类的某个构造方法,如果子类的构造方法没有指明使用父类的哪个构造方法,子类就调用父类的不带参数的构造方法。因此,我们可以这样来理解子类创建的对象:,(,1,)将子类中声明的成员变量做为子类对象的成员变量。,(,2,)父类的成员变量也都分配了内存空间,但只将其中一部分(继承的那部分)做为子类对象的成员变量。父类的,private,成员变量尽管分配了内存空间,但它不作为子类的成员变量,6.3,子类对象的构造过程,即父类的私有成员不归子类管理。方法的继承性与成员变量相同。但若子类和父类不在同一包中,尽管父类的友好成员分配了内存空间,但也不作为子类的成员。子类对象内存示意图如下图,子类未继承,的成员,子类未继承的方法,引用,子类对象,子类继承的成员,子类继承的方法,子类声明的成员,子类声明的方法,6.3,子类对象的构造过程,上页示意图中的,“,叉号,”,表示子类中声明定义的方法不可以操作这些内存单元,,“,对号,”,表示子类中声明定义的方法可以操作这些内存单元。通过上图,给我们有感觉好象:子类创建对象时似乎浪费了一些内存,因为当用子类创建对象时,父类的成员变量也都分配了内存空间,但只将其中一部分做为子类对象的成员变量,但实际情况并非如此,,我们需注意到,,子类中还有一部分方法是从父类继承的,这部分方法却可以操作这部分变量。下面的,例子,中,子类对象调用继承的方法操作这些未被子类继承却分配了内存空间的变量。,6.4,成员变量的隐藏和方法的重写,1,成员变量的隐藏,子类可以隐藏继承的成员变量,当在子类中定义和父类中,同名的成员变量,时,子类就隐藏了继承的成员变量,即子类对象以及子类自己声明定义的方法操作与父类同名的成员变量。下面我们看一个,例子,,在这个例子中子类隐藏了从父类继承的,double,型变量。该程序的运行结果如下:,6.4,成员变量的隐藏和方法的重写,2,方法重写,子类也可以隐藏方法,子类通过方法重写来隐藏继承的方法。,方法重写是指:子类中定义一个方法,并且这个方法的名字、返回类型、参数个数和类型与从父类继承的方法完全相同。,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为。这时,,如果子类想使用被隐藏的方法,必须使用关键字,super,,我们将在后面讲述,super,的用法。下面这个,例子,可以帮助我们更好的理解方法的重写。,6.4,成员变量的隐藏和方法的重写,需要注意的是,:,方法重写时一定要保证方法的,名字,、,类型,、,参数个数,和,类型,同父类的某个方法完全相同,只有这样,子类继承的这个方法才被隐藏。如果子类在准备隐藏继承的方法时,参数个数或参数类型与父类的方法不尽相同,那实际上也没有隐藏继承的方法,这时子类就出现两个方法具有相同的名字。下面我们看个,例子,。,程序的运行结果如右图:,6.4,成员变量的隐藏和方法的重写,3,访问修饰符,protected,的进一步说明,一个类,A,中的,protected,成员变量和方法可以被它的直接子类和间接子类继承,比如,B,是,A,的子类,,C,是,B,的子类,,D,又是,C,的子类,那么,B,、,C,和,D,类都继承了,A,的,protected,成员变量和方法。如果用,D,类在,D,本身中创建了一个对象,那么该对象总是可以通过,“,.,”,运算符访问继承的或自己定义的,protected,变量和,protected,方法的,但是,如果在另外一个类中,比如,E,类,用,D,类创建了一个对象,object,,该对象通过,“,.,”,运算符访问,protected,变量和,protected,方法的权限如下列(,a,)、(,b,)所述。,6.4,成员变量的隐藏和方法的重写,(,a,)子类,D,的,protected,成员变量和方法,如果不是从父类继承来的,,object,访问这些,protected,成员变量和方法时,只要,E,类和,D,类在同一个包中就可以了。,(,b,)如果子类,D,的对象的,protected,成员变量或,protected,方法是从父类继承的,那么就要一直追溯到该,protected,成员变量或方法的,“,祖先,”,类,即,A,类,如果,E,类和,A,类在同一个包中,,object,对象能访问继承的,protected,变量和,protected,方法。,电话卡,域:,余额,方法:拨打电话,查询余额,无卡号电话卡,域:,对应电话机型号,方法:,获得电话机型号,有卡号电话卡,域:卡号,密码接 入号码,接通,方法:,登录交换机,继承,继承,电话磁卡,域:,使用地域,方法:,拨打电话,200,卡,域:,附加费,方法:修改密码,拨打电话,IP,卡,域:,失效日期,方法:,拨打电话,电话,IC,卡,域:,方法:,拨打电话,继承,继承,继承,继承,类继承图,6.5 Super,关键字,Super,关键字有两种用法:一种用法,是子类使用,super,调用父类的构造方法,,另一种用法,是子类使用,super,调用被子类隐藏的成员变量和方法。,1,使用,super,调用父类的构造方法,子类不继承父类的构造方法,因此,子类如果想使用父类的构造方法,必须在子类的构造方法中使用并且必须使用关键字,super,来表示,而且,super,必须是子类构造方法中的第一条语句。在下面的,例子,中,子类的构造方法中使用,super,调用父类的构造方法。,6.5 Super,关键字,2,使用,super,操作被隐藏的成员变量和方法,当子类中定义了一个方法,并且这个方法的名字、返回类型、参数个数和类型和父类的某个方法完全相同时,子类从父类继承的这个方法将被隐藏。如果我们在子类中想使用被子类隐藏的成员变量或方法就可以使用关键字,super,。,在下面这个,例子,中,子类使用,super,调用被隐藏的成员变量和方法。其结果如下:,6.6 final,类和,final,方法,final,类不能被继承,即不能有子类,,如:,final class A,将一个类声明为,final,类一般是由于安全性考虑。,一个方法被修饰为,final,方法,则,这个方法不能被重写,,即不允许子类通过重写隐藏继承的,final,方法。,6.7,对象的上转型对象,1,对象的上转型,我们经常说,“,老虎是哺乳动物,”,、,“,狗是哺乳动物,”,等。若哺乳类是老虎类的父类,这样说当然正确,但当你说老虎是哺乳动物时,老虎将失掉老虎独有的属性和功能。下面我们就介绍对象的上转型对象。,假设,,B,是,A,的子类或间接子类,当我们用子类,B,创建一个对象,并把这个对象的引用放到,A,类声明的对象中时,比如:,A a,;,a=new B();,6.7,对象的上转型对象,那么就称对象,a,是子类对象,b,的上转型对象,对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原对象的一些属性和功能。上转型对象具有如下特点(见下图所示)。,对象,对象的上转型对象,继承或隐藏的成员变量,继承或重写的方法,新增的变量,新增的方法,6.7,对象的上转型对象,(,1,)上转型对象不能操作子类声明定义的成员变量;也不能使用子类声明定义的方法。,(,2,)上转型对象可以操作子类继承的成员变量和隐藏的成员变量,也可以使用子类继承的或重写的方法。,(,3,)上转型对象不能操作子类新增的方法和成员变量,(,4,)可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有属性和功能。为了更好的理解对象的上转型,我们先看个,例子,。,6.7,对象的上转型对象,注意,:,不要将父类创建的对象和子类对象的上转型对象混淆,对象的上转型对象的实体是由子类负责创建的,只不过失掉了一些属性和功能而已。,6.8,继承与多态,和继承有关的,多态性是指父类的某个方法被其子类重写时,可以产生自己的功能行为,,即同一个操作被不同类型对象调用时可能产生不同的行为。例如,狗和猫都具有哺乳类的功能:,“,叫声,”,,当狗操作,“,叫声,”,时产生的声音是,“,汪汪,,而猫操作,“,叫声,”,时产生的声音是,“,喵喵,”,,这就是,“,叫声,”,的多态。,当一个类有很多子类时,并且这些子类都重写了父类中的某个方法。当我们把子类创建的对象的引用放到一个父类的对象中时,就得到了该对象的一个上转型对象,那么这个上转型对象在调用这个方法时就可能具有多种形态。,6.8,继承与多态,因为不同的子类在重写父类的方法时可能产生不同的行为。,也就是说,不同对象的上转型对象调用同一方法可能产生不同的行为。,下面让我们看一个,例子,来更好地了解继承与多态和对象的上转型对象。程序的运行结果如下图:,6.9,使用,abstract,类,用关键字,abstract,修饰类称为,abstract,类(抽象类)。如:,abstract class A,abstract,类,不能用,new,运算符创建对象,,必须产生其子类,由子类创建对象。若,abstract,类的类体中有,abstract,方法,只允许声明,而不允许实现,而该类的子类必须实现,abstract,方法,即重写父类的,abstract,方法。一个,abstract,类只关心子类是否具有某种功能,不关心功能的具体实现。具体实现由子类负责。下面我们看一个,例子:,abstract class Shape,abstract float area();,class Rectangle extends Shape,public float width,height;,Rectangle(float w,float h),width=w;/,这里不需,this,height=h;,public float area(),return width*height;,class Circle extends Shape,public float r;,Circle(float r),this.r=r;/this,指,这个对象的,public float area(),return 3.14*r*r;,6.9,使用,abstract,类,Java,不,支持多继承性,,即一个类只能有一个父类。单继承性使得,Java,简单,易于管理程序。为了克服单继承的缺点,,Java,使用了接口,一个类可以实现多个接口。,“接口”是抽象类的概念。,接口中的方法都是没有方法体的抽象方法。,接口中只能定义,public,、,static,、,final,属性。,接口定义的仅仅是实现某一特定功能的一组方法的对外接口和规范,而并没有真正地实现这个功能。,接口的功能实现是在“继承”了这个接口的各个类中完成的,由这些类来具体定义接口中所有抽象方法的方法体。,通常把对接口的“继承”称为“实现”,。,6.10,接口,6.10,接口,使用关键字,interface,来定义一个接口。接口的定义和类的定义很相似,分为接口的声明和接口体。,1,接口的声明与使用,(,1,)接口声明,我们曾使用关键字,class,来声明类,接口通过使用关键字,interface,来声明,格式:,interface,接口的名字,6.10,接口,(,2,)接口体,接口体中包含,常量定义和方法定义,两部分。接口体中只进行方法的声明,不许提供方法的实现,所以,方法的定义没有方法体,且用分号,“,;,”,结尾。,public interface,接口名,extends,父接口名列表,/,常量域声明,public,、,static,、,final,域类型,域名,=,常量值;,/,抽象方法声明,public abstract,返回值类型,方法名,(,参数列表,),;,(,3,)接口的使用,一个类通过使用关键字,implements,声明自己实现一个或多个接口。如果实现多个接口,用逗号隔开接口名,如:,class A implements Printable,,,Addable,6.10,接口,6.10,接口,如果一个类实现某个接口,那么这个类必须实现该接口的所有方法,即为这些方法提供方法体。要注意的是,接口中的方法被默认是,public,和,abstract,的,接口在声明方法时可以省略方法前面的,public,和,abstract,关键字,但是,类在,实现接口方法,时,一定要,用,public,来修饰,。类实现的接口方法以及接口中的常量可以被类的对象调用。,Interface 1,Interface 2,Interface 3,常量,方法,常量和方法,在默认状态下,接口中常量的访问属性总是,public,、,static,和,final,在默认状态下,接口中方法的访问属性总是,public,和,abtract,interface Collection,int,MAX_NUM=100;,void add(Object,obj,);,void delete(Object,obj,);,Object find(Object,obj,);,int,currentCount,();,class,FIFOQueue,implements Collection,void add(Object,obj,),void delete(Object,obj,),Object find(Object,obj,),int,currentCount,(),6.10,接口,如果父类实现了某个接口,则其子类也就自然实现这个接口。接口也可以被继承,即可以通过关键字,extends,声明一个接口是另一个接口的子接口。现在我们看一个,例子,来看一看类是如何实现接口的。,6.10,接口,6.10,接口,2,接口与多态,接口的语法规则很容易记住,但真正理解接口更重要。你可能注意到,在上述例子中如果去掉接口,并把程序中的,a.MAX,、,b.MAX,去掉,上述程序的运行没有任何问题。那为什么要用接口呢?,假如轿车、拖拉机、客车都是机动车的子类,其中机动车是一个抽象类。如果机动车中有,3,个抽象方法:,“,刹车,”,、,“,收取费用,”,、,“,调节温度,”,,那么所有的子类都要实现这,3,个方法,产生各自的收费或控制温度的行为。这显然不符合人们的思维方法,因为拖拉机可能不需要有,“,收取费用,”,或,“,调节温度,”,的功能,合理的处理就是去掉机动车的,“,收取费用,”,和,“,调节温度,”,这两个方法。如果允许多继承,轿车,6.10,接口,类想具有,“,调节温度,”,的功能,轿车类可以是机动车的子类,同时也是另外一个具有,“,调节温度,”,功能类的子类。多继承有可能增加了子类的负担,因为轿车可能从它的多个父类继承了一些并不需要的功能。,Java,支持继承,但不支持多继承,即一个类只能有一个父类。单继承使得程序更加容易维护和健壮,多继承使得编程更加灵活,但却增加了子类的负担,使用不当会引起混乱为了使程序容易维护和健壮,且不失灵活性,,Java,使用了接口,一个类可以实现多个接口,接口可以增加很多类都需要实现的功能,不同的类可以使用相同的接口,同一个类也可以实现多个接口。,6.10,接口,接口的思想在于它可以增加很多类都需要实现的功能,使用相同的接口类不一定有继承关系,就象各式各样的商品,它们可能隶属不同的公司,工商部门要求都必须具有显示商标的功能(实现同一接口),但商标的具体制作由各个公司自己去实现。,用户不能创建接口类型的对象,但可以创建接口类型的变量。,Conversions converter=null;,可以用这种接口类型的变量存储实现,Conversions,接口的任何类对象的引用。也就是说用户可以用这个变量以多态方式调用在,Conversions,接口中说明的方法。,6.11,接口的回调,6.11,接口的回调,在讲述继承与多态时,我们通过子类对象的上转型体现了继承的多态性,即把子类创建的对象的引用放到一个父类的对象中时,得到该对象的一个上转型对象,那么这个上转型对象在调用方法时就可能具有多种形态,不同对象的上转型对象调用同一方法可能产生不同的行为。,1,接口回调,接口回调是多态的另一种体现,接口回调是指:,可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口中的方法,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,,这一过程称作对象功能的接口回调。,6.11,接口的回调,不同的类在使用同一接口时,可能具有不同的功能体现,即接口的方法体不必相同,因此,接口回调可能产生不同的行为。下面我们看看使用了接口的回调技术的,例子,。,2,接口做参数,当一个方法的参数是一个接口类型时,如果一个类实现了该接口,那么,就可以把该类的实例的引用传值给该参数,参数可以回调类实现的接口方法。下面我们再看一个接口做参数的,例子。,结果如下:,6.11,接口的回调,6.12,匿名类,1,和类有关的匿名类,当使用类创建对象时,程序允许我们把类体与对象的创建组合在一起,也就是说,,类创建对象时,除了构造方法还有类体,,,此类体被认为是该类的一个子类去掉类声明后的类体,称作匿名类,。,匿名类就是一个子类,由于无名可用,所以不可能用匿名类声明对象,但却可以直接用匿名类创建一个对象。假设,Hello,是类,那么下列代码就是用,Hello,的一个子类(匿名类)创建对象:,new Hello(),匿名类的类体,匿名类可以继承类的方法也可以重写类的方法。我们使用匿名类时,必然是在某个类中直接用匿名类创建对象,因此匿名类一定是内部类,,匿名类可以访问外嵌类中的成员变量和方法,,,匿名类不可以声明,static,成员变量和,static,方法,。匿名类的主要用途就是向方法的参数传值。,下面的,例子,展示了匿名类的用法。,6.12,匿名类,2,和接口有关的匿名类,假设,Computable,是一个接口,那么,,Java,允许直接用接口名和一个类体创建一个匿名对象,,,此类体被认为是实现了,Computable,接口的类去掉类声明后的类体,称作匿名类,。下列代码就是用实现了,Computable,接口的类(匿名类)创建对象:,new Computable(),实现接口的匿名类的类体,6.12,匿名类,如果某个方法的参数是接口类型,那么我们可以使用接口名和类体组合创建一个匿名对象传递给方法的参数,类体必须要实现接口中的全部方法。,下面的,例子,16,展示了和接口有关的匿名类的用法。,程序的运行结果如下:,6.12,匿名类,6.13,异常类,所谓异常就是程序运行时可能出现一些错误,比如试图打开一个根本不存在的文件等,异常处理将会改变程序的控制流程,让程序有机会对错误作出处理。,当程序运行出现异常时,,Java,运行环境就用异常类,Exception,的相应子类创建一个异常对象,并等待处理。,java,使用,trycatch,语句来处理异常,将可能出现的异常操作放在,trycatch,语句的,try,部分,当,try,部分中的某个语句发生异常后,,try,部分将立刻结束执行,而转向执行相应的,catch,部分;,6.13,异常类,所以程序可以将发生异常后的处理放在,catch,部分。,1,trycatch,语句,trycatch,语句的格式如下:,try,包含可能发生异常的语句,catch(ExceptionSubClass1 e),6.13,异常类,catch(ExceptionSubClass2 e),各个,catch,参数中的异常类都是,Exception,的某个子类,表明,try,部分可能发生的异常,这些子类之间不能有父子关系,否则保留一个含有父类参数的,catch,即可。,下面我们看一个,例子,,在这个例子中,我们试图将一个非数字字符转变成整型数,这时就发生,NumberFormatException,异常。我们把可能出现异常的操作放在,trycatch,语句中,就可实现相应的操作。,6.13,异常类,2,自定义异常类,我们也可以扩展,Exception,类定义自己的异常类,然后规定哪些方法产生这样的异常。一个方法在声明时可以使用,throws,关键字声明抛出所要产生的若干个异常,并在该方法的方法体中具体给出产生异常的操作,即用相应的异常类创建对象,这将导致该方法结束执行并抛出所创建的异常对 象。程序必须在,trycatch,块语句中调用抛出异常的方法。,6.13,异常类,在下面,例子,中,用一个方法求偶正数的平方根,因此我们自己定义了两个异常类,当向该方法传递的参数是奇数时,该方法发生,YourException,异常,当向该方法传递的参数是负数时发生,MyException,。,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服