ch05面向对象编程.pdf

上传人:asd****56 文档编号:70322583 上传时间:2023-01-19 格式:PDF 页数:44 大小:909.99KB
返回 下载 相关 举报
ch05面向对象编程.pdf_第1页
第1页 / 共44页
ch05面向对象编程.pdf_第2页
第2页 / 共44页
点击查看更多>>
资源描述

《ch05面向对象编程.pdf》由会员分享,可在线阅读,更多相关《ch05面向对象编程.pdf(44页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第五章第五章 面向对象编程面向对象编程 Java程序设计 http:/ 余余 烨烨 本章学习提示本章学习提示 本章学习Java语言中面向对象编程的具体实施过程。封装与继承 覆盖与重载 多态 类的强制转换 目目 录录 封装与继承封装与继承 1 2 覆盖与重载覆盖与重载 多态机制多态机制 3 类的转换类的转换 4 封装性封装性 People eat()、sleep()、work()、date()将被描述的实体的属性和行为封装在一起,看作一个不可分割的整体,形成程序中不可分割的独立单位。private:salary、property changeSalary()calcProperty()被封装的某

2、些信息在封装体外是不可见的,只能通过内部的方法来改变它,通常称这些信息被隐藏了。被封装的属性和行为中,规定了有些被隐藏在封装体内,有些外部可见的不同的访问权限。name、sex、height、salary、property 回顾不同的访问权限回顾不同的访问权限 public protected default private 同类同类 同包不同类同包不同类 不同包,子不同包,子类类 不同包,非不同包,非子类子类 封装封装 所谓封装封装表现在以下几个方面 1.在类的定义中设置对对象中的成员变量和方法进行访问的权限。2.提供一个统一供其它类引用的方法 3.其它对象不能直接修改本对象所拥有的属性和方

3、法。封装的作用 通过封装,实现了模块化和信息隐藏,保证了数据的安全性和系统的严密性 封装实现了使用者和设计者的分离,提高了程序的可重用性 类的继承类的继承引例引例 定义一个动物的类,具有高度、重量等特征,具有吃饭、睡觉、呼吸等行为。定义一个鱼类,具有同样的特征和行为。怎么办?怎么办?要重新再写一遍么?要重新再写一遍么?用用继承继承吧!吧!通过关键字通过关键字extends让鱼类继承动物类让鱼类继承动物类 Like mother,like father/用用extends实现类的继承实现类的继承 class Animal protected float height,weight;void ea

4、t()System.out.println(animal eat);void sleep()System.out.println(animal sleep);void breathe()System.out.println(animal breathe);class Fish extends Animal /鱼类继承了鱼类继承了Animal类类 class Integration public static void main(String args)Animal an=new Animal();Fish fh=new Fish();an.breathe();fh.breathe();Exam

5、ple5_01 实实 例例 类的继承类的继承 理解继承是理解面向对象程序设计的关键 Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类)。在Java中,不允许多重继承。class Fish class People class Mermaid extends Fish,People 每个类最多只有一个直接的父类 终止继承关键字关键字final 类的继承类的继承 类之间的继承关系是现实世界中遗传关系的直接模拟,它表示类之间的内在联系以及对属性和操作的共享,即子类可以沿用父类(被继承类)的某些特征。子类也可以具有自己独立的属性和操作。子类

6、从父类继承有两个主要的方面:1.属性的继承属性的继承。例如:鱼可以继承动物的高度、重量等属性。2.方法的继承方法的继承。例如:鱼类可以继承动物吃饭、睡觉、呼吸的行为。属性继承和隐藏:子类不能访问父类的private成员,但子类可以访问其父类的public、protected成员。构造方法的继承构造方法的继承 构造方法的继承应遵守以下原则 1.如果子类没有构造方法,则它继承父类无参数的构造方法作为自己的构造方法;(子类可以无条件的继承父类不含参数的构造方法无条件的继承父类不含参数的构造方法)2.如果子类有构造方法,那么在创建子类对象时,则将先执行继承下来的父类的构造方法,然后再执行自己的构造方法

