课件1-5章第五讲继承和接口_第1页
课件1-5章第五讲继承和接口_第2页
课件1-5章第五讲继承和接口_第3页
课件1-5章第五讲继承和接口_第4页
课件1-5章第五讲继承和接口_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、第五讲 继承和接口5.1类的继承5.2 对象的上转型对象5.3多态性5.4 super关键字5.5 接口5.1类的继承 继承:是存在于面向对象程序中的两个类之间的一种关系。当一个类A能够获取另一个类B中所有非私有的数据和操作的定义作为自己的部分或全部成分时,就称这两个类之间具有继承关系。被继承的类B称为父类或超类,继承了父类或超类的数据和操作的类A称为子类。5.1类的继承 一个父类可以同时拥有多个子类,这时这个父类实际上是所有子类的公共域和公共方法的集合,而每一子类则是父类的特殊化,是在父类的基础之上对公共域和方法在功能、内涵方面的扩展和延伸。 使用继承具有以下的好处:降低代码编写中的冗余度,

2、更好地实现了代码复用的功能,提高程序编写的效率。由于降低了代码的冗余度,使得程序在维护时就变得非常的方便。 5.1类的继承 1、子类 在类的声明中,通过使用关键字extends来创建一个类的子类,格式如下: class 子类名 extends 父类名 例如: class Students extends People 5.1类的继承 2、子类的继承 类可以有两种重要的成员:成员变量和方法。子类的成员中有一部分是子类自己声明定义的,另一部分是从它的父类继承的。 所谓子类继承父类的成员变量作为自己的一个成员变量,就好象它们是在子类中直接声明一样,可以被子类中自己声明的任何实例方法操作。 所谓子类继

3、承父类的方法作为子类中的一个方法,就象它们是在子类中直接声明一样,可以被子类中自己声明的任何实例方法调用。5.1类的继承 类中继承的实现主要有以下几个步骤: 确定父类。 定义子类。它的具体语法是: 类修饰符 class 子类名 extends 父类名 实现子类的功能。 class A public int a1; private float a2; int getA() return(a1); void setA()class B extends A int b1; String b2; String getB() return(b2); class C extends B int c; in

4、t printC() System. out. println(c); 5.1类的继承 1)子类和父类在同一包中的继承性 如果子类和父类在同一个包中,那么,子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且也自然地继承了父类中不是private的方法作为自己的方法, 继承的成员或方法的访问权限保持不变。 5.1类的继承 2)子类和父类不在同一包中的继承性 如果子类和父类不在同一个包中,那么,子类继承了父类的protected、public成员变量做为子类的成员变量,并且继承了父类的protected、public方法为子类的方法, 继承的成员或方法的访问权限保持不变。

5、如果子类和父类不在同一个包里,子类不能继承父类的友好变量和友好方法。5.1类的继承 3、成员变量的隐藏和方法的重写 1)隐藏:只要子类中定义的成员变量和父类中的成员变量同名时,子类就隐藏了继承的成员变量 。 2)重写(覆盖):指子类中定义一个方法,并且这个方法的名字、返回类型、参数个数和类型与从父类继承的方法完全相同。 3)覆盖的实现:就是在子类中对需要覆盖的父类成员以父类中相同的格式再重新声明定义一次。这样就完成了对父类成员的覆盖。它是一种很重要的多态形式。5.1类的继承 4)被覆盖的成员的使用 (1)域变量的使用 当子类重新定义一个与从父类那里继承来的完全相同的属性变量时,子类就隐藏了父类

