Java讲义与实例 第三章 继承和多态.ppt_第1页
Java讲义与实例 第三章 继承和多态.ppt_第2页
Java讲义与实例 第三章 继承和多态.ppt_第3页
Java讲义与实例 第三章 继承和多态.ppt_第4页
Java讲义与实例 第三章 继承和多态.ppt_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、第三章 继承和多态,本章要点,一、继承和多态的概念 二、类成员的继承 2.1 属性与方法的继承 2.2 this 和super 的使用 2.3 构造函数的继承和重载 2.4 最终类和最终类成员 2.5 对象在继承关系中的改变 2.6 抽象类在继承中的特点,一、继承和多态的概念,1、 继承的概念: 通过必要的说明能够实现某个类无需重新定义就拥有另一个类的某些属性和方法,并把这种关系称为继承,先定义的类成为父类,后定义的类称为子类,并且允许多层的继承关系 Java中的类是以类的层次来存在的。Java中的类可用extends关键字来声明为另一个类的子类(subclass).子类从父类(supercl

2、ass)那里继承(inherit)变量和方法,然后可像在子类中声明的一样来使用这些变量和方法.,车辆,机动车,非机动车,内燃机车,电车,人力车,蓄力车,柴油机车,汽油机车,马车,手推车,自行车,继承的定义,public class Vehicle String color=“white”; protected float speed; public void accelerate() . ,public class Automobile extends Vehicle float fuelConsumption; public void decelerate() . ,public class

3、 Car extends Automobile private int price; public void decelerate() speed =speed-20.f; ,注: 继承能够使子类拥有父类的非私有属性和方法,而不需要在子类的类定义时重新定义父类的这些属性和方法,子类即可以保持父类原有的属性和方法,也可以对从父类那里继承而来的属性和方法进行修改,在定义了继承关系后,我们改动父类的一个属性或方法时,子类也会自动改变,但是这些属性和方法必须是非私有,并且没有被子类重新定义的,多态的概念,多态是指在一棵继承树中的类可以有多个同名但不同方法体以及不同形参的方法。 两种情况: 覆盖:在子类

4、中直接定义和父类同样的属性和方法,但重新编写了方法体,即子类与父类方法的星参与返回值都相同,而内部处理不同,这种方法在使用过程中,Java虚拟机会根据调用这个方法的类来确定哪个方法被调用 重载:同一个类定义中有多个同名的方法,但有不同的形参,而且每个方法有不同的方法体,调用时根据形参的个数和类型来决定调用的是哪个方法 注:不能根据返回值的类型来区分重载的方法,二、 类成员的继承,类成员:属性、方法、构造函数,属性的继承,属性的继承:子类不需要再定义就拥有了父类已有的非私有属性 注:继承了属性,表示子类被创建时另开辟了新的空间来存储从父类继承而来的属性,其初值应该是父类中该属性的初值,但之后,双