7、 实实 例例 class Animal float height,weight;Animal()System.out.println(Animal is constructed without parameters);Animal(float height,float weight)System.out.println(Animal is constructed with parameters);void eat()System.out.println(animal eat);void sleep()System.out.println(animal sleep);void breathe()

8、System.out.println(animal breathe);实实 例例 class Fish extends Animal float length;Fish()System.out.println(Fish is constructed without parameters);Fish(float length)System.out.println(Fish is constructed with parameters);class Integration public static void main(String args)Fish fh=new Fish();Fish fh=

9、new Fish(3);super(1,1);Example5_02 目目 录录 封装与继承封装与继承 1 2 覆盖与重载覆盖与重载 多态机制多态机制 3 类的转换类的转换 4 覆覆 盖盖 引例 鱼的呼吸方式跟动物的呼吸方式不一样,鱼使用的是一种吐泡的方法。怎么办?怎么办?解决方法:解决方法:重写鱼的呼吸方法!重写鱼的呼吸方法!方法的覆盖方法的覆盖 class Fish extends Animal /鱼类继承了鱼类继承了Animal类类 void breathe()/重写了动物类的重写了动物类的breathe方法,这种机制方法,这种机制称为称为覆盖覆盖 System.out.println(

10、fish breathe:bubble);class Integration public static void main(String args)Animal an=new Animal();Fish fh=new Fish();an.breathe();fh.breathe();Example5_03 实实 例例 覆盖覆盖(Overriding)在子类中定义一个与父类同名、返回类型、参数类同名、返回类型、参数类型均相同型均相同的方法,称为方法的覆盖(Overriding a method definition)。A derived class inherits methods that

11、belong to the base class.However,if a derived class requires a different definition for an inherited method,the method may be redefined in the derived class.This is called overriding the method definition.覆盖发生在子类与父类之间。方法的重写规则方法的重写规则 两同两小一大 两同:方法名相同,形参列表相同 两小:子类方法返回值类型应比父类方法返回值类型更小或相等;子类方法声明抛出的异常类型应比

12、父类抛出的异常更小或相等 一大:子类方法的访问权限应比父类方法的访问权限大或相等。注意:覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。class BaseClass public static void test()class SubClass extends BaseClass public void test()覆盖覆盖(Overriding)当子类覆盖了父类方法后,子类的对象将无法访问父类中被覆盖的方法。但还可以在子类方法中调用父类中被覆盖的方法。问题:如何在鱼类重写了父类的breathe方法后,又能调用到父类被覆盖了的breathe方法?用用s

13、uper 实实 例例 class Fish extends Animal int height;Fish()System.out.println(Fish Constructed);void breathe()super.breathe();/利用利用super调用父类中被隐藏的方法调用父类中被隐藏的方法 super.height=50;/利用利用super调用父类中被隐藏的变量调用父类中被隐藏的变量 System.out.println(super.height);System.out.println(fish breathe:bubble);class Integration public

14、 static void main(String args)/Animal an=new Animal();Fish fh=new Fish();/an.breathe();fh.breathe();Example5_04 特殊变量super,提供了对父类的访问;可以使用super访问父类被子类隐藏的变量或覆盖的方法;每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。对于父类中包含有参数的构造方法,子类可以通过在自己的构造方法中使用super关键字来引用,而且必须是子类构造方法中的第一条语句。super Example5_05

15、 重载重载 所谓方法的重载方法的重载,是在类中创建了多个方法,这些方法具有相同的名称具有相同的名称,但有不同的参数(类型不同不同的参数(类型不同或参数个数不同)或参数个数不同)和不同的实现不同的实现。在调用方法时依据其参数个数及类型自动选择相匹自动选择相匹配的方法配的方法去执行。达到各种对象处理类似问题时具有统一的接口目的。可以定义多个构造方法,根据类实例初始化时给定的参数列表参数列表决定使用哪一个 重载重载 class Point int px,int py;Point(int a,int b)px=a;py=b;Point(int x,int y)px=x;py=y;void Output

