《Java面向对象程序设计》由会员分享,可在线阅读,更多相关《Java面向对象程序设计(46页珍藏版)》请在金锄头文库上搜索。
1、第6章 Java面向对象程序设计面向对象程序设计的基本概念 封装 继承 多态 内部类 包的使用工作场景了解了蛋糕店的基本业务数据和处理后,现 在要分析蛋糕店相关业务对象和各种实际 操作。WF蛋糕店每天都能烤出各种各样的 蛋糕,有意氏蛋糕、巧克力蛋糕、冰淇淋 蛋糕、奶油水果蛋糕等,每种蛋糕无论从 味道、编号、价格、重量等都有各不相同 ,比如巧克力蛋糕的编号是B01,价格为每 磅40元;巧克力蛋糕的重量级别为13磅不 等。 6.2 面向对象程序设计的基 本概念面向对象分析的思想是根据人们研究 的现实世界中复杂的对象是如何由许多小 的、简单的对象组成的原理建立的,并认 为不同的物体有共性,共性存在于
2、个性之 中,相互之间存在各种各样的联系,这种 联系导致物体状态的变化。面向对象程序设计(OOP)是以对象 和类为基础,由单个能够起到子程序作用 的单元或对象组合而成。 它的核心有 :封装 、继承性、多态性。对象有两个层次的概念:现实生活中对象指的是要研究的任何事物, 即客观世界的实体;系统中对象是基本的运行实体,并把属性和 行为封装为一个整体。它包括属性和方法 。其中属性表明对象的状态,方法表明对 象所具有的行为。现实世界里有很多对象,如学生、空调、 汽车等。6.2 面向对象程序设计的基本概念对象封装是一种信息隐蔽技术,使数 据和加工该数据的方法(函数)封装 为一个整体,以实现独立性很强的模
3、块,使得用户只能见到对象的外特性 ,而对象的内特性(保存内部状态的 私有数据和实现加工能力的算法)对 用户是隐蔽的。6.2 面向对象程序设计的基本概念封装类是描述对象的“基本原型”,它定义一类 对象所能拥有的数据和能完成的操作。在程 序设计中,类是程序的基本单元。把所有的具有相同性质的这些对象进行归 为一类,对象是类的一个实例。类可有其子类,也可有其它类,形成类 层次结构。 例如,学校里有很多学生,每个 学生都是一个对象实例,而“学生”则是一 个类。6.2 面向对象程序设计的基本概念类6.2 面向对象程序设计的基本概念类的实例类是在对象之上的抽象,而对象是类的 实例,即对象是类的具体化。例如,
4、把学生归为一类,张三同学就是 学生类的一个具体实例。Car car1;Car car2;.实例实例6.2 面向对象程序设计的基本概念类的继承继承是子类利用父类中定义的方法和变量, 就像它们属于子类本身一样。继承分为单继承(一个子类只有一父类) 和多重继承(一个类有多个父类)。继承不仅支持系统的可重用性,而且还促进 系统的可扩充性。6.2 面向对象程序设计的基本概念类的多态性多态性是对象根据所接收的信息而 做出动作。消息是对象之间进行通信的一种构 造。同一消息为不同的对象接受时可 产生完全不同的行动,这种现象称为 多态性。 在面向对象程序设计中可通过在派 生类中重定义基类函数(定义为重载 函数或
5、虚函数)来实现多态性。 6.3 封装类蛋糕类的定义如下:/* 蛋糕对象*/public class CakeObject /类名为CakeObject /类体的内容 6.3 封装类成员蛋糕类有各种属性和方法,前面 我们给出了一个创建类的框架,现在 具体实施。蛋糕类包括的属性有编号 、重量、价格等,方法有金额计算等 。6.3 封装 成员变量与局部变量在类体的变量部分中, 其定义的变量称为类的成员 变量;而除去成员变量,在 方法中定义的变量和方法应 用到的参数均属于局部变量 。成员变量又分为实例变量 和类变量,(1)二者应用到Java中任一数据类型。(2)局部变量在方法内声明,而成员变量 即类体变
6、量,在创建类体时声明。(3)局部变量的作用范围只限于方法里, 作用范围之外的其他方法没有不能访问它的 局部变量。这点就与成员变量不同,凡是在 同一类体中的方法都可以访问成员变量。(4)当二者变量命名相同时,在方法中调 用同名变量时,成员变量被隐藏,真正被调 用的是局部变量。6.3 封装 成员变量与局部变量比较6.3 封装关于this当蛋糕类的成员方法如setCakeId设置蛋 糕编号的方法,需访问类的成员变量 cakeCode。如下: public void setCakeId(String cakeCode) / 设置蛋糕编码的方法 this.cakeCode = cakeCode;6.3
7、封装关于super蛋糕店在对员工进行管理时, 管理员类继承了员工类的属性或方法 ,当二者的方法名或属性名同名时, 应该如何调用父类即员工类的方法或 属性?6.3 封装方法类包括类声明和类体。类体中包含方法, 而方法同样包括方法声明和方法体。格式如 下:方法声明包括方法名、返回类型和外部参 数。方法体是方法的实现部分,它包括局部变 量的声明以及所有合法的Java指令。6.3 封装方法声明方法声明如下:String toString(int aa) String 是返回的数据类型,toString 是方法名,aa是外部参数。方法也可以不要 求有返回类型和外部参数,对于这种方法的 声明可以用void
8、 代替,如下:void print() 6.3 封装方法体方法体是方法的实现部分。如下: public String getCakeId() /获取蛋糕编 码的方法 return cakeCode; public void setCakeId(String cakeCode) /设置蛋糕编码的方法 this.cakeCode = cakeCode; 6.3 封装方法重载方法的重载是一个类中含有许多同名的方 法,且带有不同的参数列表。getVolume()方法的重载如下:float getVolume(float r);double getVolume(float x, int y);float
9、 getVolume(int x, float y); double getVolume(float x, float y, float z); 6.3 封装构造方法当我们创建蛋糕类的对象时,需给 对象赋予特定的属性。如创建一个巧 克力蛋糕对象后,该对象就具有属于 它的蛋糕名称、编号等。初始化蛋糕对象需要应用构造方法。6.3 封装构造方法重载【语法】调用重载构造方法创建对象 CakeObject1 cake1=new CakeObject1(); CakeObject1 cake2=new CakeObject1(“B01“,“ 巧克力蛋糕“,40); 其中,调用构造方法自动地确定了创建对象的
10、初 始状态;构造方法在对象创建时为该对象的成员变 量赋予初始化值;和访问方法一样用点运算符访问成员变量 。6.3 封装方法和变量的访问权限Java通过设置类成员的访问权限,来实现封装的特性,共定义了4种访问权限: (1)用关键字private修饰的成员变量和方法称为私 有变量和私有方法;(2)用public修饰的成员变量和方法称为公有变量 和公有方法; (3)不用任何修饰符的成员变量和方法被称为友好 变量和友好方法;(4)用protected修饰的成员变量和方法被称为受保 护的成员变量和受保护的方法。6.4 继承窝夫蛋糕店每天都能烤出各种各样的 蛋糕,有法国宫廷蛋糕、意氏蛋糕、巧克 力蛋糕、冰
11、淇淋蛋糕、奶油水果蛋糕等, 每种类型的蛋糕都继承了蛋糕类的属性, 包括编号、价格和重量等。创建蛋糕类之 后,现在继续创建每种类型的蛋糕类,比 如奶油水果蛋糕类。 6.4 继承继承的实现创建蛋糕类的子类奶油水果蛋糕类,如 下:class 奶油水果蛋糕extends蛋糕; 继承得到的类为子类,被继承的 类为父类,父类包括所有直接或间接 被继承的类。extends是继承的关键字。6.4 继承继承数据成员和方法如果子类和父类在同一个包中,那么,子类 自然地继承了其父类中不是private 的成员变量 和方法作为自己的成员变量。如果子类和父类不在同一个包中,那么, 子类继承了父类的protected、p
12、ublic 成员变量 做为子类的成员变量,并且继承了父类的 protected、public方法为子类的方法。如果子类和父类不在同一个包里,子类不 能继承父类的默认变量和默认方法。6.4 继承覆盖方法如果奶油水果蛋糕类需要自己定 义计算金额的方法,而计算金额的方 法已经被蛋糕类定义了,但是不能满 足奶油水果蛋糕类的计算要求。这时 可以应用方法的覆盖来满足奶油水果 蛋糕类的计算要求。6.4 继承覆盖方法父类和子类都声明了同名的变量 price,子类的price隐藏了父类的price ,此时二者不是继承关系,可以用 this. price引用本类的变量,而用 super. price引用被隐藏的父
13、类同名变 量。6.4 继承继承中注意的问题继承中应注意以下几点:子类不能继承父类的构造方法;由于Java 只支持单重继承机制,不支持多 重 继承,所以声明的类只能有一个超类。6.5 多态抽象类由于对象高级抽象的需要, 希望蛋糕类只需要说明方法首部 ,而不需要或不可能说明其方法 体,其方法体只能由其子类奶油 蛋糕类来完成,如何才能实现? 6.5 多态抽象类的定义抽象类不能创建任何对象,抽象类只是用 来由其子类继承。用关键字abstract来声明抽象方法,只允 许声明,而不允许实现。例如:abstract void getPrice() 用关键字abstract修饰的类称为抽象类。 abstrac
14、t class A /A为抽象类 . 6.5 多态抽象类的使用一个abstract 类只关心它的子类 是否具有某种功能,并不关心功能的 具体行为,功能的具体行为由子类负 责实现。应用抽象类时abstract 类也可以没 有abstract方法;但如果一个类中含有 abstract方法,那么这个类必须用 abstract 来修饰。6.5 多态接口的定义蛋糕店业务包括采购、制作、销 售、统计等,通过分类定义不同接口 ,接口包括这些业务功能。每种蛋糕 根据不同特点继承相应的接口,再实 现具体的操作过程。这样把不同类型 的蛋糕类归于不同的接口,可以更好 的管理它们。6.5 多态接口的定义创建一个蛋糕销
15、售接口。 结果如下: interface CakeSale / CakeSale是接口名 称double price = 0;double weight = 0;public double getSaleSum();6.5 多态接口的使用【语法】接口使用 class implements ,其中, 一个类通过使用关键字implements 声明 自己使用一个或多个接口; 如果使用多个接口,用逗号隔开接口名 。6.5 多态接口的继承如何避免Java的单继承缺陷,使 蛋糕类实现多继承机制? 6.5 多态内部类WF蛋糕店的蛋糕在每类蛋糕下 面还有很多不同的蛋糕,其中,巧克 力蛋糕包括巧克力奶油蛋糕。
16、所以为 了管理的方便,可以在巧克力蛋糕类 内部中定义巧克力奶油蛋糕类。6.6 包为什么使用包WF蛋糕店的各种蛋糕类如何才能将 其分类进行管理?包是Java语言中有效管理类的机制。6.7 包 包的定义package语句的一般格式为:package 包名可以是一个合法的标识符,也 可以是若干个标识符加”分割而成 ,如:.cakepack;6.6 包 包的层次结构包的层次结构包括子包和类文件 和接口文件(一个类或一个接口编译 后都产生一个相应字节码文件)。包 的层次结构类似文件夹的层次结构。 例如:package com.menu;6.6 包 运行包中的类WF蛋糕店的蛋糕类定义了一个 .cakepack包,下面在dos环境 下运