第4章继承、接口和内部类1.ppt_第1页
第4章继承、接口和内部类1.ppt_第2页
第4章继承、接口和内部类1.ppt_第3页
第4章继承、接口和内部类1.ppt_第4页
第4章继承、接口和内部类1.ppt_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、第4章 继承、接口和内部类,继承和多态是面向对象编程的两个重要特征。 继承的目的是子类复用父类的数据成员和成员方法。 多态是指同一个方法声明在不同的类中具有不同的方法体,即不同的功能。 接口是伴随多态而来的,它的任务是实现多态。,4.1 类的继承,继承是面向对象思想中最有价值的机制之一,它极大地提高了应用程序的代码复用性、可维护性以及可靠性。 Java中类的继承是指一个类可以从另一个类那里获得(继承)一些状态和行为,并进行所需要的扩展。被继承的类称为父类或者超类,继承后产生的类称为子类或者派生类。,对类层次之中蕴含的普遍与特殊关系的描述是继承性的本质。,图4-1 普遍与特殊类层次,4.1.1声

2、明子类 在类的声明中使用关键字extends,子类在前,父类在后。例如: class B extends A Java规范约定:一个子类只能有一个父类,但一个类可以有多个子类。,例4-1 子类的创建、方法的重载和改写 class Chinaman void say() System.out.println(我是中国人); class Wuhanman extends Chinaman /void say()System.out.println(我是武汉人); /override void say(String s) System.out.println(我是+s+的中国人); public c

3、lass A501 public static void main(String args) Chinaman c = new Chinaman(); Wuhanman wh = new Wuhanman(); c.say(); wh.say(); wh.say(讲武汉话,喜欢吃热干面); 程序运行结果: 我是中国人 我是中国人 我是讲武汉话,喜欢吃热干面的中国人,例4-1中父类与子类、关键字extends class Wuhanman extends Chinaman Chinaman称为Wuhanman的父类 父类(super class、超类、基类)忽略了子类(subclass、派生类)

4、的特征上的差异,拥有广泛的适用范围; 子类是父类更具体、更特殊的表现形式。,4.1.2方法覆盖 覆盖就是指将父类中某方法的实现替换为自己的实现,从而达到多态性的目的。 子类中声明的覆盖方法可以拥有自己的访问修饰符,但是,覆盖方法的访问权限不能小于被覆盖方法的访问权限。 对于修饰符static来讲,在子类中创建的静态方法,并不会覆盖父类中具有相同签名的静态方法,这只能被认为是子类声明了一个新方法。,覆盖与重载的区别 重载:同一个类中定义多个不同参数的同名方法 覆盖:子类中重写父类中同名、同参、同返回值类型的方法,例4-2重载和覆盖 class F508 int fun (int i,int j

5、) System.out.println (i+j) ; return i+j; class S508 extends F508 int fun (int i,int j ) /子类方法覆盖父类方法 System.out.println (i*j) ; return i*j; double fun (double i,int j )/方法重载 System.out.println (i+j) ; return i+j; class A508 public static void main (String args ) F508 f = new F508 (); f.fun (2,5); S50

6、8 s=new S508 (); s.fun (2,5); s.fun (2.2,5); 7 10 7.2,4.1.3 super关键字 super关键字只能用在非静态方法中,它使父类中被屏蔽的 成员变量或者成员方法可见。 super用在子类中,目的是访问直接父类中被屏蔽的成员。,1.访问父类成员变量 super.成员变量名 例:p75 4-1 2.访问父类成员方法 super.方法名(参数列表) 例:P75 4-2,3.访问父类构造方法(子类对象的初始化) 从子类对象的内存分配看,它既包括了从父类继承过来的成员变量,也包括了自己声明的成员变量。 创建子类对象时,必须对所有的这些成员变量初始化

7、。 子类的构造函数不知道父类的成员变量应该如何初始化,因此,默认状态下,子类的构造方法调用父类构造方法。,super与this,任何对象,一旦被创建,就有了两个默认句柄:关键字super指向父类对象,关键字this指向当前对象本身。 对于层次性的继承关系,子类对象创建时,系统将自动调用一系列构造方法,这些构造器调用顺序是固定的:总是从Object类开始,按继承的顺序,直到new所指定的类的构造器。,(1)如果所有类都使用默认构造器(或无参数构造器),调用顺序是:Obiect() G() F() Me(). 例5-3构造器的调用顺序 public class Me extends F Me()

8、/super() System.out.println(Me); public static void main(String args) new Me(); class F F() System.out.print (F ); F(int i) System.out.print(F+i + ); 程序运行结果: F Me,(2)如果父类构造器重载了,通过super指定调用哪个父类构造器。 例super指定父类构造器 class F F() System.out.print (F ); F(int i) System.out.print(F+i + ); public class A504 e