5、方的相同属性就是彼此相互独立的变量了。只有当父类的该属性的定义发生了变化,子类中的该属性定义也跟着发生变化 属性的覆盖:子类可以重新定义父类的非私有属性,这样,子类定义了一个与父类同名的属性,并且子类也继承了父类的该属性,在使用时通过调用该属性的变量或者方法来决定使用哪一个。,public class Father int a=100; public void miner() a-; public static void main(String arg) Father x=new Father(); Son y=new Son(); System.out.println(a of son is

6、 : +y.a); System.out.println(a of sons super is : +y.getA(); y.miner(); System.out.println(a of son is :+y.a); System.out.println(a of sons super is : +y.getA(); ,class Son extends Father int a=0; public int getA() return super.a; ,方法的继承,方法的继承:子类不需要重新定义就可以拥有父类的非私有方法 方法的覆盖:子类定义一个和父类同名而且同形参表的方法,如果子类中需

7、要用父类的被覆盖的方法,可使用关键字super来实现 方法的重载:,方法的覆盖与重载的区别,方法的覆盖是子类和父类之间的关系,而重载是同一类内部多个方法间的关系 方法的覆盖一般是两个方法间的,而重载时可能有多个重载方法 覆盖的方法有相同的方法名和形参表,而重载的方法只能有相同的方法名,不能有相同的形参表 覆盖时区分方法的是根据调用他的对象,而重载是根据形参来决定调用的是哪个方法 用final修饰的方法是不能被子类覆盖的,只能被重载,public class Detergent extends Cleanserpublic void scrub()append(Detergent.scrub()

8、; super.scrub(); public void foam()append(foam();public static void main(String arg)Detergent x=new Detergent();System.out.println(Subclass has :);x.dilute();x.scrub();x.foam();x.print();System.out.println(Super class has:); Cleanser.main(arg);,class Cleanser private String s=new String(Cleaner); pu

9、blic void append(String a)s=s+ +a ; public void dilute()append(dilute(); public void apply()append(apply(); public void scrub()append(scrub(); public void print() System.out.println(s); public static void main(String args) Cleanser x=new Cleanser(); x.dilute(); x.apply(); x.scrub(); x.print(); ,特殊引用

10、:this和super this this用来引用当前对象中的变量和方法.有些时候可以省略. super super用来引用父类中的方法和变量,主要是被覆盖了的变量或者方法.不可省略.,演示this和super的使用,public class InheritDemo3 extends SuperClass float a =4f; public void print() int a =5; super.print(); System.out.println(InheritDemo2); System.out.println(a); System.out.println(this.a); Sys

11、tem.out.println(super.a); public static void main(String args) InheritDemo3 id3 = new InheritDemo3(); id3.print(); ,/InheritDemo3.java /演示this和super关键字的使用 class SuperClass int a=3; public void print() System.out.println(SuperClass); ,运行结果: SuperClass InheritDemo3 5 4.0 3,public class Testthis privat

12、e int i=0; Testthis increment() i+; return this; void print() System.out.println(i=+i); public static void main (String args) Testthis x=new Testthis(); x.increment().increment().increment().print(); ,构造函数的继承和重载,构造函数的重载: 目的:以不同的方法对类进行初始化 注:构造函数间可以互相调用,调用其他构造函数时,必须用this 代替函数名,这时的this并不代表地址,只是用来表示构造函数

13、的名称。,public class Testthis2 Testthis2() this(5,7f); Testthis2(float f) System.out.println(f=+f); Testthis2(int i,float f) this(f); System.out.println(i=+i); System.out.println(i+f=+(i+f); public static void main(String ar) Testthis2 this2=new Testthis2(); ,构造函数的继承: 子类只继承父类的默认构造函数,既无形参构造函数,并且在创建对象时先调

14、用这个构造函数对对象进行初始化,然后再调用子类自己定义的构造函数,如果父类没有默认构造函数,那子类将不能从父类继承到任何构造函数,如果父类没有定义默认构造函数,那么子类也不能定义自己的无参数构造函数。如果子类想调用父类的非默认构造函数,必须用super 来实现。子类的构造函数的形参表只能使用父类构造函数中用过的形参表,或者是对他的扩展,class student int a; int b; student (int x,int y) a=x; b=y; public class student1 extends student int c; student1(int m,int n,int z

15、) super(m,n); c=a+b+z; public static void main (String arg) student1 s1=new student1(3,4,5); System.out.println(s1.c); ,最终类和最终成员(final),最终类:用final修饰的类不能再有子类 最终方法:用final 修饰的方法是不能被该类的子类所重载的方法 最终属性:常量,对象在继承关系中改变,Java语法规定: 子类实例可以被当作父类的一个对象使用,而父类实例不能被当作子类的一个对象使用 如果一个被父类对象通过赋值指向的地址是子类对象所在的地址,按照前一条准则,这个对象仍

16、然是父类的对象,但它可以通过强制类型转换成子类对象,这种转换只能用在对象间赋值时,不能单独使用强制转换,class SuperClassprivate int x=100;public int getx()return x;,class Subbie extends SuperClass private int y=200; public int gety() return y; ,public class ObjectConvert public static void main(String arg) SuperClass superA=new SuperClass(),superB; Subbie subA=new Subbie(),subB; (new ObjectConvert().useSubAsSuper(subA); superB=subA; System.out.println(superA.getx():+superB.getx(); subB=(Subbie)superB; System.out.println(subB.getx()+ +subB.gety(); public void useSubAsSuper(SuperCl

温馨提示

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

评论

0/150

提交评论