java第五章继承、多态、重载与接口.ppt
《java第五章继承、多态、重载与接口.ppt》由会员分享,可在线阅读,更多相关《java第五章继承、多态、重载与接口.ppt(167页珍藏版)》请在三一办公上搜索。
1、第五章 继承、多态、重载与接口,2,主要内容,Java的继承Java的多态Java的覆盖Java 的重载构造方法的重载与继承内部类与匿名类接口,3,继承的概念,继承是存在于面向对象程序中的两个类之间的一种关系当一个类获取另一个类中所有非私有数据和操作的定义作为自己的部分或全部成分时,就称这两个类之间具有继承关系被继承的类称为父类或超类,继承了父类或超类的所有数据和操作的类称为子类一个父类可以同时拥有多个子类父类实际上是所有子类的公共域和公共方法的集合每一个子类则是父类的特殊化,是对公共域和方法在功能、内涵方面的扩展和延伸,Java的继承,4,继承的概念,各种电话卡类及其间的继承关系,Java的
2、继承,5,单重继承与多重继承,单重继承指任何一个类都只有一个单一的父类多重继承是指一个类可以有一个以上的父类,它的数据属性和操作从所有这些父类中继承单重继承的程序结构比较简单,支持多重继承的程序,其结构则是复杂的网状,设计、实现都比较复杂C+是开发人员熟悉的支持多重继承的面向对象的编程语言,Java语言出于安全、可靠性的考虑,仅支持单重继承,Java的继承,6,Java的派生子类,Java中的继承是通过extends关键字来实现的,在定义类时使用extends关键字指明新定义类的父类,就在两个类之间建立了继承关系定义形式class SubClass extends SuperClass 如果没
3、有extends子句,则该类默认为的子类所以,Java中,所有的类都是通过直接或间接地继承得到的新定义的类称为子类,它可以从父类那里继承所有非private的属性和方法作为自己的成员,Java的继承,7,Java的派生子类,继承关系在UML图中,是用一个箭头来表示子类与父类的关系的类Student从类Person继承,定义如下class Student extends Person/,Java的继承,8,派生子类实现电话卡类的继承结构,1:abstract class PhoneCard2:3:double balance;4:5:abstract boolean performDial();
4、6:double getBalance()7:return balance;10:11:abstract class None-Number-PhoneCard extends PhoneCard12:13:String phoneSetType;14:15:String getSetType()16:17:return phoneSetType;18:19:,Java的继承,9,派生子类实现电话卡类的继承结构,20:abstract class Number-PhoneCard extends PhoneCard21:22:long cardNumber;23:int password;24
5、:String connectNumber;25:boolean connected;26:27:boolean performConnection(long cn,int pw)28:29:if(cn=cardNumber 36:37:,Java的继承,10,派生子类实现电话卡类的继承结构,38:class magCard extends None-Number-PhoneCard39:40:String usefulArea;41:42:boolean performDial()43:44:if(balance 0.9)45:46:balance-=0.9;47:return true;4
6、8:49:else50:return false;51:52:,Java的继承,11,派生子类实现电话卡类的继承结构,53:class IC-Card extends None-Number-PhoneCard54:55:boolean performDial()56:57:if(balance 0.5)58:59:balance-=0.9;60:return true;61:62:else63:return false;64:65:,Java的继承,12,派生子类实现电话卡类的继承结构,66:class IP-Card extends Number-PhoneCard67:68:Date e
7、xpireDate;69:boolean performDial()70:71:if(balance 0.3 78:79:,Java的继承,13,派生子类实现电话卡类的继承结构,80:class D200-Card extends Number-PhoneCard81:82:double additoryFee;83:84:boolean performDial()85:86:if(balance(0.5+additoryFee)87:88:balance-=(0.5+additoryFee);89:return true;90:91:else92:return false;93:94:,Ja
8、va的继承,14,派生子类实现电话卡类的继承结构说明,代码定义了七个类None-Number-PhoneCard类和Number-PhoneCard类是PhoneCard类派生出的子类magCard类和IC-Card类是None-Number-PhoneCard类派生出的子类IP-Card类和D200-Card类是Number-PhoneCard类派生出的子类程序中只有在第3句(PhoneCard类中)定义了域balance但在第44,46(magCard类中),第57,59(IC-Card类中),第71,73(IP-Card类中),第86,88(D200-Card类中)句中都使用了balan
9、ce域它们自身并未定义balance域,使用的balance都是从父类PhoneCard那里继承来的,Java的继承,15,派生子类实现电话卡类的继承结构说明,PhoneCard类在第5句定义了一个抽象方法performDial()它的两个子类也是抽象类,可以不实现这个抽象方法,分别派生出来的4个电话卡类不是抽象类故而分别定义了针对自己具体情况的performDial()方法第68句使用一个java.util包中的Java系统类Date,每个Date类的对象代表一个具体的日期第71句中new Date()表达式的作用是创建一个包含当前日期的Date类的对象after()方法是Date类的方法,
10、在失效日期比当前日期晚时,expireDate.after(new Date()返回true,否则返回false,Java的继承,16,域的继承,子类可以继承父类的所有非私有域,例如各类电话卡类所包含的域分别为 PhoneCard类:double balance;None-Number-PhoneCard类:double balance;/继承自父类PhoneCard String phoneSetType;Number-PhoneCard类:double balance;/继承自父类PhoneCard long cardNumber;int password;String connectNu
11、mber;boolean connect;magCard类:double balance;/继承自父类None-Number-PhoneCard String phoneSetType;/继承自父类None-Number-PhoneCard String usefulArea;,Java的继承,17,域的隐藏,子类重新定义一个与从父类那里继承来的域变量完全相同的变量,称为域的隐藏,80:class D200-Card extends Number-PhoneCard81:82:double additoryFee;83:double balance;84:boolean performDial
12、()85:86:if(balance(0.5+additoryFee)87:88:balance-=(0.5+additoryFee);89:return true;90:91:else92:return false;93:94:,Java的继承,18,域的隐藏,第83句增加定义了一个与从父类那里继承来的balance变量完全相同的变量后,D200-Card类中的域变为D200-Card类 double balance;/继承自父类Number-PhoneCard double balance;/D200-Card类自己定义的域 long cardNumber;/继承自父类Number-Pho
13、neCard int password;/继承自父类Number-PhoneCard String connectNumber;/继承自父类Number-PhoneCard boolean connect;/继承自父类Number-PhoneCard double additoryFee;,Java的继承,域的隐藏,子类中定义了与父类同名的属性变量,即出现了子类变量对同名父类变量的隐藏所谓隐藏是指子类拥有了两个相同名字的变量,一个继承自父类,另一个由自己定义当子类执行继承自父类的操作时,处理的是继承自父类的变量,而当子类执行它自己定义的方法时,所操作的就是它自己定义的变量,而把继承自父类的变量
14、“隐藏”起来,20,域的隐藏举例,TestHiddenField.java,1:public class TestHiddenField2:3:public static void main(String args)4:5:D200-Card my200=new D200-Card();6:my200.balance=50.0;7:System.out.println(父类被隐藏的金额为:+my200.getBalance();8:if(my200.performDial()9:System.out.println(子类的剩余金额为:+my200.balance);10:11:12:abstr
15、act class PhoneCard13:14:double balance;,Java的继承,21,域的隐藏举例,TestHiddenField.java,15:16:abstract boolean performDial();17:double getBalance()18:19:return balance;20:21:22:abstract class Number-PhoneCard extends PhoneCard23:24:long cardNumber;25:int password;26:String connectNumber;27:boolean connected
16、;28:,Java的继承,22,域的隐藏举例,TestHiddenField.java,29:boolean performConnection(long cn,int pw)30:31:if(cn=cardNumber,Java的继承,23,域的隐藏举例,TestHiddenField.java,44:45:boolean performDial()46:47:if(balance(0.5+additoryFee)48:49:balance-=(0.5+additoryFee);50:return true;51:52:else53:return false;54:55:,Java的继承,2
17、4,域的隐藏举例,TestHiddenField.java显示结果,Java的继承,25,域的隐藏举例,TestHiddenField.java代码说明第5句创建了一个D200-Card类的对象my200,这个对象有两个balance变量,一个继承自父类PhoneCard,另一个是在第43句中重新定义的自身的balance变量第6句为my200对象的balance变量赋值,根据域隐藏的原则,这里是为my200自身的balance变量赋值第7句输出my200对象的getBalance()方法的返回值,这里的getBalance()方法是在父类PhoneCard中定义的,它返回的是my200对象继
18、承自父类PhoneCard的balance变量的数值,这个balance没有被赋值,其数值是缺省的0.0第8句调用my200对象的performDial()方法拨打电话,修改my200对象自身的balance变量。第9句输出拨打电话之后,my200对象的balance变量的数值,Java的继承,26,方法的继承,父类的非私有方法可以被子类所继承,各种电话卡所包含方法如下 PhoneCard类:abstract boolean performDial();double getBalance()None-Number-PhoneCard类:abstract boolean performDial(
19、);/继承自父类PhoneCard double getBalance()/继承自父类PhoneCard String getSetType()Number-PhoneCard类:abstract boolean performDial();/继承自父类PhoneCard double getBalance()/继承自父类PhoneCard boolean performConnection(long cn,int pw)magCard类:double getBalance()/继承自父类None-Number-PhoneCard String getSetType()/继承自父类None-N
20、umber-PhoneCard boolean performDial(),Java的继承,27,方法的继承,根据方法的继承关系,各种电话卡所包含方法如下 IC-Card类:double getBalance()/继承自父类None-Number-PhoneCard String getSetType()/继承自父类None-Number-PhoneCard boolean performDial()IP-Card类:boolean performDial()double getBalance()/继承自父类Number-PhoneCard boolean performConnection(
21、long cn,int pw)D200-Card类:boolean performDial()double getBalance()/继承自父类Number-PhoneCard boolean performConnection(long cn,int pw),Java的继承,28,this与super,this和super是常用来指代子类对象和父类对象的关键字Java系统默认,每个类都缺省地具有null,this和super三个域,所以在任意类中都可以不加说明而直接使用它们其中null代表“空”,代表一个什么也没有的“空”值在定义一个对象但尚未为其开辟内存单元时可以指定这个对象为nullth
22、is和super两个域则与继承有密切关系,Java的继承,29,this,在方法及构造方法中,使用this来访问域及方法this表示当前对象的一个引用对象的引用可以理解为对象的另一个名字利用this可以调用当前对象的方法或使用当前对象的域,如 double getBalance()return this.balance;表示返回的是当前同一个对象的balance域,当然在这种情况下this也可以不加更多的情况下,this用来把当前对象的引用作为参数传递给其他的对象或方法,Java的继承,30,this,使用this还可以解决局部变量(方法中的变量)或参数变量与域变量同名的问题。如,在构造方法中
23、,经常这样用:Person(int age,String name)this.age=age;this.name=name;这里,this.age表示域变量,而age表示的是参数变量,Java的继承,31,this,构造方法中还可以用this来调用另一构造方法,如Person()this(0,);如果在构造方法中调用另一构造方法,则这条调用语句必须放在第一句,Java的继承,32,This举例:getDouble.java,1:package p1;2:import java.applet.*;3:import java.awt.*;4:import java.awt.event.*;5:pu
24、blic class getDouble extends Applet implements ActionListener6:7:Label prompt;8:TextField input;9:double d=0.0;10:11:public void init()12:13:prompt=new Label(请输入一个浮点数:);14:input=new TextField(10);15:add(prompt);16:add(input);17:input.addActionListener(this);18:,Java的继承,33,this,getDouble.java,19:publ
25、ic void paint(Graphics g)20:21:g.drawString(你输入了数据:+d,10,50);22:23:public void actionPerformed(ActionEvent e)24:25:d=Double.valueOf(input.getText().doubleValue();26:repaint();27:28:,Java的继承,34,this,getDouble.java说明 第17句调用的addActionListener()方法是系统类TextField的方法,调用这个方法要求提供一个实现了ActionListener接口的对象作为实际参数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 第五 继承 多态 重载 接口

链接地址:https://www.31ppt.com/p-5575457.html