JAVA语言与编程第5章继承与多态.ppt

上传人:牧羊曲112 文档编号:6510150 上传时间:2023-11-07 格式:PPT 页数:23 大小:334.47KB
返回 下载 相关 举报
JAVA语言与编程第5章继承与多态.ppt_第1页
第1页 / 共23页
JAVA语言与编程第5章继承与多态.ppt_第2页
第2页 / 共23页
JAVA语言与编程第5章继承与多态.ppt_第3页
第3页 / 共23页
JAVA语言与编程第5章继承与多态.ppt_第4页
第4页 / 共23页
JAVA语言与编程第5章继承与多态.ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《JAVA语言与编程第5章继承与多态.ppt》由会员分享,可在线阅读,更多相关《JAVA语言与编程第5章继承与多态.ppt(23页珍藏版)》请在三一办公上搜索。

1、第5章 继承与多态,5.1 类的继承,类的继承也称为类的派生,是指一个新类可以继承其他现有类的所有成员,包括成员变量和成员方法.子类可以根据需要修改继承自父类的属性和方法,还可以添加新的属性和方法.5.1.1 子类定义1.定义格式:修饰符 子类名 extends 父类名 类体;例:public class MyApplet extends JApplet public class MyApplication extends JFrame public class MyApp2.对象替换原则 对象替换意味着子类对象能够用来替代其父类对象.或者说,父类的句柄能够指向父类的对象,也能够指向子类的对象

2、.例:A502.java,5.1 类的继承(续),3.类继承的基本规则:(1)Java中,Object类是所有类的父类(2)每个子类只能有一个直接父类(3)继承具有传递性(4)继承不能循环5.1.2 super与this 任何对象,一旦被创建,就有了两个默认句柄:关键字super指向父类对象,关键字this指向当前类对象本身.1.在对象创建时使用super和this 对于层次性的继承关系,子类对象创建时,系统将自动调用一系列的构造函数.假设Object类派生出G类,G类派生出F类,F类派生出Me类.构造函数的调用顺序是固定的:总是从Object类开始,沿着继承的顺序,直到new所指定的类的构造

3、函数.(1)如果所有的类都使用默认的构造器,则调用顺序为:Object()-G()-F()-Me()例:Me.java,5.1 类的继承(续),(2)如果父类的构造函数重载了,通过super指定调用哪个父类的构造函数.在子类的构造函数中,指定希望使用的某个父类的构造函数,此时,该语句必须是子类的构造函数的第一个语句,否则会产生编译错误.例:A504.java(3)如果子类自己的构造函数重载了,通过this在一个构造函数中调用另一个构造函数 例:A505.java 注:对于this()的任何调用,如果出现在任何构造函数中,必须是第一个语句2.在变量的隐藏时使用super和this子类的成员变量隐

4、藏父类的成员变量类的局部变量隐藏类的成员变量 例:A506.java3.在消息传递中使用super和this 例:A507.java,5.1 类的继承(续),5.1.3 属性和方法的继承1.属性的继承子类虽然可以继承父类的所有属性和方法,但对于父类的私有属性,子类只能通过父类的共有的方法来访问从父类继承来的属性,在子类被创建时会另外开辟空间来存储,其值为父类中该属性的初始值,但之后双方相同的属性就是彼此独立的了子类可以覆盖父类的属性,即子类中定义了一个与父类同名的属性,且子类也继承了父类的这个属性,那么将有两个同名的属性,使用时根据具体情况决定使用哪一个:1当使用父类的对象时,调用的就是父类的

5、属性 2当子类执行继承自父类的操作时,处理的将是继承自父类的属性 3当子类执行自定义的操作时,处理的就是自定义的属性 例:AttibuteInheritanceTest.java2.方法的继承 方法的继承与属性类似,但方法的继承有覆盖和重载两种情况.其中覆盖与属性的覆盖相同,重载是多态性的体现.例:TestFunctionOverride.java,5.2 类的多态,类的多态性:发生在多个类之间,是指在子类中重写父类中的某些方法,在 程序运行时动态地决定是调用子类的方法还是父类的方法类的多态:发生在一个类上,指在一个类中可以定义多个重名的方法,但它 们的参数个数和类型不同,类的多态体现在方法的

