收藏 分享(赏)

java程序设计之面向对象程序设计基础(下).ppt

上传人:hwpkd79526 文档编号:10024714 上传时间:2019-09-30 格式:PPT 页数:37 大小:120.50KB
下载 相关 举报
java程序设计之面向对象程序设计基础(下).ppt_第1页
第1页 / 共37页
java程序设计之面向对象程序设计基础(下).ppt_第2页
第2页 / 共37页
java程序设计之面向对象程序设计基础(下).ppt_第3页
第3页 / 共37页
java程序设计之面向对象程序设计基础(下).ppt_第4页
第4页 / 共37页
java程序设计之面向对象程序设计基础(下).ppt_第5页
第5页 / 共37页
点击查看更多>>
资源描述

1、面向对象程序设计基础(下),继承extends,继承是一种由已有的类创建新类的机制,是面向对象程序设计的基石之一。 利用继承,程序员可以先创建一个定义共有属性和方法的一般类,再从一般类创建具有特性的新类。 子类继承父类的非私有属性和方法,再定义不同于父类的那些属性和方法: 增加父类中没有的属性和方法。 从新定义父类的属性和方法(变量的隐藏和方法的置换)。 Java要求每个类都有父类。(隐含为java.lang包中的Object类。,继承,继承实际上是存在于面向对象程序的两个类之间的一种关系。 一个父类可以同时拥有多个子类,这时这个父类实际上是所有子类的公共域和公共方法的集合,而每一个子类则是父

2、类的特殊化,是对公共域和方法在功能、内涵方面的扩展和延伸。 this 与 super this是当前对象的一个引用 super是当前对象的直接父类对象的一个引用,类继承树,Object,类,Abstract class,class,final class,class,java单重继承,类继承图,fe51e51,域的继承与扩充,域的继承与隐藏,class D200_Card extends Number_PhoneCard double additoryFee;double balance;boolean performDial() if( balance (0.5 + additoryFee

3、) balance -= (0.5 + additoryFee);return true;elsereturn false; ,定义自己的域 隐藏了父类域,域的继承与隐藏,子类定义的域隐藏了继承下来的同名父类域。 调用从父类继承的方法操作的是从父类继承的域。 在子类中可以指定使用父类属性。 D200_Card my200 = new D200_Card(); my200.balance = 20.0; System.out.println(“父类被隐藏的金额为:” +my200.getBalance(); 0.0 if(my200.performDial()System.out.println

4、(“子类的剩余金额为:” + my200.balance); 19.5,域的继承与隐藏,class D200_Card extends Number_PhoneCard double additoryFee;double balance ;boolean performDial() double getSuperBalance() return super.balance; 访问继承域 System.out.println(“父类被隐藏的金额为:” +my200.getSuperBalance();0.0,方法的继承与覆盖,子类可以定义与父类完全相同的方法,实现对父类方法的覆盖: 完全相同的方

5、法名 完全相同的参数列表。 完全相同类型的返回值 否则就不是方法的覆盖,而是子类自己定义与父类无关的方法,父类的方法未被覆盖,因而仍然存在。 方法的覆盖与域的隐藏的不同之处在于: 子类隐藏父类的域只是使之不可见,父类的同名域在子类对象中仍然占有自己的独立的内存空间; 而子类方法对父类同名方的覆盖将清除父类方法占用的内存,从而使父类方法在子类对象中不复存在。,方法的继承与覆盖,class D200_Card extends Number_PhoneCard double additoryFee;double balance;boolean performDial() if( balance (0

6、.5 + additoryFee ) balance -= (0.5 + additoryFee);return true;else return false;double getBalance() return balance; 访问自己的域,方法的继承与覆盖,PhoneCard类:abstract boolean performDial();double getBalance() Number_PhoneCard类:abstract boolean performDial(); double getBalance() boolean performConnection(long cn,in

7、t pw)D200_Card类:boolean performDial() 覆盖 实现抽象方法double getBalance() 覆盖 返回子类域值boolean performConnection(long cn,int pw),多态,多态是指一个程序中同名的不同方法共存的情况 面向对象程序中多态的情况有: 通过子类对父类方法的覆盖实现多态。 利用重载在同一个类中定义多个同名的不同方法。 利用“重名”现象提高程序的抽象度和简洁性。,多态实现方法的覆盖,PhoneCard类有一个各子类共有的方法:abstract boolean performDial(); 这个方法代表的相同功能(拨打电

8、话),但在不同种类的电话卡中,其具体实现是不同的。不同的子类可以重新定义 该方法。 但是所有的类中,凡是实现拨打电话这种功能的方法,尽管内容不同,却共享相同的名字performDial 在覆盖多态中,由于同名的不同方法是属于不同的类,所以只需在调用方法时指明是哪个类的方法即可区分题目(类名.方法名)。,多态实现方法的重载,是同一类中定义同名方法的情况。 这些方法同名的原因,是因为它们的最终功能和目的都相同,但由于在完成同一功能时,可能遇到不同的具体情况,所以需要定义含不同的具体内容的方法。 同名不同方法是靠不同形式的参数列表(包括形式参数的个数、类型、顺序的不同)来区分。 例:200卡拨打电话

9、 my200.performDial(12345678,1234) my200.performDial(),fe55e55,多态实现方法的重载,Integer类: String toString() static String toString(int i) static String toString(int i , int radix) Double 类: String toString() static String toString(double d) 覆盖了Object类的toString()方法System.out.println(),ff1,构造函数的重载,构造函数的重载是指同一

10、个类中存在着若干个具有不同参数列表的构造函数。 D200_Card() /没有形式参数的构造函数 D200_Card(long cn) /有一个参数的构造函数 cardNumber = cn; /初始化电话卡号 D200_Card(long cn,int pw ) /有两个参数的构造函数 cardNumber = cn; /初始化电话卡号和密码password = pw; ,构造函数的重载,D200_Card(long cn,int pw,double b) /三个参数的构造函数 cardNumber = cn; /初始化卡号、密码和金额password = pw;balance = b; D

11、200_Card(long cn,int pw,double b,String c) /四个参数的构造函数cardNumber = cn; /初始化卡号、密码password = pw; /金额和接入号码balance = b;connectNumber = c; ,调用不同的构造函数,D200_Card my200 = new D200_Card ( ) ; D200_Card my200 = new D200_Card ( 12345678,1234) ; D200_Card my200 = new D200_Card ( 12345678,1234,50.0) ;,构造函数之间调用,D2

12、00_Card(long cn) cardNumber = cn; D200_Card(long cn,int pw ) this(cn); password = pw; D200_Card(long cn,int pw,double b) this(cn,pw);balance = b; D200_Card(long cn,int pw,double b,String c) this(cn,pw,b);connectNumber = c; ,构造函数的继承,子类无构造函数无条件继承父类的无参数构造函数。 子类有构造函数在创建新对象时,先执行父类无参数构造函数,再执行自己的构造函数。 若父类有

13、带参数的构造函数,子类可在自己的构造函数中使用super关键字来调用它,而不再执行父类的无参数构造函数。 super()调用语句必须是子类构造函数中的第一个可执行语句。,ff2test,接口,接口中的属性都是常量,接口中的方法都是没有方法体的抽象方法。 接口定义的仅仅是实现某一特定功能的一组功能的对外接口和规范,而并没有真正地实现这个功能。 接口的功能实现是在“继承”了这个接口的各个类中完成的,由这些类来具体定义接口中各抽象方法的方法体。 通常把对接口的“继承”称为“实现”。,接口的实现,Object,类,Abstract class,class,final class,接口,class,ja

14、va单重继承,继承,实现,接口的作用,java程序中的类层次结构是树状结构,这种树状结构在处理某些复杂问题时会显得力不从心。 随着类结构树的生长,越是处在下层的子类,它的间接父类越多,所继承的方法也会越来越多,造成子类成员的膨胀、庞杂,难以管理和掌握。 接口在保持单继承的前提下,使Java程序的类层次结构更加合理,更符合实际情况。 编程者可以把用于完成特定功能的若干属性和方法组织成相对独立的集合体接口。凡是需要实现这种特定功能的类,都可以实现这个接口。,接口的定义,public interface 接口名 extends 父接口名列表 / 常量域声明public static final 域类

15、型 域名 = 常量值;/ 抽象方法声明public abstract 返回值类型 方法名( 参数列表 ) ; 接口是由常量和抽象方法组成的特殊类。 一个类只能有一个父类,但是它可以同时实现若干个接口。如果把接口理解成特殊的类,那么这个类利用接口实际上就获得了多个父类,即实现了多重继承。,系统定义的接口,public interface ActionListener extends EventListener public abstract void actionPerformed(ActionEvent e); 该接口代表了监听并处理动作事件的功能,它包含了一个抽象方法 actionPerfo

16、rmed 所有希望能够处理动作事件(如单击按钮、在文本框中回车等)的类都必须具有ActionListener接口定义的功能,也就是要实现这个接口,,接口的实现,import java.applet.*; import java.awt.*; import java.awt.event.*; public class e57 extends Applet implements ActionListener TextField password = new TextField(“我是密码 “);Button btn = new Button(“隐藏“);public void init() add

17、(password);add(btn);btn.addActionListener(this); public void actionPerformed(ActionEvent e) password.setEchoChar(*);password.selectAll(); ,fe57,接口的实现,类定义中使用 implements 指定实现某一接口 类中必须具体实现该 interface 中定义的抽象方法。 实现的方法必须指定为public限定符。 即使不需要实现某方法,也要定义成一个空方法体的方法。Public 方法名() ,内层类(inner class),在某个类的内部定义的类称之内层

18、类。 内层类的定义方法 定义命名的内层类:可以在类中(甚至方法中)定义内层类,并可在外层类中使用多次,创建多个对象。 定义匿名内层类(一次性类):可以在new关键字后定义内层类,以立即创建一个对象 内层类的类文件命名方法 设外层类名为Myclass) Myclass$c1.class (c1 为命名内层类名) Myclass$1.class (表示类中定义的第一个匿名内层类),类中的内层类,外层类如同使用其他类一样使用内层类 内层类拥有对在外层类中定义的所有属性和方法的访问权。 其他类使用一个类的内层类时,要使用类前缀。 Parcel2 q = new Parcel2(); Parcel2.C

19、ontents c = q.cont();,ff3Parcel2,类中的内层类,一般类只能是public和非public,而内层类可以指定为 private 和 protected。 如果内层类为private,只有外层类可以使用它。 如果内层类为protected,只有外层类、与外层类处于同一包中的类、以及外层类的子类可以访问它。 内层类可以实现接口及抽象类中的抽象方法。 外层类可以将上述实现细节、乃至内层类都隐藏起来,给外界提供一个指向基类及接口的处理句柄。(upcast),ff3Parcel3,方法中的内层类,内层类还可以定义在一个方法里,其作用域仅限于该方法的范围内(进一步隐藏),在其

20、它方法里定义也没有名字冲突问题。 实现一个接口,但只返回一个句柄 在一编写好的代码中加一个类,但又不想公开化。,ff3Parcel4,条件分支中的内层类,在条件分支中的内部类并不表示有条件的建立,同其他类一样,在编译时就一道解决了,内部类只是限定它的作用域(在条件分支中使用)。if (e) 类定义,ff3Parcel5,实现接口的无名内层类,return new Contents() /调用隐含构造函数private int i = 11; public int value() return i; ; /分号表示表达式的结束 该语句将返回值同表示返回值类型的类定义结合在一起。它相当于: cla

21、ss MyContents implements Contents private int i = 11; public int value() return i; return new MyContents();,ff3Parcel6,继承基类的无名内层类,无名类没有构造函数,所以一般调用父类的构造函数。 public Wrapping wrap(int x) / 方法定义return new Wrapping(x) / 调用基类构造函数public int value() / 方法重载return super.value() * 47; ,ff3Parcel7,有名内层类例,public

22、class Frame1 extends DecoratedFrame private void jbInit() throws Exception button1.addActionListener(new Button1Adapter(); /end of jbinit() methodclass Button1Adapter implement ActionListener public void actionPerformed(ActionEvent e) . / end of Button1Adapter class / end of Frame1 class,匿名内层类例,匿名类可实例化一个接口(使用接口创建对象的另一途径是创建实现该接口的一个类定义,然后使用类来创建一个对象)。button1.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) button1_actionPerformed(e); /访问外层类方法 );void button1_actionPerformed(ActionEvent e) - 将事件处理程序单独划出编写。,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报