Java语言与面向对象程序设计(第二版)课件第五章.ppt

上传人:本田雅阁 文档编号:2145552 上传时间:2019-02-21 格式:PPT 页数:42 大小:398.01KB
返回 下载 相关 举报
Java语言与面向对象程序设计(第二版)课件第五章.ppt_第1页
第1页 / 共42页
Java语言与面向对象程序设计(第二版)课件第五章.ppt_第2页
第2页 / 共42页
Java语言与面向对象程序设计(第二版)课件第五章.ppt_第3页
第3页 / 共42页
亲,该文档总共42页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Java语言与面向对象程序设计(第二版)课件第五章.ppt》由会员分享,可在线阅读,更多相关《Java语言与面向对象程序设计(第二版)课件第五章.ppt(42页珍藏版)》请在三一文库上搜索。

1、第 5 章 继承与多态,主要内容: 继承 多态 接口和包,继 承,继承:子类利用父类中定义的方法和变量就像它们属于子类本身一样; (包括父类的私有属性、私有方法,但不可见); 单重继承:一个类只能有一个父类(Java、C#、VC+); 多重继承:一个类可以有多个父类(标准C+);,图 5-1 各种电话卡类及其间继承关系,继承的 优点、目的,优点:更有效地组织程序结构,明确类间关系; 目的:使程序结构清晰,提高开发效率,降低编码和维护工作量。,派 生 子 类,例5-1PhoneCard 类及其派生子类 abstract class PhoneCard abstract class None_Nu

2、mber_PhoneCard extends PnoneCard abstract class Number_PhoneCard extends PnoneCard 问题:第二行、第三行的类为什么是抽象类,能否去掉 abstract 关键字?,域 的 继 承,子类继承(拥用)父类的所有非私有(P9192页各类拥有的域);,域 的 隐 藏,子类重新定义一个从父类继承来的域变量(可以具有不同类型),称为域的隐藏(指新定义的域变量隐藏了父类的同名变量)。 举例:例5-2的简化版;,abstract class A double m_a; abstract double sub(); double g

3、et() return m_a; class B extends A double m_a; double sub() m_a -=1; return m_a; double super_sub() super.m_a -=1; return super.m_a; ,public class Application1 public static void main(String args) B b = new B(); b.m_a = 100; System.out.println(b.get(); System.out.println(b.sub(); System.out.println(

4、b.super_sub(); 输出为: 0 99 -1;,b.m_a = 100; b.get() b.sub() b.super_sub(),问题:以下程序访问的是父类还是子类?,要点: 1)被隐藏的父类域在子类对象中仍占有独立的内存空间; 2)子类可通过 super 关键字或继承自父类的方法访问或处理继承自父类的域。,方法的 继承 与 覆盖,继承:子类可继承父类的所有非私有方法; 覆盖(Override):子类重新定义与父类同名的方法(指非静态方法,要求方法名、返回值和参数列表完全相同); 如果子类的非抽象方法覆盖了父类的抽象方法,称子类“实现”了父类的抽象方法。,abstract cla

5、ss A double m_a; abstract double sub(); double get() return m_a; class B extends A double m_a; double sub() m_a -=1; return m_a; double super_sub() super.m_a -=1; return super.m_a; double get() return m_a; ,/测试 public class Application1 public static void main (String args) B b = new B(); b.m_a = 10

6、0; System.out.println(b.get(); 输出为:100,例域的隐藏、方法覆盖、方法重载 class Point / 父类 int x = 0, y = 0 ; void move(int dx, int dy) x += dx ; y += dy ; class RealPoint extends Point / 子类 float x = 0.0f, y = 0.0f ; / 域的隐藏 void move(int dx, int dy) / 方法的覆盖 System.out.println(“subclasss move“); move(float)dx, (float)

7、dy); void move(float dx, float dy) / 方法的重载 x += dx; y += dy; ,public class Application1 public static void main(String args) RealPoint rp = new RealPoint(); System.out.println(“x:“ + rp.x + “ y:“ + rp.y); rp.move(1,1); System.out.println(“x:“ + rp.x + “ y:“ + rp.y); 输出: x:0.0 y:0.0 subclasss move x:

8、1.0 y:1.0,this,对当前对象的引用; 作用:1)调用当前对象的方法或域; 如:class Point int x = 0, y = 0 ; void move(int x, int y) this.x += x ; this.y += y ; 2)作为参数传递给其他对象或方法 如: input . addActionListener ( this ) ;,super 对当前对象的父类对象的引用; 作用:1)在构造函数定义中用 super(参数列表) 调用父类的构造函数; public class apple extends fruits public apple(int price

9、) super(price); 2)用super . 域名 引用父类的域; 例5-5 testSuper.java(第100页) 问题:第六行:my200.balance = 50是访问的哪一个类的balance? 第七行:my200.getBalance()是访问的父类还是子类的函数?访问的是父类还是子类的变量?,class SuperClass int x; . class SubClass extends SuperClass int y; . ,父类对象与子类对象的转换,Public class UseSuperSub SuperClass sc,sc_ref; SubClass sb