6、重载上5.2.1 成员函数的重载 函数的重载是对同名函数的重新定义,对于这些同名函数,系统会通过参数个数和类型以及函数的返回值类型加以区分,但不能仅仅通过返回值类型的不同来重载函数.例:MethodOverload.java5.2.2 构造函数的重载 对构造函数进行重载是编写类时常用的方法,目的是提供多种初始化对象的能力.使得编程人员可以根据实际需要选择合适的构造函数来初始化对象,5.3 final类和final成员,1.final修饰成员变量 用final修饰的成员变量将成为不能被修改的常量.如果命名常量是一个句柄,仅仅意味着一旦持有某个引用就不得改动,它指向的对象自己的数据却可以变化.例:

7、A513.java2.final修饰成员函数 用final修饰的成员函数将成为不能被子类重载的最终方法.采用final方法的主要目的是提高安全性,使所有人都能够依靠而且必须依靠它来实现特定的功能.final方法不应该去调用非final方法,final方法所依赖的成员变量应该是final或private变量.3.final修饰类 出于安全性考虑,有时需要防止一个类被继承,则可将其声明为final类,final类中的所有方法都隐式的自动成为最终方法,5.4 抽象类和抽象方法,1.抽象类的概念 抽象类,就是不能实例化的类,抽象类的属性和方法都是它的子类的公共属性和方法的集合,如果改变抽象类的属性和方

8、法,必然会改变所有子类的该属性和方法.2.抽象类的作用 提取了所有子类的公共属性和方法,对某些属性或方法仅提供一种形式化的定义,这些属性的初始化或方法的实现要在子类中进行.3.抽象方法 类中没有具体实现的方法为抽象方法,用abstract修饰,若一个类中含有一个或多个抽象方法,该类就是抽象类,也用abstract修饰,但抽象类中可以没有抽象方法.例:AbstractDemo.java,5.5 接口,5.5.1 接口的引入 编程语言最常用的继承方式是多继承,然而多继承实现起来非常复杂,而单继承虽然实现起来简单,却不能很好的描述现实世界.因此引入接口的概念来弥补单继承的不足.接口既拥有多继承的好处

9、,又没有多继承的缺点多继承的缺点全部来源于实现继承.5.5.2 创建接口 接口是定义abstract方法和常量的程序单元,即接口中的方法都是抽象的方法,接口的属性都是常量.接口和类在Java语言中是处于同一级别的.接口定义格式:public interface 接口名 extends 父接口1,父接口2,public static final 数据类型 属性名=值;public abstract native 返回值类型 方法名(形参表)throws 异常;,5.5 接口(续),接口定义的例子:public interface Constants public static final int

10、 ONE=1;public static final int TWO=2;public static final int THREE=3;int getConstants();注:由于接口的属性是public static final修饰的公共常量,因此必须在声明时给定初值.5.5.3 实现接口 一个类要获取某一接口定义的功能,并不是直接继承这个接口中的方法,因为接口中的方法都是没有具体实现的抽象方法.也就是说,接口中定义的仅仅是实现某一特定功能的一组方法的对外接口和规范,而并没有实现这个功能,这个功能的实现是在继承这个接口的类中完成的,要由这些类来具体定义接口中各抽象方法的方法体.因此,在J

11、ava中,对接口功能的继承被称为”实现”.,5.5 接口(续),实现接口时需要注意的几个问题:(1)一个类可以实现多个接口,中间用逗号隔开(2)一个接口可以被多个类实现(3)若实现某接口的类不是abstract修饰的抽象类,则在该类中需要实现该接口的全部方法(包括接口的父接口中的方法),被实现的方法必须和接口中定义的方法具有完全一样的方法名,返回值和形参表.否则,系统就会认为该类没有完成实现的任务.(4)若实现某接口的类是抽象类,则可以不实现接口中的抽象方法,但在这个抽象类的任何一个非抽象的子类中,都必须为它们的父类所实现的接口中的所有抽象方法提供具体实现.(5)被实现的方法的访问控制符必须显

12、式地使用public修饰,因为接口的方法都是public修饰的.例:student.java,5.6 内部类,内部类是定义在某个类的类体或块中的类,内部类中也有成员变量和成员函数.根据内部类定义的位置以及修饰符不同,内部类有很多不同的形式,下面介绍几种特殊的情况.5.6.1 成员类 最直观的一种内部类,就是成员类,它与成员变量的地位相似.如下例:,5.6 内部类(续),class B517 B517()System.out.println(instance of B.);class InnerB/定义内部类 InnerB()System.out.println(Instance of Inne

13、rB.);/class InnerBclass A517/*extends B517*/public static void main(String args)B517 bbb=new B517();/A517 bbb=new A517();B517.InnerB inbbb=bbb.new InnerB();/创建内部类对象/A517.InnerB inbbb=bbb.new InnerB();();inbbb=new B517().new InnerB();/一个语句中使用两个new,5.6 内部类(续),说明:(1)B517定义了一个内部类,编译后,硬盘上多了一个B517$InnerB.