6、的该变量(称为域变量的隐藏)。对于域变量的隐藏来说,父类定义的域变量在子类对象实例化时仍然分配一个存储空间。 当子类执行继承自父类的操作时,处理的是继承自父类的变量,而当子类执行它自己定义的方法时,所操作的就是它自己定义的变量,而把继承自父类的变量“隐藏”起来。5.1类的继承 (2)方法的使用 当子类重新定义与父类同名的方法时,就实现了对父类方法的覆盖(Overload)。 方法的覆盖与域的隐藏的不同之处在于:子类隐藏父类的域只是使之不可见,父类的同名域在子类对象中仍然占有自己的独立内存空间;而子类方法对父类同名方法的覆盖将清除父类方法占用的内存空间,从而使父类方法在子类对象中不复存在。5.1

7、类的继承 方法的覆盖中需要注意的问题是:子类在重新定义父类已有的方法时,应保持与父类完全相同的方法头声明,即应与父类有完全相同的方法名、返回值和参数列表。否则就不是方法的覆盖,而是子类定义自己的与父类无关的方法,父类的方法未被覆盖,所以仍然存在。5.1类的继承 4、final关键字 1)final关键字可以修饰类、成员变量和方法中的参数。 2)final类不能被继承,即不能有子类。 3)如果一个方法被修饰为final方法,则这个方法不能被重写。 4)如果一个成员变量被修饰为final的,就是常量,常量必须赋给初值,而且不能再发生变化。 5)如果方法的参数被修饰为final的,该参数的值不能被改

8、变。5.2 对象的上转型对象 1)假设B类是A类子类或间接子类,当我们用子类B创建一个对象,并把这个对象的引用放到A类的对象中时: A a; B b=new B(); a=b; 称这个A类对象:a,是子类对象b的上转型对象。 2)对象的上转型对象的实体是子类负责创建的,但上转型对象会失去原子类对象的一些属性和功能。5.2 对象的上转型对象 3)上转对象不能操作子类新增的成员变量(失掉了这部分属性);不能使用子类新增的方法(失掉了一些功能)。 4)上转型对象可以操作子类继承或隐藏成员变量,也可以使用子类继承的或重写的方法。 5)上转型对象操作子类继承或重写的方法时,就是通知对应的子类对象去调用这

9、些方法。因此,如果子类重写了父类的某个方法后,对象的上转型对象调用这个方法时,一定是调用了这个重写的方法。 6)可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有属性和功能。5.3多态性 1、多态的概念 多态:是指一个程序中同名的不同方法共存的情况。 2、实现多态的方法 1) 通过子类对父类成员的覆盖实现多态。 2) 利用重载在同一个类中定义多个同名的不同方法实现多态。5.4 abstract 类和abstract方法 1、抽象类和抽象方法 1)抽象类 (1)定义: 在Java中,凡是用abstract修饰符修饰的类称为抽象类。 (2)格式: 定义一个抽象类的格式

10、如下: abstract class ClassName . /类的主体部分5.4 abstract 类和abstract方法 2)抽象方法 (1)定义: 在Java中,凡是用abstract修饰符修饰的方法称为抽象方法。 (2)格式: 定义一个抽象方法的格式如下: abstract public 方法名(参数列表);5.4 abstract 类和abstract方法 2、抽象类和一般类的区别 如果一个类中含有未实现的抽象方法,那么这个类就必须通过关键字abstract进行标记声明为抽象类。 抽象类中可以包含抽象方法,但不是一定要包含抽象方法。它也可以包含非抽象方法和域变量,就像一般类一样。

11、抽象类是没有具体对象的概念类,也就是说抽象类不能实例化为对象。 抽象类必须被继承。子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类。5.4 abstract 类和abstract方法 和普通的类相比,abstract类可以有abstract方法。对于abstract方法,只允许声明,不允许实现,而且不允许使用final修饰abstract方法。 abstract class A abstract int min(int x,int y); int max(int x,int y) return xy?x:y; 5.4 abstract 类和abstract方法 3、abstract类