10、,sb_ref; sc = new SuperClass(); sb = new SubClass(); sc_ref = sb; / 对还是错? / 父类引用可以指向子类对象; sb_ref = sc; / 对还是错? / 错,子类对象不能赋给父类引用;,class SuperClass int x; . ,class SubClass extends SuperClass int y; . ,int a = sc_ref.x; / 对或错? / 对,以子类对象作为实际参数访问父类变量; sb_ref = (SubClass) sc_ref;/对或错? / 对,父类引用强制转换成子类引用;

11、sb_ref = (SubClass)sc; / 对或错? / 编译通过,但接着用sb_ref.y则错; ,class SuperClass int x; . ,class SubClass extends SuperClass int y; . ,父类对象与子类对象的转换 子类对象可以看作是其父类的对象; 父类对象不能被当作是其某一个子类的对象; 如果某个方法的形式参数是父类对象,可以使用子类对象作为实际参数; 如果父类对象引用指向的实际是子类对象,可以采用强制类型转换将父类对象引用转化成子类对象引用;,引例: 函数功能:取绝对值(每一种类型对应一个函数) 整数: int i_abs(int

12、 i); 单精度: float f_abs(float f); 双精度: double d_abs(double d); 面向对象: Math.abs( int i ); Math.abs( float f ); Math.abs( double d );,多态 ( polymophism ),多态 ( polymophism ),指的是一个程序(在同一个类或不同类中)包含多个名称相同、但功能或具体实现不同的方法; 主要通过方法的覆盖(不同类)、重载(同一类)实现;,电话卡 域:剩余金额 方法:拨打电话 查询金额,无卡号电话卡 域:电话机型号 方法:获得 电话机型号,有卡号电话卡 域:卡号,密

13、码, 接入号码,接通 方法:登录交换机,IP 卡 域:有效时间 方法:拨打电话,200 卡 域:附加费用 方法:拨打电话 修改密码,电话 IC 卡 方法:拨打电话,电话磁卡 域:使用地域 方法:拨打电话,继承,继承,继承,继承,继承,继承,拨打电话函数在各子类中得到覆盖,同一个类中定义多个同名的方法(条件:形式参数个数、类型和顺序不同); public class MyClass public static int abs(int p) return Math.abs(p); public static long abs(long p) return Math.abs(p); public s

14、tatic double abs(double p) return Math.abs(p); ,重载(overload),优点: 1)提高程序的简洁性; 2)通过接口操纵对象; P104/例5-6TestOverride.java 问题:这个例子是重载还是覆盖?在哪两个函数体现? P51 / boolean performDial() P63/ boolean performDial(long cn, int pass),构造函数 重载,同一类中存在多个具有不同参数列表的构造函数; 例:P107;(参数的数目、类型、顺序不同) 例:P108;(构造函数的互相调用) 目的:满足对象的不同初始化需

