您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > 04-2 继承与多态
继承、重写与多态2010-022回顾String类的使用字符串比较﹑操作StringBuffer/StringBuilder类StringBuffer/StringBuilder类的相关方法2010-023目标理解继承的相关概念掌握继承的实现this与super关键字的区别了解、使用多态特性Object对象2010-024继承理解继承是理解面向对象程序设计的关键继承是一种特性,利用继承可以重用现有类生成新类,也是代码重用的一种体现在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类)Java继承的特点:单继承,只有一个直接父类继承可以持续进行,形成复杂的继承层级结构若类B继承类A时,我们称被继承的类A为基类、父类或超类,而称继承类B为A的派生类或子类动物昆虫哺乳动物爬行动物人类非人类2010-025继承的作用继承的作用:继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。提供软件复用功能。通过增强一致性来减少模块间的接口和界面,大大增加程序的易维护性。2010-026继承packagecom.fit.demo;publicclassEmployee{privateStringempId;……publicvoidworking(){System.out.println(working);}}……packagecom.fit.demo;publicclassSaleManextendsEmployee{publicvoidsaleProduct(){System.out.println(saletheproduct);}}如果一个类的声明中没有使用关键字extends,那么这个类被系统默认为是继承了Object父类。2010-027属性、方法的继承父类中的public成员将被子类继承、直接使用;父类中的private成员将被隐藏,在子类中无法访问;父类中的默认访问控制成员可以被在同一个包中的子类继承、访问,而对在不同包中的子类隐藏受保护的成员(protected修饰符),如果希望子类能直接使用父类的某些成员方法或属性,可以将父类中的成员标注为受保护的:protected注:子类的成员方法可以直接访问到父类的protected成员,不论子类和父类是否在同一个包中2010-028继承下的重写什么叫重写:方法重写是指,子类中定义了一个方法,并且这个方法的名字、返回类型、参数类型及参数的个数与从父类继承的方法完全相同。重写目的及作用子类可以通过方法重写来隐藏继承父类的方法,又称为“覆盖”。通过方法重写,子类可以把父类的状态和行为变成自己的状态和行为。只要父类的方法能够被子类继承,子类就能重写这个方法。一旦子类重写了这个方法,就表示隐藏了所继承的这个方法。如果通过子类对象调用这个方法,那也是调用重写后的方法。2010-029继承下的重写packagecom.fit.demo;publicclassEmployee{privateStringempId;……publicvoidworking(){System.out.println(working);}}……publicclassSaleManextendsEmployee{@Overridepublicvoidworking(){System.out.println(saletheproduct);}}2010-0210继承下的重写在这个程序中,类SaleMan继承类Employee后,重写了父类的working()方法。从输出结果我们可以看到父类(Employee)的working()方法中的语句并没有打印出来。实际上有些方法在父类中无法确切的定义,例如职员都需要进行日常工作,但不同岗位的职员的工作内容不尽相同,工作步骤各异,这时就需要在职员的各个子类中重写working()方法以适应不同的情况。重写的方法既可以操作继承的成员变量,也可以操作子类声明定义的成员变量。如果在子类中希望被隐藏的父类方法,必须使用关键字super,这就引出了我们下一个课题——super关键字。2010-0211super关键字子类使用super关键字可以调用父类的构造方法,也可以调用被子类隐藏的成员变量和方法。子类不继承父类的构造方法,如果子类想调用父类的构造方法,可以使用super关键字来实现。但是super语句必须是子类构造方法中的第一条语句。子类在创建对象时,子类的构造方法总是调用父类的某个构造方法。如果父类有多个构造方法,那么子类默认调用的是那个不带参数的构造方法。如果父类只有一个带参的构造方法,那么子类必须在自己的构造方法中用super语句来调用父类的带参的构造方法,否则程序会报错。如果子类的构造方法中没有写super语句,那么系统将默认有“super();”存在,即调用父类的不带参的构造方法。2010-0212super调用父类构造方法packagecom.fit.demo;publicclassEmployee{privateStringempId;privateStringempName;privatefloatsalary;publicEmployee(){System.out.println(“无参构造方法);}publicEmployee(StringempId,StringempName,floatsalary){this.empId=empId;this.empName=empName;this.salary=salary;}……}2010-0213super调用父类构造方法packagecom.fit.demo;publicclassSaleManextendsEmployee{publicSaleMan(){super();}@Overridepublicvoidworking(){System.out.println(saletheproduct);}}调用父类构造函数2010-0214继承示例publicclassEmployee{privateStringempId;privateStringempName;privatefloatsalary;publicEmployee(StringempId,StringempName,floatsalary){this.empId=empId;this.empName=empName;this.salary=salary;}//属性的getter/setter方法……}2010-0215继承示例publicclassSalesmanextendsEmployee{privatelongsales;privatefloatrate;publicSalesman(StringempId,StringempName,floatsalary){super(empId,empName,salary);}publicSalesman(StringempId,StringempName,floatsalary,floatrate){super(empId,empName,salary);this.rate=rate;}//sales、rate属性的setter/getter方法……}2010-0216继承示例publicclassManagerextendsEmployee{privatefloatbonus;publicManager(StringempId,StringempName,floatsalary){super(empId,empName,salary);}publicManager(StringempId,StringempName,floatsalary,floatbonus){super(empId,empName,salary);this.bonus=bonus;}//bonus属性的getter/setter方法……}2010-0217this与superthis的使用场合用来访问当前对象的数据成员,其使用形式如下:this.数据成员用来访问当前对象的成员方法,其使用形式如下:this.成员方法(参数)当有重载的构造方法时,用来引用同类的其他构造方法,其使用形式如下this(参数)super的使用场合用来访问直接父类隐藏的数据成员,其使用形式如下:super.数据成员用来调用直接父类中被覆盖的成员方法,其使用形式如下:super.成员方法(参数)用来调用直接父类的构造方法,其使用形式如下:super(参数)2010-0218向上转型向上转型--父类的引用变量可以指向子类的对象如:Employeeemp=newSalesman(…);注意:引用变量emp由于是按照Employee类型声明的,因此只能调用父类的成员方法或公共属性,Salesman类型特有的方法和属性则不能使用子类的引用变量不能指向父类的对象2010-0219多态重载------发生在同一个类中多态覆盖------发生在子类中2010-0220多态多态性是指允许不同类的对象对同一消息做出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序方法同名问题。与继承有关的多态性是指父类的某个方法被其子类重写时,可以各自产生自己的功能行为,指同一个操作被不同类型对象调用时产生不同的行为。我们也可以这样来概括多态性:当我们将子类对象的引用传给声明为父类的一个对象变量,如果子类重写过这个方法就调用子类的方法版本,如果没有重写就调用父类的这个方法。2010-0221instanceofinstanceof是一个二元运算符,用于测试某个对象是否是一个类(或其子类)的实例,返回一个布尔值。……publicclassInstanceofTest{publicstaticvoidmain(){Employees=newSalesman();Employeem=newManageer();if(pinstanceofPerson){System.out.print(“是它的对象”);}if(tinstanceofPerson){System.out.print(“是它的对象”);}}}2010-0222多态的应用之Object类Object类是所有类的超类,也就是说,Java中的每一个类都是由Object类扩展而来的。因而每当你创建一个对象,它都将拥有Object类中的全部方法。下面我们来了解Object类的方法以及方法的用途,如下表所示:2010-0223Object类的方法及其用途方法用途Obiectclone()创建与该对象的类相同的新对象。booleanequals(Object)比较两对象是否相等。voidfinalize()当垃圾回收器确定不存在对该对象的引用时,垃圾回收器在对该对象执行垃圾回收前调用该方法。classgetClass()返回一个对象的运行时类型信息。inthashCode()返回该对象的散列码值。voidnotify()激活等待在该对象的监视器上的一个线程。voidnotifyAll()激活等待在该对象的监视器上的全部线程。StringtoString()返回该对象的字符串表示。voidwait()等待这个对象另一个更改线程的通知。voidwait(long)等待这个对象另一个更改线程的通知。voidwait(long,int)等待这个对象另一个更改线程的通知。2010-0224equals方法Object类所提供的只是一些基本的方法,我们在编写自己的类时经常需要覆盖这些方法,一方面是加强功能,另一方面也是为了适应当前的情况。Object类中的equals方法用来判断两个对象是否相等,这个方法需要在子类中根据不同的情况各自实现(重写)。最常见的就是用它来比较两个字符串是否相等。标准的java类库中有
本文标题:04-2 继承与多态
链接地址:https://www.777doc.com/doc-3539769 .html