《《继承和多态》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《继承和多态》PPT课件.ppt(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第三章第三章 继承和多态继承和多态本章要点本章要点一、继承和多态的概念一、继承和多态的概念二、类成员的继承二、类成员的继承 2.1 属性与方法的继承属性与方法的继承 2.2 this 和和super 的使用的使用 2.3 构造函数的继承和重载构造函数的继承和重载 2.4 最终类和最终类成员最终类和最终类成员 2.5 对象在继承关系中的改变对象在继承关系中的改变 2.6 抽象类在继承中的特点抽象类在继承中的特点 一、继承和多态的概念一、继承和多态的概念1、继承的概念:继承的概念:通过必要的说明能够实现某个类无需重新定义就拥有另通过必要的说明能够实现某个类无需重新定义就拥有另一个类的某些属性和方法
2、,并把这种关系称为继承,先一个类的某些属性和方法,并把这种关系称为继承,先定义的类成为父类,后定义的类称为子类,并且允许多定义的类成为父类,后定义的类称为子类,并且允许多层的继承关系层的继承关系 Java中的类是以类的层次来存在的。中的类是以类的层次来存在的。Java中的类可用中的类可用extends关键字来声明为另一个类的子类(关键字来声明为另一个类的子类(subclass).子子类从父类类从父类(superclass)那里继承那里继承(inherit)变量和方法变量和方法,然后可像在子类中声明的一样来使用这些变量和方法然后可像在子类中声明的一样来使用这些变量和方法.车辆车辆机动车机动车非机
3、动车非机动车内燃机车内燃机车电车电车人力车人力车蓄力车蓄力车柴油机车柴油机车汽油机车汽油机车马车马车手推车手推车自行车自行车继承的定义继承的定义public class Vehicle String color=“white”;protected float speed;public void accelerate().public class Automobile extends Vehicle float fuelConsumption;public void decelerate().public class Car extends Automobile private int pric
4、e;public void decelerate()speed=speed-20.f;注:注:继承能够使子类拥有父类的非私有属性和方法,而不需继承能够使子类拥有父类的非私有属性和方法,而不需要在子类的类定义时重新定义父类的这些属性和方法,要在子类的类定义时重新定义父类的这些属性和方法,子类即可以保持父类原有的属性和方法,也可以对从子类即可以保持父类原有的属性和方法,也可以对从父类那里继承而来的属性和方法进行修改,在定义了父类那里继承而来的属性和方法进行修改,在定义了继承关系后,我们改动父类的一个属性或方法时,子继承关系后,我们改动父类的一个属性或方法时,子类也会自动改变,但是这些属性和方法必须
5、是非私有,类也会自动改变,但是这些属性和方法必须是非私有,并且没有被子类重新定义的并且没有被子类重新定义的多态的概念多态的概念多态是指在一棵继承树中的类可以有多个同名但不同方法体多态是指在一棵继承树中的类可以有多个同名但不同方法体以及不同形参的方法。以及不同形参的方法。两种情况:两种情况:覆盖:在子类中直接定义和父类同样的属性和方法,但重覆盖:在子类中直接定义和父类同样的属性和方法,但重新编写了方法体,即子类与父类方法的星参与返回值都相新编写了方法体,即子类与父类方法的星参与返回值都相同,而内部处理不同,这种方法在使用过程中,同,而内部处理不同,这种方法在使用过程中,Java虚拟虚拟机会根据调
6、用这个方法的类来确定哪个方法被调用机会根据调用这个方法的类来确定哪个方法被调用重载:同一个类定义中有多个同名的方法,但有不同的形重载:同一个类定义中有多个同名的方法,但有不同的形参,而且每个方法有不同的方法体,调用时根据形参的个参,而且每个方法有不同的方法体,调用时根据形参的个数和类型来决定调用的是哪个方法数和类型来决定调用的是哪个方法 注:不能根据返回值的类型来区分重载的方法注:不能根据返回值的类型来区分重载的方法二、二、类成员的继承类成员的继承类成员:属性、方法、构造函数类成员:属性、方法、构造函数属性的继承属性的继承属性的继承:子类不需要再定义就拥有了父类已有的非属性的继承:子类不需要再
7、定义就拥有了父类已有的非私有属性私有属性注注:继承了属性,表示子类被创建时另开辟了新的空间来继承了属性,表示子类被创建时另开辟了新的空间来存储从父类继承而来的属性,其初值应该是父类中该存储从父类继承而来的属性,其初值应该是父类中该属性的初值,但之后,双方的相同属性就是彼此相互属性的初值,但之后,双方的相同属性就是彼此相互独立的变量了。只有当父类的该属性的定义发生了变独立的变量了。只有当父类的该属性的定义发生了变化,子类中的该属性定义也跟着发生变化化,子类中的该属性定义也跟着发生变化属性的覆盖:子类可以重新定义父类的非私有属性,这属性的覆盖:子类可以重新定义父类的非私有属性,这样,子类定义了一个
8、与父类同名的属性,并且子类也样,子类定义了一个与父类同名的属性,并且子类也继承了父类的该属性,在使用时通过调用该属性的变继承了父类的该属性,在使用时通过调用该属性的变量或者方法来决定使用哪一个。量或者方法来决定使用哪一个。public class Fatherint 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:+y.a);System.out.println(a of sons
9、 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;方法的继承方法的继承方法的继承:子类不需要重新定义就可以拥有父类的非方法的继承:子类不需要重新定义就可以拥有父类的非私有方法私有方法 方法的覆盖:子类定义一个和父类同名而且同形参方法的覆盖:子类定义一个和父类同名而且同形参表的方法,如果子类
10、中需要用父类的被覆盖的方法,表的方法,如果子类中需要用父类的被覆盖的方法,可使用关键字可使用关键字super来实现来实现 方法的重载:方法的重载:方法的覆盖与重载的区别方法的覆盖与重载的区别方法的覆盖是子类和父类之间的关系,而重载是同一类方法的覆盖是子类和父类之间的关系,而重载是同一类内部多个方法间的关系内部多个方法间的关系方法的覆盖一般是两个方法间的,而重载时可能有多个方法的覆盖一般是两个方法间的,而重载时可能有多个重载方法重载方法覆盖的方法有相同的方法名和形参表,而重载的方法只覆盖的方法有相同的方法名和形参表,而重载的方法只能有相同的方法名,不能有相同的形参表能有相同的方法名,不能有相同的
11、形参表覆盖时区分方法的是根据调用他的对象,而重载是根据覆盖时区分方法的是根据调用他的对象,而重载是根据形参来决定调用的是哪个方法形参来决定调用的是哪个方法用用final修饰的方法是不能被子类覆盖的,只能被重载修饰的方法是不能被子类覆盖的,只能被重载public class Detergent extends Cleanserpublic void scrub()append(Detergent.scrub();super.scrub();public void foam()append(foam();public static void main(String arg)Detergent x=
12、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 Cleanserprivate String s=new String(Cleaner);public void append(String a)s=s+a;public void dilute()append(dilute();public void apply()append(apply()
13、;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();特殊引用特殊引用:this和和superthis this用来引用当前对象中的变量和方法用来引用当前对象中的变量和方法.有些时有些时候可以省略候可以省略.super super用来引用父类中的方法和变量,主要是用来引用父类中的方法和变量,主要
14、是被覆盖了的变量或者方法被覆盖了的变量或者方法.不可省略不可省略.演示演示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);System.out.println(super.a);public static void main(String args)Inh
15、eritDemo3 id3=new InheritDemo3();id3.print();/演示演示this和和super关键字的使用关键字的使用class SuperClass int a=3;public void print()System.out.println(SuperClass);运行结果运行结果:SuperClassInheritDemo353public class Testthisprivate int i=0;Testthis increment()i+;return this;void print()System.out.println(i=+i);public sta
16、tic void main(String args)Testthis x=new Testthis();x.increment().increment().increment().print();构造函数的继承和重载构造函数的继承和重载构造函数的重载:构造函数的重载:目的:以不同的方法对类进行初始化目的:以不同的方法对类进行初始化注:构造函数间可以互相调用,调用其他构造函数时,注:构造函数间可以互相调用,调用其他构造函数时,必须用必须用this 代替函数名,这时的代替函数名,这时的this并不代表地址,只并不代表地址,只是用来表示构造函数的名称。是用来表示构造函数的名称。public clas
17、s 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();构造函数的继承:构造函数的继承:子类只继承父类的默认构造函数,既无形参构造函数,子类只继承父类的默认构造函数,既无形参构造函数,并且在创建对
18、象时先调用这个构造函数对对象进行初并且在创建对象时先调用这个构造函数对对象进行初始化,然后再调用子类自己定义的构造函数,如果父始化,然后再调用子类自己定义的构造函数,如果父类没有默认构造函数,那子类将不能从父类继承到任类没有默认构造函数,那子类将不能从父类继承到任何构造函数,如果父类没有定义默认构造函数,那么何构造函数,如果父类没有定义默认构造函数,那么子类也不能定义自己的无参数构造函数。如果子类想子类也不能定义自己的无参数构造函数。如果子类想调用父类的非默认构造函数,必须用调用父类的非默认构造函数,必须用super 来实现。子来实现。子类的构造函数的形参表只能使用父类构造函数中用过类的构造函
19、数的形参表只能使用父类构造函数中用过的形参表,或者是对他的扩展的形参表,或者是对他的扩展 class studentint a;int b;student(int x,int y)a=x;b=y;public class student1 extends studentint c;student1(int m,int n,int z)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);最终类和最终成员(最终类和最终成员(fin
20、al)最终类:用最终类:用final修饰的类不能再有子类修饰的类不能再有子类最终方法:用最终方法:用final 修饰的方法是不能被该类的子类所重修饰的方法是不能被该类的子类所重载的方法载的方法最终属性:常量最终属性:常量对象在继承关系中改变对象在继承关系中改变Java语法规定:语法规定:子类实例可以被当作父类的一个对象使用,而父类子类实例可以被当作父类的一个对象使用,而父类实例不能被当作子类的一个对象使用实例不能被当作子类的一个对象使用 如果一个被父类对象通过赋值指向的地址是子类对如果一个被父类对象通过赋值指向的地址是子类对象所在的地址,按照前一条准则,这个对象仍然是父象所在的地址,按照前一条
21、准则,这个对象仍然是父类的对象,但它可以通过强制类型转换成子类对象,类的对象,但它可以通过强制类型转换成子类对象,这种转换只能用在对象间赋值时,不能单独使用强制这种转换只能用在对象间赋值时,不能单独使用强制转换转换class SuperClassprivate int x=100;public int getx()return x;class Subbie extends SuperClassprivate int y=200;public int gety()return y;public class ObjectConvert public static void main(String
22、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(SuperClass x)System.out.println(x.
23、getx()+!);抽象类及在继承中的特点抽象类及在继承中的特点抽象类:不能被实例化的类(以抽象类:不能被实例化的类(以 abstract 修饰)修饰)特点:特点:抽象类的属性和方法都是他的子类的公共属性和方法的抽象类的属性和方法都是他的子类的公共属性和方法的集合集合改变它的属性和方法一定会改变它所有子类的该属性和改变它的属性和方法一定会改变它所有子类的该属性和方法方法以以 abstract 修饰的方法称为抽象方法,所有的抽象方法修饰的方法称为抽象方法,所有的抽象方法都必须在抽象类中都必须在抽象类中抽象类中既存在抽象方法,也存在一般方法抽象类中既存在抽象方法,也存在一般方法对于父类中的抽象方法是通过覆盖的形式来实现继承的,对于父类中的抽象方法是通过覆盖的形式来实现继承的,子类必须实现父类的所有抽象方法,否则必须仍然定义子类必须实现父类的所有抽象方法,否则必须仍然定义为抽象类为抽象类继承不涉及构造函数的继承继承不涉及构造函数的继承