15、求。,构造函数 继承,子类构造函数总是先调用父类的构造函数; 原则: 子类继承父类无参构造函数; 子类未显式地调用父类的构造函数,实则先调用父类的无参数构造函数; 子类显示调用父类的带参数构造函数(第一句);,设计总结 不定义构造函数(缺省构造函数); 定义构造函数,并调用父类的带参构造函数; D200_Card( long cn, int pass, double b, double a) super(cn, pass, b);/必须是第一句 additoryFee = a; ,重载,实现多层次对象初始化; D200_Card( long cn, int pass, double a) D2

16、00_Card( long cn, int pass, double b, double a) P110/例5-7 ConstructorOverride.java问题:共调用了几个构造函数?,包 package 包名; 例 package A ; package A.B ; 作用: 默认的访问规则:在同一程序包中出现的类才可以直接使用它的数据和方法。 组织和管理文件的方式:用以存放该包中所有类文件(. Class);,包 的引用,1) 使用包名、类名前缀 如:class myApplet extends java.applet.Applet; java.awt.Button btn = ne

17、w java.awt.Button(“启动”) ; 注:此方式是完整引用形式,但程序书写不简洁; 2) 加载需要使用的类(以后的程序可采用省略的书写方式) 如: import java.applet.Applet; class myApplet extends Applet;,3) 加载整个包 如: import java . applet .* ; 假设有两个类:java.awt.Button、 java.sw.Button; java.awt.Button btn = new java.awt.Button() ; java.sw.Button btn = new java.sw.Butt

18、on() ; import java.awt.Button; Button btn = new Button() ;,CLASSPATH 环境变量 作用:指明所有缺省的类字节码文件路径(实验一); (1)通过 autoexec.bat 文件或 DOS 命令设置,如: set CLASSPATH= . ; c:jdk1.2lib ; c:jdk1.2lib.classes.zip ; 其中,用“;”号隔开的各部分就是可能的路径。,5.7 接口(interface) 定义:用来实现若干特定功能的一组对外接口和规范; 属性:只能是常量; 方法:只能是抽象方法; 目的:实现多重继承;,声明 接口 接口

19、的特征:由常量和抽象方法组成的特殊类; 语法: public interface 接口名 extends 父接口名列表 / 常量域声明 public static final 域类型 域名 = 常量表; / 抽象方法声明 public abstract native 返回值 方法名(参数列表)throw 异常列表;,P100:系统接口 DataInput 的定义: public interface java.io.DataInput public abstract boolean readBoolean ( ); public abstract byte readByte ( ); publi

20、c abstract char readChar ( ); public abstract Double readDouble ( ); ,P119:ActionListener 定义: public abstract interface ActionListener extends EventListener public void actionPerformed (ActionEvent e); ,接口特点 接口与抽象类相似,不能被实例化; 接口也具有继承性,可通过 extends 关键字声明它的父接口,并继承父接口的所有属性和方法; 与类不同,一个接口可有多个父接口; 属性都是用 pub

21、lic final static 修饰的常量; 方法都是用 public abstract 修饰的抽象方法; 方法体也可以用非 Java 语言书写(由 native 修饰);,实现接口 注意事项: 在类的声明部分,要用 implements 关键字声明要实现的接口列表; 在实现接口时,必须使用完全相同的方法头; 在实现接口时,必须显式使用 public 修饰符;,interface Stack void push(object x); object pop();,class A extends Applet implements Stack void push(object x) ;/具体内容 object pop() ;/具体内容 ,小 结,域 的 隐 藏 方法的 继承 与 覆盖 关键字:this、super 重点:父类对象与子类对象的转换 多态、重载 包的作用 接口的继承、实现,练习: P121 / 5-3、5-12,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1