JAVA第9章继承、多肽与接口

上传人:pia****nwu 文档编号:244988895 上传时间:2024-10-06 格式:PPT 页数:44 大小:263.99KB
返回 下载 相关 举报
JAVA第9章继承、多肽与接口_第1页
第1页 / 共44页
JAVA第9章继承、多肽与接口_第2页
第2页 / 共44页
JAVA第9章继承、多肽与接口_第3页
第3页 / 共44页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第9章 继承、多态与接口,本章学习重点:,继承与多态的概念,继承与多态的实现机制,抽象类和接口,9.1 继承与多态,当一个类拥有另一个类的数据和操作时,就称这两个类之间具有继承关系,被继承的类称为,父类,或,超类,,继承的类称为,子类,。,一个父类可以同时拥有多个子类,该父类实际上是所有子类的公共成员变量和公共方法的集合,而子类是父类的特殊化,可对公共成员变量和方法在功能、内涵方面加以扩展和延伸。,面向对象的继承特性中,还有一个关于单继承和多继承的概念。,单继承是指任何类都只有一个父类。,多继承是指一个类可以有一个以上的父类,它静态数据和操作从所有这些父类中继承的。,Java只支持单重继承,但支持界面,一个类可以实现多个界面。利用界面可以得到多继承的优点,又没有多继承混乱、复杂的问题。,Java继承:创建子类,Java中的继承是通过extends关键字来实现的。格式为:,class 子类名,extends,父类名称,在定义类时用extends关键字指明新定义类的父类,就在两个类之间建立了继承关系,新定义的类被称为子类。,如果子类和父类,在同一个包中,,它可以从父类那里继承所有非private的成员变量和方法作为自己的成员。,如果子类和父类,不在同一个包中,,它可以从父类那里继承protected、public的的成员变量和方法作为自己的成员.,【例】应用继承性的实例。,class Student /自定义“学生”类,int stu_id;/定义属性:学生学号,void set_id(int id)/定义方法:设置学号,stu_id=id;,void show_id()/定义方法:显示学号,System.out.println(the student ID is:+stu_id);,class UniversityStudent extends Student,/定义子类,int dep_number;,/定义子类特有的属性变量,void set_dep(int dep_num),/定义子类特有的方法,dep_number=dep_num;,void show_dep( ),System.out.println(the dep_number is:+dep_number);,public static void main(String args),UniversityStudent Lee=new UniversityStudent();,Lee.set_id(2007070130); /继承父类学生的属性,Lee.set_dep(701);,/使用本类的属性,Lee.show_id(); /继承父类学生的方法,Lee.show_dep();,/使用本类的方法,成员变量的隐藏和方法的覆盖,1.成员变量的继承,子类可以继承父类的所有非私有成员变量。,2.成员变量的继承,子类重新定义一个从父类那里继承来的成员变量变量完全相同的变量,称为成员变量的隐藏。,3.方法的覆盖,方法的覆盖是指子类重定义从父类继承来的一个同名方法,此时子类将清除父类方法的影响。,注意:,子类在重新定义父类已有的方法时,应保持与父类完全相同的方法头声明,即应与父类有完全相同的方法名、相同的参数表和相同的返回类型。,【例】成员变量的隐藏和方法的覆盖示例。,class SuperClass,int x;,void setX( ),x=0;,class SubClass extends SuperClass,int x; /成员变量的隐藏,void setX( ) /方法的覆盖,x=5;,方法的覆盖与成员变量的隐藏的区别为:,子类隐藏父类的成员变量只是使之不可见,父类的同名成员变量在子类对象中仍然占有自己独立的内存空间;,而子类方法对父类同名方法的覆盖将清除父类方法占用的内存,从而使父类方法在子类对象中不存在。,方法的覆盖与成员变量的隐藏的意义:将父类行为和状态改为自身的行为和状态,对外仍保持统一的接口和名字,不失继承性。,super,子类对父类的同名成员变量和方法,分别实行隐藏和覆盖。但是,有时需要在子类中访问父类的变量、父类的方法,Java提供的super就可以实现这访问。它的使用有三种情况:,访问被隐藏的父类成员变量,如:,super.VariableName,调用父类中被覆盖的方法,如:,super.MethodName,调用父类中的构造方法,如:,super(paramList),多态性,多态性是面向对象程序设计的又一特征。,面向过程的语言编程的主要工作是编写一系列过程或函数,这些过程和函数各自对应一定的功能,它们之间不能重名,否则在调用时,就会产生歧异和错误。,而在面向对象的程序设计中,有时却需要利用这样的“重名”现象来提高程序的抽象度和简洁性。,多态性是指同名的不同方法在程序中共存。,即为同一个方法定义几个版本,运行时根据不同情况执行不同的版本。调用者只需使用同一个方法名,系统会根据不同情况,调用相应的不同方法,从而实现不同的功能。,在Java语言中,多态性的实现有两种方式:,1、覆盖实现多态性,2、重载实现多态性,1、覆盖实现多态性,覆盖实现多态性,通过子类对继承父类方法的重定义来实现。使用时注意:在子类重定义父类方法时,要求与父类原型(参数个数、类型、顺序)完全相同。,重写方法的调用规则,对于重写的方法,Java运行时系统根据调用该方法的实例的类型来决定选择哪个方法调用。对于类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法。如果子类继承了父类的方法(未重),则运行时系统调用父类的方法。因此,一个对象可以通过引用子类的实例来调用于类的方法。,【例,6-15】重写方法的调用规则示例。,class A,void callme( ),System.out.println(InsideAscallme( )method);,class B extends A,void callme( ),System.out.println(Inside Bs callme( ) method);,public class Dispatch,public static void main(String args ),A a=new B( );,a.callme( );,运行结果为:,Inside Bs callme( ) method,方法重写的两个原则:,改写后的方法不能比被重写的方法有更严格的访问权限。,改写后的方法不能比被重写的方法产生更多的例外。,2、重载实现多态性,重载实现多态性是通过定义类中的多个同名的不同方法来实现的。编译时则根据参数(个数、类型、顺序)的不同来区分不同的方法。通过重载可定义多种同类的操作方法,调用时根据不同需要选择不同的操作。,与方法的覆盖不同,重载不是子类对父类同名方法的重新定义,而是类对自身已有的同名方法的重新定义。,由于重载发生在一个类里,不能用类名来区分不同的方法,所以采用不同的形式参数列表,包括形式参数的个数、类型、顺序的不同,来区分重载的方法。,【例】重载实现多态性举例。,该类中定义了矩形,用四个实例变量来定义这个矩形的左上角和右下角的坐标,,x1,、,y1,、,x2,、,y2,。另外定义了三个同名的不同,buildRect(),方法为这些实例变量设置值。,import java.awt.Point;,class MyRect,int x1=0;int y1=0;,int x2=0;int y2=0;,MyRect buildRect(int x1,int y1,int x2,int y2),this.x1=x1;this.y1=y1;,this.x2=x2;this.y2=y2;,return this;,MyRect buildRect(Point topLeft,Point bottomRight),x1=topLeft.x;y1=topLeft.y;,x2=bottomRight.x;y2=bottomRight.y;,return this;,MyRect buildRect(Point topLeft,int w,int h),x1=topLeft.x;y1=topLeft.y;,x2=(x1+w);y2=(y1+h);,return this;,void printRect(),System.out.println(MyRect:);,public static void main(String args),MyRect rect=new MyRect();,rect.buildRect(25,25,50,50);,rect.printRect();,System.out.println(*);,rect.buildRect(new Point(10,10),new Point(20,20);,rect.printRect();,System.out.println(*);,rect.buildRect(new Point(10,10),50,50);,rect.printRect();,System.out.println(*);,9.2 抽象类与接口,抽象类,抽象类:用abstract关键字来修饰的类。,声明为abstract的类不能被实例化。它只提供了一个基础,为了实例化,该类必须作为父类,子类可以通过继承它,然后添加自己的属性和方法形成具体的有意义的类。,抽象类必须被继承。,抽象方法:用abstract来修饰一个方法时,该方法叫做抽象方法。,抽象方法必须被重写,抽象方法只有声明,不能有实现,定义了抽象方法的类必须是抽象类,【例】抽象类举例。,abstract class A ,abstract void callme( );,void metoo( ),System.out.println(Inside As metoo( ) method);,class B extends A,void callme( ),System.out.println(Inside Bs callme( ) method);,public class Abstract ,public static void main( String args ) ,A c = new B( );,c.callme( );,c.metoo( );,接口,接口(interface)就是方法定义和常量值的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有方法的实现。,通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。,通过接口可以指明多个类需要实现的方法。,通过接口可以了解对象的交互界面,而不需了解对象所对应的类。,接口是用来实现类间多重继承功能的结构.,在Java中,出于简化程序结构的考虑,不支持类间的多重继承而只支持单重继承,即一个类至多只能有一个直接父类。,接口的实现功能比多重继承更强,接口把方法的定义和类的层次区分开来,通过它可以在运行时动态地定位所调用的方法;,同时,也可以实现“多重继承”,且一个类可以实现多个接口。,正是这些机制使得接口提供了比多重继承更简单,更灵活,而且更强健的功能。,1. 接口的定义,public interface 接口名extends 接口列表,/常量定义和方法定义,public指明任意类均可以使用这个接口。在缺省情况下,只有与该接口定义在同一个包中的类才可以访问这个接口。,extends子句与类声明中的extends子句基本相同,不同的是一个接口可以有多个父接口,用逗号隔开,而一个类只能有一个父类。子接口继承父接口中所有常量和方法。,接口体中包括常量定义和方法定义,其格式如下所示:,type constantName = Value;,returnType methodName(paramList);,在接口中定义的常量可以被用来实现该接口的多个类共享,与C语言中的const定义常量是相似的。,在接口中定义的常量具有public、final、static的属性。,接口中只进行方法的声明,而不提供方法的实现,所以,方法定义没有方法体,且用分号(;)结尾。在接口中声明的方法具有public和abstract属性。,另外,如果在子接口中定义了和父接口同名的常量或相同的方法,则父接口中的常量被隐藏,方法被覆盖。,例:,interface Collection,int MAX_NUM=100;,void add (Object objAdd);,void delete (Object objDelet);,Object find (Object objFind);,int currentCount();,接口定义中声明了一个常量和四个方法。这个接口可以由队列、堆栈、链表等来实现。,2. 接口的实现,接口的声明仅仅给出了抽象方法,要具体地实现接口所规定的功能,则需某个类为接口中的抽象方法定义实在的方法体,这就称为,接口的实现,。,在类的声明中,用,implements,句子表示一个类将要实现某个接口,在类体中可以引用接口中定义的常量,而且必须实现接口中定义的所有方法。一个类可以实现多个接口,在implements子句中用逗号分隔。,【例】接口的实现:在类FIFOQueue中实现上面所定义的接口collection。,class FIFOQueue implements collection,void add (Object obj ),.,void delete( Object obj ),.,Object find( Object obj ),.,int currentCount ,.,注意:,在类中实现接口所定义的方法时,方法的声明必须与接口中所定义的完全一致。,在类中实现接口所定义的方法时,必须显式地使用,public,修饰符,否则将被系统警告为缩小了接口中定义的方法的访问控制范围。,抽象类可以不实现接口的抽象方法,而非抽象类必须实现接口中的所有方法。,9.3 其他,final关键字,final在类之前,表示该类是最终类,不能再被继承。,由于安全性的原因或者是面向对象的设计上的考虑,有时候希望一些类不能被继承,例如,Java中的String类,它对编译器和解释器的正常运行有很重要的作用,不能轻易改变它,因此把它修饰为final类,使它不能被继承,这就保证了String类型的唯一性。,final在方法之前,表示该方法是最终方法,用final修饰的方法不能再被子类重写;该方法不能被任何派生的子类覆盖。,final在变量之前,表示变量的值在初始化之后就不能再改变;相当于定义了一个常量。,实例成员和类成员,Java类包括两种类型的成员:实例成员和类成员。,除非特别指定,定义在类中的成员一般都是实例成员。,【例】实例成员举例,class AnIntergerNamedX,int x;,public int x(),return x;,public void setX(int newX),x=newX;,声明了实例变量之后,当每次创建类的一个新对象时,系统就会为该对象的所有成员创建实例变量的副本,然后就可以通过对象访问这些实例变量。,实例方法是对当前对象实例变量进行操作的,而且可以访问类变量。,static 在变量或方法之前,表明它们是属于类的,称为类方法(静态方法)或类变量(静态变量)。,类成员用static修饰符声明,格式如下:,static,type classVar;,static,return Type classMethod(paramlist),分别声明了类变量和类方法。,类变量,类变量用static修饰符声明。,系统只为每个类分配类变量,而不管类创建的对象有多少。当第一次调用类的时候,系统为该类变量分配内存,所有的对象共享了该类的类变量。因此,可以通过类本身或者某个对象来访问该类变量。,【例】类变量举例,class AnIntergerNamedX,static int x;,public int x(),return x;,public void setX(int newX),x=newX;,输出的两个变量结果相同,这是因为,x,是一个类变量,因此,就只有该类变量的唯一副本,它被该类的所有对象所共享,包括,myX,和,anotherX,。当在任一对象中调用,setX,的时候,也就改变了该类所有对象所共享的值。,结果输出为:,myX.x=2,anotherX.x=2,类方法,为了指定方法为一个类方法,可以在方法声明的地方使用static关键字。,类方法只能操作类变量而不能直接访问在类中定义的实例变量,除非这些类方法创建了一个新的对象,并通过对象访问它们。,类方法可以在类中被调用,不必通过一个实例来调用一个类方法。,Java程序的入口方法main()就是一个类方法。,【例】不正确的引用,class AnIntergerNamedX,int x;,static public int x(),return x;,static public void setX(int newX),x=newX;,当编译这个类时,就会出错。原因是类方法不能访问实例变量。,static,解决方法:,1.,将变量变成类变量;,2.,创建一个类的对象,并且通过该对象来访问变量。,同一个类的实例方法可以访问该类的类变量和类方法;,而类方法只能访问该类的类变量和类方法,不能直接访问实例的变量和方法。,内嵌类,在一个类的内部声明的类,称为内嵌类。,内嵌类只能在包含它的类中使用,同时它可以看作是该包含类的一段特殊代码,可以直接使用该包含类的变量和方法。,内嵌类编译后也会形成一个单独的class,但它附属于其包含类。,public class Stack ,private Vector items;,./code for Stacks methods and constructors not shown.,public Enumeration enumerator() ,return new StackEnum();,class,StackEnum implements Enumeration,int currentItem = items.size() - 1;,public boolean hasMoreElements() ,return (currentItem = 0);,public Object nextElement() ,if (!hasMoreElements() throw new NoSuchElementException();,else return items.elementAt(currentItem-);,作业,1,2,3,5,6,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!