14、class(2)内部类的全名是包名.外部类名.内部类名。声明一个内部类句柄时必须用适当的限定名.在包外用全名,在外包类B517外(比如类A517中)用B517.InnerB.(3)内部类的对象必须在外包类的对象预先存在时才能创建,简洁的写法可以在一个语句中使用两个new关键字;(4)内部类的全名不同于其.class文件名(5)如果A517是B517的子类,它通过继承而拥有了成员类,但不产生相应的.class文件.,5.6 内部类(续),5.6.2 静态成员类 用修饰符static修饰的成员类称为静态成员类.静态成员类与静态成员变量相似,只与外部类相关而不依赖外部类的实例,因此创建一个静态成员类

15、的对象并不需要一个外包类对象的存在.例:class B521 protected static class InnerB/静态成员类class A521 public static void main(String args)/(new B521();B521.InnerB inB=new B521.InnerB();(inB);/(new B521.InnerB();,5.6 内部类(续),注:(1)静态成员类的名字要使用全名,如作为数据类型时是B521.InnerB,作为构造器时是B521.InnerB().(2)静态成员类和非内部类非常相似,可以被public,private,final

16、或abstract修饰,且可以继承任何类和接口(3)静态成员类可以被任何有访问权限的其他类继承,然而继承者没有了静态成员类与其外部类的密切关系,5.6 内部类(续),5.6.3 局部类 在方法体中甚至在其中的代码块中定义的类叫做局部类,局部类与局部变量相似,它是它的外包方法私有的,不能有修饰符,外界不能访问.但局部类和局部变量唯一不同的地方就是:局部类的对象在heap中分配内存.局部类在使用时的特点:1.局部类只能访问外包方法的final局部变量 位于方法内部的局部类,可以访问外包方法之外的类的一切成员,因为外部类完全信任所有内部类.局部类可以访问外包方法的局部变量和参数,但在访问时遇到一个问

17、题,生命周期不同,延长局部变量声明周期的方法是将它变成常量,因此局部变量只能访问外包方法的final局部变量.如下例:,5.6 内部类(续),class B523 private int k=10;public void go(int x,final int y)int a=x+y;final int b=xy;class InB public void foo()(y);/试试k,x,a,b InB here=new InB();here.foo();public class A523 public static void main(String args)new B523().go(1,2

18、);,5.6 内部类(续),(2)局部类由父类句柄持有 局部类本身在外包方法外面是无法使用的,一般而言,外包方法调用结束,则局部类的对象常常因为句柄的失效而成为垃圾.但局部类可以是某个类的子类,当希望局部类的对象能够继续存在时,就可以由父类句柄持有局部类的引用.如下例:,class C524/局部类的父类 void foo()class B524 C524 go(int x,final int y)class InGo extends C524 void foo()(y);/override!/class InGo InGo here=new InGo();here.foo();return

19、here;void gogo(C524 c00)c00.foo();public class A524 public static void main(String args)C524 cccc=new B524().go(1,2);cccc.foo();C524 cc=new B524().go(1,20);new B524().gogo(cc);,5.6 内部类(续),5.6.4 匿名类abstract class C525/局部类的父类 abstract void foo();class B525 public C525 go(int x,final int y)return new C

20、525()/返回什么?public void foo()(y);/是一个语句,要以;结束 public void gogo(C525 c00)c00.foo();,5.6 内部类(续),public class A525 public static void main(String args)C525 cccc=new B525().go(1,2);cccc.foo();C525 cc=new B525().go(1,20);new B525().gogo(cc);new B525().gogo(new C525()/*/public void foo()(Hello););,5.6 内部类(续),1.匿名类的特点:(1)匿名类没有类名,它必须继承一个类或实现一个接口,且不能有显式的extends或implements子句(2)匿名类不能有构造函数,因为它没有类名(3)匿名类只能一次性地创建其对象,并由父类句柄持有(4)匿名类不需要初始化,它只有默认构造器,而通常情况下,匿名类很少需要初始化(5)匿名类既可以在方法体中,又可以在参数列表中.,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号