收藏 分销(赏)

节继承和多态.pptx

上传人:a199****6536 文档编号:7323206 上传时间:2024-12-30 格式:PPTX 页数:74 大小:210.04KB 下载积分:16 金币
下载 相关 举报
节继承和多态.pptx_第1页
第1页 / 共74页
节继承和多态.pptx_第2页
第2页 / 共74页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#,面向对象的程序设计,对外经济贸易大学 雷擎,第,4,章,继承和多态,雷擎,qleii,对外经济贸易大学信息学院,content,4.1,什么是继承,4.2,抽象类与抽象方法,4.3,接口,4.4,多态性,实验:,继承与多态,4.1,什么是继承,由已有的类创建新类,是面向对象程序设计的基石之一,新类拥有 所继承的已有类的功能,子类是父类的特殊化,继承机制可以提高程序的抽象程度,提高代码的可重用性,继承的概念,基类,(base class),也称超类,(superclass),是已有的类,被直接或间接继承,派生类,(derived-class),也称子类,(subclass),是新类,继承已有类后得到的类,继承的概念,继承的概念,父类(超类、基类):描述具有某些共同个性的类。,子类(派生类):在父类的基础上,对其中某一部分对象的特殊共性进一步描述,则得到此父类的子类(派生类)。,子类的对象拥有其父类全部或部分属性与方法的定义过程,称为子类对父类的继承。,is_a,关系,子类对象与父类对象的关系,存在,“,IS A,”,(,或,“,is kind of,”,),的关系,undergraduate,student,is kind of,继承的特点,类的继承允许多层的继承关系,也就是子类可以有它自己的子类。,Java,所有的类都直接或间接继承于,Object,类,所有类类型都可以当做,Object,类型使用。,Java,的继承层次是无限的。,4.1,什么是继承,4.1.1,继承的语法,4.1.2,成员的继承,4.1.3,覆盖和隐藏,4.1.4 this,和,super,的用法,4.1.5 final,的意义,4.1.1,继承的语法,public,class,子类名,extends,父类名,/,子类自身,构造方法的定义,/,子类自身成员属性的定义,/,子类自身成员方法的定义,.,Java,只能做单继承,例:继承的语法,class Person,private String id;private String name=,宝宝,;,private boolean gender;,private Date birthday;/private final Date birthday;,public Person(),/have to set value to birthday,/if delete this constructor,subclass have problems.,public Person(String id,String name),this.id=id;this.name=name;,this.gender=false;this.birthday=,class Student,extends,Person,int stuId;,String name;,Date enrolDate;,public Student(),public Student(String id,String name,Date date),super(id,name);,public class Undergraduate,extends,Student,String collegeName;,String major;,public Undergraduate(),.,public Undergraduate(String id,String name),super(id,name);,4.1.2,成员的继承,子类可以继承父类的属性,初始值为父类中该属性的初值,子类不能直接访问父类中非,private,的属性,但可以通过调用父类的,public,方法访问,private,属性。,子类可以继承父类的成员方法,但无法直接访问父类的,private,方法。,子类对父类成员属性和方法的继承,子类和父类在同一包中,子类可以访问父类中不是,private,的成员变量和方法,子类和父类在不同包中,子类可以访问父类中,public,和,protected,成员变量和方法,不能访问默认和,private,的成员变量和方法,例:子类对父类的继承,class ParentClass,private int,x,;/,声明私有成员,protected int y;/,声明保护成员,int z;/,声明缺省成员,public int w;/,声明公有成员,public void parentmethod(),System.,out,.println(call parent class function:parentmethod();,;,class SonClass extends ParentClass,/,派生类中不能继承父类中的私有成员,其他成员均可继承,public void displayprivate()/,引用父类中私有成员,/System.out.println(X=+x);,public void displayprotected()/,引用父类中保护成员,System.,out,.println(Y=+y);,public void displaypublic()/,引用父类中公有成员,System.,out,.println(W=+w);,public void displaydefault()/,引用父类中的默认成员,System.,out,.println(Z=+z);,;,class SonClass1 extends ParentClass,;,public class Test4_1,public static void main(String args),ParentClass parent=new ParentClass();,SonClass son=new SonClass();,SonClass1 son1=new SonClass1();,/,三句执行的效果一样,,son,、,son1,中没有自己定义,parentmethod,(),方法,它继承了父类中的,parent.parentmethod();,son.parentmethod();,son1.parentmethod();,构造方法的继承,有继承时的构造方法遵循以下的原则,子类不能从父类继承构造方法,好的程序设计方法是在子类的构造方法中调用某一个父类构造方法,调用语句必须出现在子类构造方法的第一行,可使用,super,关键字,如子类构造方法的声明中没有明确调用父类构造方法,则系统在执行子类的构造方法时会自动调用父类的默认构造方法(即无参的构造方法),构造方法的继承,子类的构造方法会,自动调用父类,的无参构造方法。,带参数的构造方法,不会,被子类继承,也不会自动调用。在子类中,对父类有参构造方法可以使用,super,显示调用,初始化,回顾:类的构造方法,Case Study:Undergraduate.java,在构造方法内调用构造方法:,this,的使用,可以用,this,在一个构造方法内调用另一个构造方法,但不可调用两个;,若有构造方法调用,必须是第一步。,父类与子类传递构造函数,缺省构造函数,Case Study:Catoon.java,传递参数:,super(,),Case Study:AboutSubClassConstructor,4.1.3,覆盖和隐藏,子类只能继承父类中,访问控制权限为,public,、,protected,和,default,的成员变量和方法,子类不能继承,访问权限为,private,的成员变量和方法,子类不能继承父类中的静态属性,但可以通过,super,进行操作,方法的覆盖,成员方法的覆盖,当子类中定义了与父类,同名、同参数和同返回值类型,的成员方法,则父类的成员方法被重写,子类的方法,覆盖,了父类中的方法,称为方法的隐藏,方法重写,是运行时多态的基础,在子类中调用同名的方法时,是调用它自己定义的方法;若要使用父类中被覆盖的方法,可以使用,super,关键字。,例:方法的覆盖,public class SuperClass,void print(),System.,out,.println(This is the superclass!);,public static void main(String args),SuperClass sup=new SuperClass();,sup.print();,SubClass sub=new SubClass();,sub.print();,class SubClass extends SuperClass,void print(),System.,out,.println(This is the subclass!);,;,成员变量的隐藏,成员变量的隐藏,当子类中定义了与父类同名的成员变量,则父类的成员变量被隐藏,在子类执行从父类继承的方法时,使用,this,可以访问本类中的实例变量,关键字,super,可以访问被隐藏的父类实例变量。,4.1.4 this,和,super,的用法,this:,指当前对象,其调用格式为:,this.,成员变量,this.,成员方法,this(parameters list),super,:指父类对象,其调用格式为:,super.,成员变量,super.,成员方法,super(parameters list),this,的用法,1,返回当前对象的引用,2,在实例变量和局部变量同名的时候访问当前对象的实例变量,3,在类的构造方法中调用这个类的其他的构造方法,4,不能在静态方法或静态代码块中使用,this,例:,this,的用法,public class PersonA,private String name;,private int age;,PersonA(),this(No name,0);,System.,out.println(In PersonA constuctor);,PersonA(String name,int age),setName(name);/,你可以加上,this,来调用方法,像这样:,this.setName(name);,但这并不是必须的,this.setAge(age);,this.print();,System.,out.println(In PersonA constuctor with parameters);,public void setName(String name),this.name=name;/,此处必须指明你要引用成员变量,public void setAge(int age),this.age=age;,public void print(),System.out.println(Name=+name+Age=+age);/,在此行中并不需要用,this,,因为没有会导致混淆的东西,super,的用法,1,调用被子类隐藏的父类的实例变量,2,调用父类的方法,3,在子类里面调用父类的构造方法 如果不显示的调用则默认的调用父类无参的构造方法如果父类没有无参的构造方法这程序报错,4,父类中定义为,private,的变量和方法,子类不能继承,使用,super,也无法访问。,例:,super,的用法,public class PersonB,extends,PersonA,public void print(),System.,out.println(DemoSuper:);,super,.print();,public static void main(String args),PersonB b=new PersonB();,b.print();,public class PersonC extends PersonA,public PersonC(),/super();,public PersonC(String name,int age),super(name,age);,public static void main(String args),new PersonC();,new PersonC(Mary,3);,4.1.5 final,的意义,final,修饰的含义:无法改变、或终态的,final,的用法,final,变量,:,表明该成员变量为常量,内部类使用,final:,final,方法,:,表明该成员方法不能被重写,final,类,:,表明该类不能够被继承,public class Test4_13,final double PI=3.14;/在定义时便给址值,final int i;/因为要在构造方法中进行初始化,所以此处便不可再给值,Test4_13(),i=100;,list=new LinkedList();,Test4_13(int ii),i=ii;,public static void main(String args),Test4_13 b=new Test4_13();,public class Test4_15,public static void main(String args),FinalClass f=new FinalClass();,f.what();,f.print();,final class FinalClass,final String str=final Data;,public String str1=non final data;,final public void print(),System.,out,.println(final method.);,public void what(),System.,out,.println(str+n+str1);,4.2,抽象类与抽象方法,“,万物皆对象,”,,,java,中所有的对象都是通过类来描绘。,所有的类都是用来描绘对象的吗?,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是,抽象类,。,抽象类的基本概念,抽象类,是表征我们对问题领域进行分析、设计中得出的,抽象概念,,是对一系列看上去不同,但是本质上相同的具体概念的抽象。,例如:,“,东西,”,与,“,物体,”,?,我们要描述这个概念就要用到抽象类。因此在,java,中抽象类是不允许被实例化的。,抽象类的用途,抽象类通常代表一个抽象概念,可以用一句话来概括抽象类的用途:抽象类是用来继承的。,反过来可以说具体类不是用来继承的,只要有可能,我们不要从具体类继承。,抽象类和抽象方法,abstract,class,classname,/Class body,public,abstract,methodname,();,抽象类和抽象方法,一个类的作用仅仅是表达通用接口,而不是具体的实现细节,抽象方法是不完全的,是有一个声明没有方法主体,包含一个抽象方法的类被称为抽象类,不能创建抽象类的对象,从抽象类继承的类必须,override,所有的抽象方法,否则它自己成为抽象类。,可以申明一个抽象类,但里面没有一个抽象方法,4.3,接口,4.3.1,接口的作用,4.3.2,语法格式,4.3.3,接口的实现,4.3.4,适配器,4.3.1,接口的作用,是面向对象语言提供的抽象,和封装,重要机制,是抽象的进一步深化。,把不同类的共同特征抽象出来,归于不同的接口,可以更好的管理他们。,接口允许设计者规定一个类的基本形式:,方法和属性列表,但不给出实现,。,接口可以实现多重继承功能。,没有继承关系的类之间也会存在相同的属性和方法,可以将这些属性和方法组织成接口,需要这些属性和方法的类可以实现这个接口。,4.3.1,接口的作用,4.3.2,语法格式,声明格式:,interface,interfacename,/method&basic data,接口的数据成员一定要赋初值,且此值将不能再更改,允许省略,final,关键字,接口中的方法必须是,“,抽象方法,”,,不能有方法体,允许省略,public,及,abstract,关键字,接口与抽象类的区别,接口与抽象类也有些类似,有抽象的方法,接口与抽象类的区别是:,(1)接口中不能有非抽象方法(抽象类可以有非抽象方法);,(2)一个接口可以有多个父接口(抽象类只能由 一个父类);,(3)接口中的属性的修饰符仅限于public static final;,(4)接口不属于继承结构,它与实际继承关系无关,因此无关的类也可以实现同一个接口。,4.3.3,接口的实现,由于接口中的方法都是抽象方法,所以接口定义完成之后,必须在各类中对这个接口的方法进行具体化,就是在这个类中重新定义接口的所有方法,这时这些方法就不能是抽象的了,我们称这个过程为某各类实现了某个接口。,实现接口应注意,一个类能够实现多个接口,一个接口可以被多个类实现。,一个类实现接口必须实现这个接口中的所有方法,包括父接口中的方法。被实现的方法必须和接口定义的方法有完全一样的方法名、返回值和形参表(否则就是重载)。,被实现的方法的访问控制类型必须是public。,实现接口,class,classname,implements,interfacename,/class body including method body,接口的多重继承,Interface,可以从多个,interface,得到继承,但不能继承类。,interface,interfacename,extends,if1,if2,/method&basic data,类的多个接口实现,一个类可以实现多个,interface.,class,classname,implements,if1,if2,/class body including method body,interface,例子:,为什么要定义那么多接口然后再用类去一个个继承他们,?,这里有一个游戏,人猿泰山。,主角是一个单独的类,这里我们主要用怪物说明接口的用法。怪物有很多种,,按地域分:有的在天上飞,有的在地上跑,有的在水里游,按攻击方式分:有的能近距离物理攻击,有的能远距离射击,假设游戏里需要这样的几种怪,狼:地上移动,近距离攻击,黑熊:地上移动,近,/,远距离攻击,老鹰:地上,/,天上移动,远距离攻击,食人鱼:水中移动,近距离攻击,鳄鱼:地上,/,水中移动,近距离攻击,我们使用接口来实现各种怪物的定义:,interface OnEarth/,陆地接口,int earthSpeed;/,陆地移动速度,void earthMove();/,陆地移动方法,interface NearAttack/,近距离攻击接口,int nearAttackPower;/,近距离攻击力,void nearAttack();/,近距离攻击方法,4.3.4,适配器,使用一个接口时必须实现所有的方法,通常我们只需要使用接口中某些方法,如果也全部实现其他抽象方法非常不方便。在Java中,Java类库为所有 接口提供了一个与接口相对应的抽象类(这个抽象类定义的内容与接口相同,只是一个是接口一个是抽象类),当我们只需要使用某个接口的少部分方法时,就可以 继承与之相对应的抽象类,这个抽象类成为这个接口的适配器。,4.4,多态性,4.4.1,后期绑定,4.4.2,上溯造型,4.4.3,下塑造型,4.4.4,重载,4.4.1,后期绑定,将一个方法调用和一个方法主体连接到一起称为绑定(Binding)。,根据绑定的时机不同,可将绑定分为“早期绑定”和“后期绑定”两种。如果在程序运行之前进行绑定(由编译器和链接程序完成),称为早期绑定。如果在程序运行期间进行绑定,称为后期绑定,后期绑定也称为“动态绑定”或“运行时绑定”。,在,Java,中,多态性是依靠后期绑定实现的,即,Java,虚拟机在运行时确定要调用哪一个同名方法,除非一个方法已被声明成,final,。,4.4.1,后期绑定,根据绑定的时机不同,可将绑定分为“早期绑定”和“后期绑定”两种。,早期绑定,如果在程序运行之前进行绑定(由编译器和链接程序完成),称为早期绑定。,后期绑定,如果在程序运行期间进行绑定,称为后期绑定,后期绑定也称为“动态绑定”或“运行时绑定”。,4.4.1,后期绑定,在,Java,中,多态性是依靠后期绑定实现的,即,Java,虚拟机在运行时确定要调用哪一个同名方法,除非一个方法已被声明成,final,。,4.4.2,上溯造型,将一个对象作为它自己的类型使用,或者作为它的基础类型的一个对象使用。,由于造型的方向是从衍生类到基础类,箭头朝上,所以通常把它叫作,“,上溯造型,”,,即,Upcasting,。,经典的例子,class Shape,void draw(),void erase(),class Circle extends Shape,void draw(),System.,out,.println(Circle.draw();,void erase(),System.,out,.println(Circle.erase();,class Square extends Shape,void draw(),System.,out,.println(Square.draw();,void erase(),System.,out,.println(Square.erase();,class Triangle extends Shape,.,class Shapes,public static Shape randShape(),switch(int)(Math.,random,()*3),default:/To quiet the compiler,case 0:,return new Circle();,case 1:,return new Square();,case 2:,return new Triangle();,public class Test4_18,public static void main(String args),Shape s=new Shape9;,/Fill up the array with shapes:,for(int i=0;i s.length;i+),si=Shapes.,randShape,();,/Make,polymorphic,method calls:,for(int i=0;i s.length;i+),si.draw();,4.4.4,重载,重载(指方法重载)是指在一个类中定义了多个同名的方法,但各个方法的参数个数和参数类型不同,根据不同的参数个数和类型来选择执行不同的方法,修饰符和返回值也可以不同。,方法重载的条件:,方法名相同,参数列表不同,其中包括:参数的个数不同、参数的类型不同、参数类型的顺序不同,构造方法重载,构造方法重载的目的,以不同的方法对类进行初始化。,构造方法的重载与其它方法相同,根据参数列表调用相同的构造方法。,如果找不到相应的构造方法(包括兼容类型)则出错。,小结,4.1,什么是继承,4.2,抽象类与抽象方法,4.3,接口,4.4,多态性,实验:继承和多态,实验,6,:继承,实验,7,:抽象类,实验,8,:多态,BACK,知识点提示:,理解,类继承的概念,抽象类的概念,接口的概念和定义,掌握继承,类继承的语法,类的隐藏和覆盖,以及构造方法的调用,知识点提示:,掌握抽象类,抽象类的定义,掌握接口,接口的定义,接口的继承与多继承,接口的实现方法,多态的体现,End of Chapter 3,
展开阅读全文

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


开通VIP      成为共赢上传

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

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

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

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

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

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

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

客服