12、不能用new运算创建对象 对于abstract类,我们不能使用new运算符创建该类的对象,需产生其子类,由子类创建对象,如果一个类是abstract类的子类,它必须具体实现父类的abstract方法,这就是为什么不允许使用final修饰abstract方法的原因。 一个abstract类只关心它的子类是否具有某种功能,并不关心功能的具体行为,功能的具体行为由子类负责实现。5.4 super关键字 Super关键字主要是用来调用父类的成员变量和方法的。 1、使用关键字super调用父类的构造方法 Java中子类不继承父类的构造方法,因此,子类如果想使用父类的构造方法,必须且必须使用关键字supe

13、r来表示,而且super必须是子类构造方法中的头一条语句。 如: class A super(); 5.4 super关键字 2、使用关键字super操作被隐藏的成员变量和方法 如果我们在子类中想使用被子类隐藏了的父类的成员变量或方法就可以使用关键字super。 比如:super.x ,super.play()5.5 接口 接口的引入可以克服单继承的缺点,一个类可以实现多个接口。 1、接口的声明与使用 1)接口声明 格式: public interface 接口名 extends父接口名列表 2)接口体 接口体中包含常量定义和方法定义两部分。接口体中只进行方法的声明,不许提供方法的实现,所以,

14、方法的定义没有方法体,且用分号“;”结尾。如:5.5 接口 interface Printable final int MAX=100; void add(); float sum(float x ,float y); 3)接口的使用 一个类通过使用关键字implements 声明自己使用一个或多个接口。如果使用多个接口,用逗号隔开接口名。如: class A implements Printable,Addable5.5 接口 如果一个类使用了某个接口,那么这个类必须实现该接口的所有方法,即为这些方法提供方法体 ,但在类中实现接口的方法时,方法的名字、返回类型、参数个数及类型必须与接口中的完

15、全一致。接口实现时必须给出方法体,且一定要用public来修饰。 2、理解接口 接口的思想在于它可以增加很多类都需要实现的功能,使用相同的接口类不一定有继承关系。 同一个类也可以实现多个接口。接口只关心功能,并不关心功能的具体实现。5.5 接口 在Java中接口是一种专门的类型。用interface关键字定义接口。 接口中只能定义抽象方法,不能有方法体,一定是public修饰的。 接口中可以定义变量,但实际上是static final修饰的常量。 接口中不能定义静态方法,接口不能包含任何可以执行的方法,而抽象类可以。 类可以实现多个接口,但只有一个父类。 接口不是类分级结构的一部分,而没有联系

16、的类可以执行相同的接口。5.5 接口 3、接口回调 接口回调是指:可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中。那么该接口变量就可以调用被类实现的接口中的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法。 4、接口做参数 一个方法的参数是接口类型,就可以将任何实现该接口的类的实例的引用传递给该接口参数,接口参数就可以回调类实现的接口方法。5.5 接口 一个类要实现接口时,请注意以下问题: 在类的声明部分,用implements关键字声明该类将要实现哪些接口。 如果实现某接口的类不是abstract抽象类,则在类的定义部分必须实现指定接口

17、的所有抽象方法。 如果实现某接口的的类是abstract的抽象类,则它可以不实现该接口所有的方法。但是对于这个抽象类任何一个非抽象的子类而言,它5.5 接口 们父类所实现的接口中的所有抽象方法都必须有实在的方法体。 个类在实现某接口的抽象方法时,必须使用完全相同方法头。如果所实现的方法与抽象方法有相同的方法名和不同的参数列表,则只是在重载一个新的方法,而不是实现已有的抽象方法。 接口的抽象方法的访问限制符都已制定为public,所以类在实现方法时,必须显式地使用public修饰符,否则将被系统警告为缩小了接口中定义的方法的访问控制范围。总 结2022/8/2433小结 1继承是一种由已有的类创建新类的机制。利用继承,我们可以先创建一个共有属性的一般类,根据该一般类再创建具有特殊属性的新类。2所谓子类继承父类的成员变量作为自己的一个成员变量,就好像它们是在子类中直接声明一样,可以被子类中自己声明的任何

温馨提示

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

评论

0/150

提交评论