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

上传人:sccc 文档编号:5374381 上传时间:2023-07-01 格式:PPT 页数:42 大小:398.01KB
返回 下载 相关 举报
Java语言与面向对象程序设计(第二版)课件第五章.ppt_第1页
第1页 / 共42页
Java语言与面向对象程序设计(第二版)课件第五章.ppt_第2页
第2页 / 共42页
Java语言与面向对象程序设计(第二版)课件第五章.ppt_第3页
第3页 / 共42页
Java语言与面向对象程序设计(第二版)课件第五章.ppt_第4页
第4页 / 共42页
Java语言与面向对象程序设计(第二版)课件第五章.ppt_第5页
第5页 / 共42页
点击查看更多>>
资源描述

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

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

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

3、;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(b.super_sub();输出为:099-1;,b.m_a=100

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

5、t()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=100;System.out.println(b.get();输出为:100,例域的隐藏、方法覆盖、方法重载class Point/父类 int

6、 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)dy);void move(float dx,float dy)/方法的重载 x+=dx;y+=dy;,public class Application1 public static void main(String ar

7、gs)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: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(

8、this);,super对当前对象的父类对象的引用;作用:1)在构造函数定义中用 super(参数列表)调用父类的构造函数;public class apple extends fruits public apple(int price)super(price);2)用super.域名 引用父类的域;例5-5 testSuper.java(第100页)问题:第六行:my200.balance=50是访问的哪一个类的balance?第七行:my200.getBalance()是访问的父类还是子类的函数?访问的是父类还是子类的变量?,class SuperClassint x;.class Sub

9、Class extends SuperClassint y;.,父类对象与子类对象的转换,Public class UseSuperSubSuperClass sc,sc_ref;SubClass sb,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;/对或错?/对,

10、以子类对象作为实际参数访问父类变量;sb_ref=(SubClass)sc_ref;/对或错?/对,父类引用强制转换成子类引用;sb_ref=(SubClass)sc;/对或错?/编译通过,但接着用sb_ref.y则错;,class SuperClass int x;.,class SubClass extends SuperClass int y;.,父类对象与子类对象的转换子类对象可以看作是其父类的对象;父类对象不能被当作是其某一个子类的对象;如果某个方法的形式参数是父类对象,可以使用子类对象作为实际参数;如果父类对象引用指向的实际是子类对象,可以采用强制类型转换将父类对象引用转化成子类对

11、象引用;,引例:函数功能:取绝对值(每一种类型对应一个函数)整数:int i_abs(int 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),指的是一个程序(在同一个类或不同类中)包含多个名称相同、但功能或具体实现不同的方法;主要通过方法的覆盖(不同类)、重载(同一类)实现;,电话卡域:剩余金额方法:拨打电话查询金额,无卡号电话卡域:电话机型号方法:获得

12、电话机型号,有卡号电话卡域:卡号,密码,接入号码,接通方法:登录交换机,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);publi

13、c static 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;(构造函数的互相调用)目的:满足对象的不同初始化需求。,构造函数 继承,子

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

15、ouble a)P110/例5-7 ConstructorOverride.java问题:共调用了几个构造函数?,包 package 包名;例 package A;package A.B;作用:默认的访问规则:在同一程序包中出现的类才可以直接使用它的数据和方法。组织和管理文件的方式:用以存放该包中所有类文件(.Class);,包 的引用,1)使用包名、类名前缀 如:class myApplet extends java.applet.Applet;java.awt.Button btn=new java.awt.Button(“启动”);注:此方式是完整引用形式,但程序书写不简洁;2)加载需要

16、使用的类(以后的程序可采用省略的书写方式)如: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.Button();import java.awt.Button;Button btn=new Button();,CLASSPATH 环境变量作用:指明所有缺

17、省的类字节码文件路径(实验一);(1)通过 autoexec.bat 文件或 DOS 命令设置,如:set CLASSPATH=.;c:jdk1.2lib;c:jdk1.2lib.classes.zip;其中,用“;”号隔开的各部分就是可能的路径。,5.7 接口(interface)定义:用来实现若干特定功能的一组对外接口和规范;属性:只能是常量;方法:只能是抽象方法;目的:实现多重继承;,声明 接口接口的特征:由常量和抽象方法组成的特殊类;语法:public interface 接口名 extends 父接口名列表/常量域声明 public static final 域类型 域名=常量表;/

18、抽象方法声明 public abstract native 返回值 方法名(参数列表)throw 异常列表;,P100:系统接口 DataInput 的定义:public interface java.io.DataInputpublic abstract boolean readBoolean();public abstract byte readByte();public abstract char readChar();public abstract Double readDouble();,P119:ActionListener 定义:public abstract interface

19、 ActionListener extends EventListenerpublic void actionPerformed(ActionEvent e);,接口特点接口与抽象类相似,不能被实例化;接口也具有继承性,可通过 extends 关键字声明它的父接口,并继承父接口的所有属性和方法;与类不同,一个接口可有多个父接口;属性都是用 public 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备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号