16、()System.out.println(“(”+px+”,”+py+“)”);是否构成重载?是否构成重载?class Point int px,int py;Point(int a,int b)px=a;py=b;Point()void Output()System.out.println(“(”+px+”,”+py+“)”);public static void main(String args)Point pt1=new Point(3,3);Point pt2=new Point();pt1.Output();pt2.Output();重载之例重载之例 Example:定义一个用于计算

17、的类,该类中至少有一个定义一个用于计算的类,该类中至少有一个计算面积的方法计算面积的方法calcArea,可以分别对矩形、,可以分别对矩形、圆、三角形等面积进行计算。圆、三角形等面积进行计算。分别计算边长为分别计算边长为5.0,半径为,半径为5.0及长、高分及长、高分别为别为5.0、10.0的三角形的面积。的三角形的面积。Calculator.java 目目 录录 封装与继承封装与继承 1 2 覆盖与重载覆盖与重载 多态机制多态机制 3 类的转换类的转换 4 多态机制多态机制 引例 class Integration static void fn(Animal an)an.breathe();

18、public static void main(String args)Fish fh=new Fish();Animal an;an=fh;Integration.fn(an);Example5_06 输出什么输出什么 将一个子类对象的引用传给声明为父类的一个对象将一个子类对象的引用传给声明为父类的一个对象变量,如果子类有的方法就调用子类的方法,如果变量,如果子类有的方法就调用子类的方法,如果子类没有的方法就调用父类的方法子类没有的方法就调用父类的方法 多态机制多态机制 多态机制是面向对象程序设计的一个重要特征。通过覆盖父类的方法,在运行时根据传递的对象引用,来调用相应的方法。编译时多态(编

19、译时多态(即:重载即:重载)在编译时刻,根据调用方法传递参数的不同,调用相应的方法 表现为方法名相同,而参数列表不同方法名相同,而参数列表不同。典型:System.out.println();它的参数有很多种。运行时多态运行时多态 在运行时刻,根据传递的对象引用的不同,判断到底是哪个类(父类还是子类的),并调用相应对象的方法 Code-多态多态 class 动物动物 void cry()/do nothing class 狗狗 extends 动物动物 void cry()System.out.println(汪汪汪汪.);class 猫猫 extends 动物动物 void cry()Sys

20、tem.out.println(喵喵喵喵.);public class TestCry public static void main(String args)动物动物 dongwu;dongwu=new 狗狗();dongwu.cry();dongwu=new 猫猫();dongwu.cry();“动态绑定”的思想,即:程序在执行过程中,“动态绑定”的思想,即:程序在执行过程中,根据不同的对象类型(是子类还是超类)自动执根据不同的对象类型(是子类还是超类)自动执行相对应的方法的过程叫做动态绑定。行相对应的方法的过程叫做动态绑定。Test.java 目目 录录 封装与继承封装与继承 1 2 覆

21、盖与重载覆盖与重载 多态机制多态机制 3 类的转换类的转换 4 对象状态的判断对象状态的判断 由于子类对象可以作为父亲类对象使用。那么我们有时需要判断这个对象究竟属于哪个类。Java提供 instanceof 关键字关键字。Animal an=new Animal();Fish fh=new Fish();if(an instanceof Animal)System.out.println(“an is Animals instance);Example5_07 结论:结论:父类不是子类的实例父类不是子类的实例 子类是父类的实例子类是父类的实例 类的转换类的转换 类的转换是指父类对象与子类对象

22、之间在一父类对象与子类对象之间在一定条件下可以转换定条件下可以转换,但类对象的转换须遵守以下原则:1.子类对象可以转换为父类对象(向上转型安全);而父类对象不能转化为子类对象(向下转型危险)2.处于相同层次的类对象不能进行转换 或者说:子类对象可以被看作为父类的一个对象(实例);反之父类对象不能看作为子类的对象(实例)。Code-类的转换类的转换/处理父类与子类的转换 注意转换应遵循的两条原则,例 PointTest.java class Point2D int X,Y;public Point2D()/无参的无参的Point2D构造方法构造方法 X=0;Y=0;System.out.prin

23、tln(Point2D Constructed without Parameter!);public Point2D(int x,int y)/有参的有参的Point2D构造方法构造方法 X=x;Y=y;System.out.println(Point2D Constructed With Parameters!);void offset(int a,int b)/位移位移Point2D X+=a;Y+=b;System.out.println(Point2D Offset to +this.X+this.Y);void show_2d()System.out.println(Point2D

24、position +this.X+this.Y);public class Point3D extends Point2D int X,Y,Z;/定义定义3D自己的自己的X,Y,Z public Point3D(int x,int y,int z)/3D的有参构造函数的有参构造函数 X=x;Y=y;Z=z;System.out.println(Point3D Constructed with Parameters!“+this.X +this.Y+this.Z);public Point3D(Point2D p2d,int z)/由由2D扩展的构造函数扩展的构造函数 X=p2d.X;Y=p2d

25、.Y;Z=z;System.out.println(Point3D Constructed from Point2D and Z!+this.X+this.Y+this.Z);void offset(int a,int b,int c)/3D点的位移点的位移 this.X+=a;this.Y+=b;this.Z+=c;System.out.println(Point3D Offset!/n);void show_3d()System.out.println(Point3D position +this.X+this.Y +this.Z);public class PointTest publi

26、c static void main(String args)Point2D p2d1,p2d2;Point3D p3d1,p3d2;p2d1=new Point2D(2,2);/生成父类对象生成父类对象 p3d1=new Point3D(3,4,5);/生成子类对象生成子类对象 p3d1.show_2d();p3d1.show_3d();p2d2=p3d1;/父类引用指向子类对象父类引用指向子类对象 p2d2.show_2d();/引用父类的成员变量引用父类的成员变量 p2d2.show_3d();/父类不能引用子类的方法父类不能引用子类的方法 /p3d2=(Point3D)p2d1;/强制

27、将父类对象转换为子类对象,系统运行时出错强制将父类对象转换为子类对象,系统运行时出错 TestPoint 面向对象的三大特性面向对象的三大特性 封装封装 (Encapsulation)继承继承 (Inheritance)多态多态 (Polymorphism)面向对象的基本特征面向对象的基本特征 封装性封装性:基本思想:基本思想:把客观世界中联系紧密的元素及其相关操作组织在一起,使其相互作用隐藏、封装在内部,而对外部对象只提供单一的功能接口.目的:目的:将对象的使用者和设计者分开。类比:类比:汽车的左转、右转 继承性继承性 继承是OOP中一种由已有的类创建新类的机制由已有的类创建新类的机制。一个

28、父类(公共属性的集合)可以有多个子类(是父类的特殊化),一个子类只可以有一个父类 子类可以直接使用父类的方法,也可以根据需要修改父类中已经定义的方法(即不改变方法名,而修改方法的参数个数、参数类型)。父类和子类可有同名的方法(多态性)多态性多态性 定义:由于父类和子类可以有同名的方法父类和子类可以有同名的方法,在运行时JVM根据方法的参数个数和类型的不同来查找、决定执行哪个版本的方法,称为多态性多态性.在程序执行时,JVM对对象某一方法的查找是从该对象类所在层次开始,沿类等级逐级向上进行,把第一个方法作为所要执行的方法。所以,子类的方法可以屏蔽父类的方法.本章总结本章总结 本章学习了Java面向对象编程的具体实施过程。封装与继承 覆盖与重载 多态机制 类的强制转换 作业与练习作业与练习 1.什么是类的封装?如何对成员变量和方法的访问权限的设置达到数据封装的目的?2.子类能够继承父类的哪些成员变量和方法?3.多态中的重载与覆盖有什么不同?4.编写一个程序来实现构造方法和其他方法的重载。Class is Dismissed!Class is Dismissed!

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com