您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > 第6章 面向对象程序设计2
继承继承,指以原有的类为基础来创建一个新类,从而达到代码复用的目的。利用继承,可以来创建一个具有公共属性的类,然后根据需要创建具有特有属性的新类以适用于不同的情况。如彩色电视与液晶电视的关系。Java语言只支持单继承,被继承的类称为父类,继承而来的类则称为子类。继承是在原有父类基础上添加程序代码建立新类,而这个新类既能够运行自己定义的方法,也可以运行父类中定义的方法,从而复用代码。继承的实现定义继承的形式为:[访问权限]class类名[extends父类]{……}其中,“访问权限”指public、private,“extends”为继承关键字,后面跟父类名。1.子类对父类成员的继承子类继承父类所有的非私有属性的成员变量和成员方法,但不继承父类的构造函数,在子类的构造函数中可以使用super()调用父类的构造函数。举例:设计一个学生类,属性有姓名(name)、年龄(age)、私房钱(money)。由学生类派生出本科生类Undergraduate和研究生类Graduate,本科生类增加属性:专业(specialty),研究生类增加属性:研究方向(studyDirection)。每个类都有相关数据的输出方法。classStudent//学生类{publicStringname;//姓名publicintage;//年龄privateintmoney;//私房钱}classUndergraduateextendsStudent//本科生类{publicStringspecialty;//专业}classGraduateextendsStudent//研究生类{publicStringstudyDirection;//研究方向}classJCTest{publicstaticvoidmain(String[]args){UndergraduatebenKe=newUndergraduate();benKe.name=张三;benKe.age=22;//benKe.money=120;//不能继承benKe.specialty=计算机网络;System.out.println(姓名:+benKe.name+年龄:+benKe.age+专业:+benKe.specialty);GraduateyJS=newGraduate();yJS.name=李四;yJS.age=25;yJS.studyDirection=嵌入式软件开发;System.out.println(姓名:+yJS.name+年龄:+yJS.age+研究方向:+yJS.studyDirection);}}2.构造方法的调用子类可以继承父类的非私有成员变量和方法,但不能继承父类的构造方法,但可调用父类构造方法:(1)子类可以无条件地调用父类不含参数的构造方法;(2)对于父类中包含有参数的构造方法,子类可以通过在自己的构造方法中使用super关键字来引用,而且必须是子类构造方法中的第一条语句。super•super引用。使用关键字super可以引用被子类隐藏的父类的成员变量或或被子类重写的方法,这称为super引用。super引用的语句格式为:super.〈成员变量名〉super.〈方法名〉•特别注意:(1)在子类构造方法中,使用super调用父类构造方法的语句必须为构造方法中的第一个语句。(2)当父类中没有构造方法或只有无参构造方法时,系统会为子类构造方法自动加上super语句,相当于显示在构造方法中调用super()。(3)子类构造方法的第一个语句是使用this关键字来调用本类的另一个构造方法,那么,Java系统就不会默认该子类的构造方法隐含调用父类的构造方法。3、类的成员覆盖•在类的继承中,若子类新增的成员名称与父类成员相同,则称为成员覆盖(overriding)。其目的是修改父类的属性和行为。•若子类声明了与父类同名的变量,则父类的变量被隐藏起来,直接使用的是子类的变量,但父类的变量仍占据空间,可通过super或父类名来访问。•在子类中定义了与父类同名的变量,从而隐藏了父类成员变量,这种隐藏变量可加super前缀来访问。classA{intx=100;}classBextendsA{intx=200;voidprint(){System.out.println(Subclass:+x);System.out.println(Superclass:+super.x);}publicstaticvoidmain(Stringargs[]){(newB()).print();}}程序运行结果:Subclass:200Superclass:100类的成员覆盖方法覆盖Java允许子类对父类的同名方法进行重定义,也就是子类中定义的方法与父类中已定义的方法名称相同,但方法的内容不同,这种多态就称为方法覆盖。举例:父类有骂人的习惯,子类继承父类后,更改父类的方法,不再具有骂人的习惯。继承的实现--方法覆盖classFuLei{publicvoidmaRen(){System.out.println(Goddamnyou!);}}classZiLeiextendsFuLei{publicvoidmaRen(){//System.out.print(我老豆喜欢骂:);//super.maRen();System.out.println(我讲礼貌,我不骂人!);}}7.3.2继承的实现--方法覆盖classFuGaiTest{publicstaticvoidmain(String[]args){ZiLeizl=newZiLei();zl.maRen();}}继承的实现—终止覆盖有时出于安全考虑,需要防止黑客用属于系统重要信息的类来创建其子类,在子类中覆盖原有的类的方法。为保证父类方法不会被子类中定义的方法替代,就要在方法之前使用“final”关键字来修饰该方法。举例:级上例添加一个final方法,演示终止覆盖。•在进行覆盖时,应该注意以下三点:•子类不能覆盖父类中声明为final或static的方法;•子类必须覆盖父类中声明为abstract的方法,或者子类也声明为abstract;•子类覆盖父类中同名方法时,子类方法声明必须与父类被覆盖方法的声明一样。覆盖和重载的区别•覆盖和重载的区别•(1)方法的覆盖是子类和父类间的关系,而方法的重载是同一类内部多个方法间的关系。•(2)方法的覆盖一般是两个方法间的,而重载时可能有多个重载方法。•(3)覆盖的方法有相同的方法名和形参表,而重载的方法只能由相同的方法名,不能有相同的形参表。多态性1抽象类•类中允许定义抽象方法。所谓抽象方法是指只有方法的定义,没有方法的实现体的方法。用关键字abstract来声明抽象方法。例如:abstractvoidrun()•包含抽象方法的类称为抽象类。换句话说,任何包含抽象方法的类必须被声明为抽象类。例如:abstractclassRunner需要说明的是:构造方法不能被声明为抽象的abstract和static不能同时存在,即不能有abstractstatic方法•抽象类不能直接用来定义对象。抽象类主要用于定义为若干个功能类同的类的父类•抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是抽象类abstractclassA{intx;inty;abstractintaa(intx,inty);voidA(){x=0;y=0;}}classBextendsA{intaa(intx,inty){returnx+y;}}2最终类•最终类是指不能被继承的类,即不能再用最终类派生子类。如果不希望某个类被继承,可以声明这个类为最终类。最终类用关键字final来说明。例如:publicfinalclassC•如果创建最终类似乎不必要,而又想保护类中的一些方法不被覆盖,可以用关键字final来指明那些不能被子类覆盖的方法,这些方法称为最终方法。例如:publicclassA{publicfinalvoidM();}1)final标记的类不能被继承finalclassPerson{…}classStudentextendsPerson//非法{…}Student类不能在继承Person类2)final标记的方法不能被子类重写classPerson{publicStringname;publicintage;finalpublicvoidgetInfo(){}}classStudentextendsPerson{publicStringname;publicintage;publicvoidgetInfo()//非法{}publicvoidstudy(){}}3)final标记的变量final标记的变量(成员变量和局部变量)即成为常量,只能赋值一次,赋值的位置:(a)初始化位置(b)构造方法中classPerson{publicfinalStringx=abc;publicStringname;publicintage;publicPerson(){x=abc;}publicPerson(Stringname,intage){x=abc;}…}要在每一个构造方法中做相同的工作。接口•Java语言只支持单继承机制,不支持多继承。一般情况下,单继承就可以解决大部分子类对父类的继承问题。但是,当问题复杂时,若只使用单继承,可能会给设计带来许多麻烦。Java语言解决这个问题的方法是使用接口•接口和抽象类非常相似,都是只定义了类中的方法,没有给出方法的实现•Java语言不仅规定一个子类只能直接继承自一个父类,同时允许一个子类可以实现多个接口。由于接口和抽象类的功能类同,因此,Java语言的多继承机制是借助于接口来实现的•接口是抽象方法和常量值定义的集合,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法两种定义,而没有变量和方法的实现。1)定义接口•接口的定义格式为:[public]interface接口名[extends父接口名列表]{//接口体//常量域声明[public][static][final]域类型域名=常量值;……//抽象方法声明[public][abstract]返回值方法名(参数列表);……}•/*abstractclassA•{•publicstaticfinalintID=1•abstractintaa(intx,inty);•abstractvoidbb();•}*/•interfaceA•{•intID=1;•intaa(intx,inty);•voidbb();•}1.接口中的成员都是public访问类型,接口中的常量默认是用publicstaticfinal标识的。2.接口中不能定义静态方法3.可以定义一个新的接口用extends去继承一个已有的接口。可以定义一个类用implements去实现一个接口中的所有方法,也可以定义一个抽象类用implemen去实现一个接口中定义的部分方法。4.一个类可以继承一个父类的同时,实现一个或多个接口,extends必须位于implements之前访问接口中的常量,可以用–接口名.常量–实现接口的类名.常量–实现接口的类对象.常量•1.接口与抽象类的区别:•①接口不能包含任何可以执行的方法,而抽象类可以。•②类可以实现多个接口,但只有一个父类。•2.一个类要实现接口时,请注意以下问题:•①在类的声明部分,用implements关键字声明该类将要实现哪些接口。•②如果实现某接口的类不是abstract抽象类,则在类的定义部分必须实现指定接口的所有抽象方法。•③如果实现某接口的的类是abstract的抽象类,则它可以不实现该接口所有的方法。但是对于这个抽象类任何一个非抽象的子类而言,它们父类所实现的接口中的所有抽象方法都必须有实在的方法体。。•④—个类在实现某接口的抽象方法时,必须使用完全相同方法头。如果所实现的方法与抽象方法有相同的方法名和不同的参数列表,则只是在重载一个新的方法,而不是实现已有的抽象方法。•⑤接口的抽象方法的访问限制符都已制定为pu
本文标题:第6章 面向对象程序设计2
链接地址:https://www.777doc.com/doc-3819039 .html