9、xtends F A504 () super (4) ; /指定调用F (int) System.out.println (A ); public static void main (String args ) new A504 (); 程序运行结果: F4 A,(3)如果子类自己的构造器重载了,通过this在一个构造器里调用另一个构造器。 例:this调用另一个构造器 public class A505 private String s = new String (null ); A505 () System.out.print (A505 ); A505 (String str ) thi

10、s (); this.s=str; System.out.println (s ); public static void main (String args ) new A505 (Hello) ; 程序运行结果: A505 Hello,例:子类对象的初始化 class F511 private int ff=100; protected int m; F511() System.out.println (ff=+ff+ m=+m) ; m=ff; int add (int i) return i+m; class S511 extends F511 protected int ss=111

11、; S511 () System.out.println (ss=+ss+ m=+m) ; m*=ss; public class A511 public static void main (String args ) S511 t = new S511 (); /System.out.println (t.ff) ; System.out.println (t.m) ; System.out.println (t.ss) ; ,程序运行结果: ff=100 m=0 ss=111 m=100 11100 111,说明: (1)new S511()启动子类对象初始化,为所有成员变量分配内存空间并

12、初始化为默认值。 (2)在不考虑this或super指定其他构造方法时,子类构造方法首先执行的是父类构造方法的调用,可以认为S511()的首条语句是super(),虽然看不见它。 (3)执行父类构造方法的看不见的首条语句,此时一直向上递归到Object(). (4)执行父类的赋值初始化和任何初始化语句块。 (5)执行父类构造方法的方法体。 (6)执行子类的赋值初始化和任何初始化语句块。 (7)执行子类构造方法的方法体。,4.2类型转换与检测,Java是一种强类型语言,通常情况下,它会在编译期间检查任何类型的兼容性问题。 子类与父类之间存在着继承关系,那么它们之间就会存在类型转换问题。,1.向上

13、转型 子类是父类的一个特例,在特定情况下,需要把子类转型为父类的实例,即向上转型。向上转型是一种安全的转型。,向上转型:即子类对象能够用来替代其父类对象。例: class Chinaman void say() System.out.println(我是中国人); class Wuhanman extends Chinaman void say() System.out.println(我是武汉人); public class A502 public static void main (String args) Chinaman you= new Chinaman (); you. Say (

14、); Chinaman me= new Wuhanman (); me.say (); 我是中国人 我是武汉人,2.向下转型 有时候,也需要把父类转型为子类的实例,即向下转型,这种转型是强制转型,且不一定安全。 例: class Father1 public void fly() System.out.println(Father.fly(); public void say() System.out.println(Father.say(); class Son1 extends Father1 public void say() System.out.println(Son.say();

15、public static void main(String args) Father1 father=new Son1();/向上转型 Son1 son=(Son1)father;/向下转型 son.say(); son.fly(); ,3.自动装包/拆包 在Java语言中,每种基本数据类型都有一个相应的包装类与之对应。 例如:int与Interger相对应 自动装包是指系统能将基本数据类型自动地转换为对应的包装类的实例。 自动拆包是指系统能将一个包装实例自动地转换为与其对应的基本数据类型。,4.类型检测 有时候在程序运行期间需要知道对象变量的类型,这时就需要使用运算符instanceof。

16、 该符号用于在运行期间检查一个引用类型的变量所属类型。 左操作数 instanceof 右操作数 :当左操作数是右操作数给定的实例或者是 其子类的实例时返回真,否则返回假。,4.3 final关键字,子类可以覆盖父类的成员变量及方法,给程序设计带来方便的同时,也会给系统的安全带来威胁。 为此Java语言提供了修饰符final来保证系统的安全。 final的含义是“不可修改”,因此,用它修饰的类或方法是不能改变的,即最终的。,1.final方法 用final修饰的方法称为最终方法,类的某个方法一旦被final限定,则它的子类就不能覆盖此方法。 class Father public final

17、void say() System.out.println(Father.say(); class Son extends Father/编译错误,父类的final方法不被子类覆盖 public void say() System.out.println(Son.say(); ,私有方法被编译器隐式修改为final,即private final void f()和private void f()并无区别。 2.Final 类 用final修饰的类称为最终类。最终类是不能被其他任何类所继承的。除此之外,final类与一般类之间几乎没有差别。 例如:在下面声明的两个类中,类Son将产生编译错误 public final class Father class Son extends Father ,4.4 abstract关键字,用abstract关键字修饰的方法称为抽象方法, 用abstract关键字修饰的类称为抽象类。 抽象方法没有方法体,也没有 ,但有; 例如:abs

温馨提示

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

评论

0/150

提交评论