java 的面向对象程序设计
DESCRIPTION
Java 的面向对象程序设计. 授课人:于军. 下一页. 本讲主要内容. 面向对象的概念 面向对象的三大特性 Java 中的类与对象 Java 的面向对象程序设计 Java 中的类说明 变量 方法. 面向对象的概念(一). 程序语言的发展 面向机器( 机器语言、汇编语言 ) 可读性、可维护、移植性差;效率高 面向过程 核心:算法 + 数据结构 缺陷: 随着应用程序的规模扩大,操作与数据分离所带来的 维护 工作量越来越大。 不适用于 GUI 界面、事件驱动编程. 面向对象的概念(二). 面向对象 全新的程序设计思想:计算机——现实世界 - PowerPoint PPT PresentationTRANSCRIPT
Java语言与面向对象的程序设计
JavaJava 的面向对象程序设计的面向对象程序设计
授课人 : 于军
下一页
下一页
Java语言与面向对象的程序设计2
上一页 退 出第一页
本讲主要内容本讲主要内容面向对象的概念面向对象的三大特性Java 中的类与对象Java 的面向对象程序设计Java 中的类说明
– 变量– 方法
下一页
Java语言与面向对象的程序设计3
上一页 退 出第一页
面向对象的概念(一)面向对象的概念(一)程序语言的发展面向机器(机器语言、汇编语言)
– 可读性、可维护、移植性差;效率高面向过程
核心:算法 + 数据结构缺陷:– 随着应用程序的规模扩大,操作与数据分离所带
来的维护工作量越来越大。– 不适用于 GUI 界面、事件驱动编程
下一页
Java语言与面向对象的程序设计4
上一页 退 出第一页
面向对象的概念(二)面向对象的概念(二)面向对象
全新的程序设计思想:计算机——现实世界对象 实体对象拥有属性 , 行为 , 将数据与操作结合在一起消息 实体间的联系面向对象的程序设计 = 对象 + 消息发展历史: SmartTalk C++ JAVA
JAVA 中的类与对象
下一页
Java语言与面向对象的程序设计5
上一页 退 出第一页
面向对象的三大特性之一:面向对象的三大特性之一:封装
数据及基于其上的操作被封装在对象的内部,对外通过一被授权的接口与程序其他部分交互对象内部的变化不会影响到程序的其他部分– 一个设计成功的对象可以用在不同的程序中– 提高了程序的模块化、安全性,降低维护量– 提高代码的可复用性
下一页
Java语言与面向对象的程序设计6
上一页 退 出第一页
面向对象的三大特性之二:面向对象的三大特性之二:继承
在已有类的基础上,扩充或改写其某些属性及方法,生成新的类,称为原有类的子类父类中包含子类具有的公共属性。例: BankAccount SavingAccount
BankAccount CheckingAccount– 减少了编程的代码量和代码的重复– 继承体现了面向对象的方法对现实世界人们有组
织的抽象思维特点的模拟
下一页
Java语言与面向对象的程序设计7
上一页 退 出第一页
面向对象的三大特性之三:面向对象的三大特性之三:多态
用相同的名字定义、调用不同的方法:• 子类对父类方法的重载(用类名区分)• 对本类中同名方法的重载(用参数区分)
例:电器 加电开启优点:– 提高程序的抽象程度– 降低程序的维护工作量,降低代码量
下一页
Java语言与面向对象的程序设计8
上一页 退 出第一页
JAVAJAVA 中的类与对象中的类与对象JAVA 中如何体现上述 O-O 特性和优点
JAVA 中类与对象– 类:抽象的集合概念 —— 鸭
• 系统类库中已定义好的类• 用户自定义的类
– 对象 ( 实例 instance) :实际个体——那只鸭• 创建某个类的具体对象 ( 类似变量声明 )
类名 欲创建的对象名 = new 类名 ( 参数表 ) ;
例如: String s = new String( “Hello!” ) ;
下一页
Java语言与面向对象的程序设计9
上一页 退 出第一页
JAVAJAVA 的类库的类库• JAVA 提供了若干含有一定预制功能的基础类• 编程的过程就是继承这些基础类而创建、定义特殊子类的过程。• 基类:所有 JAVA 的类都派生自 Object• 语言基础类库: java.lang• 工具类库: java.util• 输入 / 输出类库: java.io• AWT 类库: java.awt (GUI 界面)• 网络类库: java.net• 浏览器类库: java.applet
——JAVA API
下一页
Java语言与面向对象的程序设计10
上一页 退 出第一页
JAVAJAVA 面向对象编程设计面向对象编程设计 一个简单例子:银行业务
– 要求:处理简单帐户存取款、查询– 面向对象的分析( OOA )
• 对象模型抽象:银行帐户• 对象模型属性分析 : 余额、存、取、查
– 面向对象的设计( OOD )• 对象模型的实现:类及其成员定义• bankaccount,Banlance,Deposit,etc
下一页
Java语言与面向对象的程序设计11
上一页 退 出第一页
银行业务的程序结构银行业务的程序结构
银行帐户类 BankAccount数据:帐户余额 Balance
操作:获得余额 getBalance()
操作:存款 saveMoney()
操作:取款 getMoney()
主类 UseAccount
main() 方法,创建 BankAccount类的对象,并完成相应操作
下一页
Java语言与面向对象的程序设计12
上一页 退 出第一页
JAVAJAVA 中类的声明(一)中类的声明(一)
[ 文档说明 ] [ 类修饰符 ] class 类名[ extends 超类名 ]
[ implements 接口名 ] {
类体;成员变量定义;方法定义;
}
下一页
Java语言与面向对象的程序设计13
上一页 退 出第一页
JAVAJAVA 中类的声明(二)中类的声明(二)类修饰符( Modifier ):
– public :允许其他包、类访问本类– abstract :没有实例的抽象概念类– final :不能再被扩展,不包含子类的类– 缺省:可被当前包中的其他类访问
父类声明: extends 父类名实现接口 (interface) : implements 接口名
接口是一组抽象的方法,在实现它的类中被赋予实际内容,比继承灵活
下一页
Java语言与面向对象的程序设计14
上一页 退 出第一页
变量:类的数据成员变量:类的数据成员声明类数据成员(变量)
[ 修饰符 ] 数据类型 变量名;– 修饰符
• public, protected, private :访问控制符• static: 类的成员变量,对所有的实例一致• final :数值不变常量,定义同时应初始化• volatile :可能独立于当前线程而被改变• transient :过渡,系统保留
下一页
Java语言与面向对象的程序设计15
上一页 退 出第一页
例:类的静态成员变量例:类的静态成员变量
在 BankAccount 类的中增加定义利率设所有的银行帐户享用相同的利率public class BankAccount {
private static double m_dInterestRate;
private double m_dBalance;
………
}
下一页
Java语言与面向对象的程序设计16
上一页 退 出第一页
方法:类的成员函数方法:类的成员函数定义对类内成员变量(数据)的操作方法的声明:
[ 修饰符 ] 返回类型 方法名(参数列表)[ throws 例外名 ] {
方法体;}
谁调用方法、接受哪些参数、如何返回信息
下一页
Java语言与面向对象的程序设计17
上一页 退 出第一页
JAVAJAVA 的方法声明(一)的方法声明(一)修饰符 (Modifier ):
–访问控制符:• public :允许其他包、类调用本方法• private :只能由定义此方法的类调用• protected :允许本类、子类、同包中的其他类• private protected :允许本类、子类调用此方法
– static :类的方法,不能被重载– abstract :只有接口没有语句,重载时实现– final :不能被重载、不可改变的方法– native, synchronized :外部代码 , 多线程并发
下一页
Java语言与面向对象的程序设计18
上一页 退 出第一页
JAVAJAVA 的方法声明(二)的方法声明(二)返回类型: void 、 return参数列表:值传递throws :指定方法中要处理的例外(异常),同时方法
中应定义一端例外处理程序;则当执行此方法并发生了例外时,程序转入例外处理程序段。
下一页
Java语言与面向对象的程序设计19
上一页 退 出第一页
例子:例子: UseAccount2UseAccount2
修改 BankAccount 类–增加对利率的处理
• 获取利率: getInterestRate()• 设置利率: setInterestRate( 新利率值 )
主类 UseAccount2 类– 设置利率
Java语言与面向对象的程序设计
深入面向对象编程深入面向对象编程
授课人 : 于军
下一页
下一页
Java语言与面向对象的程序设计21
上一页 退 出第一页
本讲主要内容本讲主要内容构造函数
类的继承
重载与多态
下一页
Java语言与面向对象的程序设计22
上一页 退 出第一页
构造函数(构造函数( constructor)constructor)
问题的提出– Java试图在每个对象一诞生时,就给它一确定的状态,但有时这种系统的缺省初值不合适;所以在创建一个新对象时,需用构造函数完成合法的初始化,使类内成员的初始化工作不依赖于外界完成。
– 体现了面向对象的 autonomy 原则。
下一页
Java语言与面向对象的程序设计23
上一页 退 出第一页
构造函数(二)构造函数(二) 构造函数是一种特殊的类成员函数,
在创建每个新的类对象时自动执行以保证新对象的各成员有合法、确定的数值。
构造函数的名字就是类的名字。 构造函数没有返回类型 构造函数只能在创建类对象时由系统隐含调用,
而不能直接引用 构造函数内部可以调用其他的函数 , 但一般不
在其中创建新的其他类的对象
下一页
Java语言与面向对象的程序设计24
上一页 退 出第一页
例子:构造函数例子:构造函数class BankAccount {
static private int m_nNextAccNum;private int m_nAccNum;static final double m_dLOWESTB = 10.0;private double m_dBalance;BankAccount ( ) {
m_nAccNum = m_nNextAccNum++;m_dBalance = m_dLOWESTB;
}}
下一页
Java语言与面向对象的程序设计25
上一页 退 出第一页
类对象的创建类对象的创建利用运算符 new 在内存中开辟专用空间,存放指定的类的实例(对象)
自动执行类的构造函数,初始化新对象的成员变量
在程序中,以对象名为前缀,可访问对象成员变量、调用方法
baMyBankAccount = new BankAccount();baMyBankAccount . saveMoney(sAmount) ;
下一页
Java语言与面向对象的程序设计26
上一页 退 出第一页
静态初始化器静态初始化器静态数据成员、复杂数据成员的初始化可在静态初始化器中完成
静态初始化器中的语句在类加载内存时执行,这种初始化操作要比构造函数执行得更早。
static { . . . . . .
}
下一页
Java语言与面向对象的程序设计27
上一页 退 出第一页
课堂练习课堂练习在 UseAccount2 的基础上,
创建新应用程序 BankConstructor要求
–利用构造函数完成所有的初始化工作• 余额• 帐户号码(提示:使用静态初始化器)
下一页
Java语言与面向对象的程序设计28
上一页 退 出第一页
JavaJava 中类的继承(一)中类的继承(一)创建类时指明它为某存在类的子类
– extends 超类 / 父类名 父类
– 来自系统类库– 用户自定义类
子类将继承除 private 外所有父类成员Java 不支持多重继承例子:支票帐户、存款帐户
下一页
Java语言与面向对象的程序设计29
上一页 退 出第一页
JavaJava 中类的继承(二)中类的继承(二)子类对父类可做扩展和特殊化
– 创建新的成员:变量和方法• m_lSaveAccNum, m_lCheckAccNum
– 重新定义父类中已有的变量:隐藏• m_dInterestRate
– 重新定义父类中已有的方法:重载 (override ) 子类中的重载方法应与父类中的被重载方法有完全相同的:参数列表、返回值
• setInterestRate( ) , getAccountNumber( )
下一页
Java语言与面向对象的程序设计30
上一页 退 出第一页
类的继承(三)类的继承(三) this,super this,super
引用类的成员变量或方法时的前缀– this :当前类的方法或变量– super :直接父类的成员(只能上溯一层)
直接调用父类的方法可减少代码的重复例: BankAccount 类 CheckAccount 子类
this.Fee() :收取支票帐户的特殊费用super.Fee() :收取所有帐户的公共费用
父类对象可类型转换成子类对象if ( Ba instanceOf (SaveAccount ))
SaveAccount MySa = (SaveAccount) Ba;
下一页
Java语言与面向对象的程序设计31
上一页 退 出第一页
构造函数的继承构造函数的继承
子类自动继承父类不含参数的构造函数并在创建新子类对象时自动执行,子类有自己的构造函数时也同时执行
子类的构造函数如调用父类的含参数的构造函数,需用 SUPER关键字,且该调用语句必须是子类构造函数的第一个可执行语句。
下一页
Java语言与面向对象的程序设计32
上一页 退 出第一页
构造函数的其他问题构造函数的其他问题不用构造函数声明类对象
BankAccount b = new BankAccount( ba );BankAccount b = ba;( 是否开辟独立的内存单元 )
一构造函数可利用 this 调用其他的构造函数,此时 this 应是第一个可执行语句BankAccount( ) { this(10); }// 调用下面函数BankAccount(double InitBalance ){ m_dBalance = InitBalance; }
下一页
Java语言与面向对象的程序设计33
上一页 退 出第一页
例子:类的继承例子:类的继承InheritClass 程序
– 创建扩展类 SaveAccount 和 CheckAccout– 继承 BankAccount 类的
• 变量: m_dBalance, m_dInterestRate• 方法: Yearly(), AccumulateInterest(),...
– 定义自己的变量– 重载父类的方法: setInterestRate( )等– 构造函数的继承
下一页
Java语言与面向对象的程序设计34
上一页 退 出第一页
例子:类的继承例子:类的继承InheritClass 程序
– 创建扩展类 SaveAccount 和 CheckAccout– 继承 BankAccount 类的
• 变量: m_dBalance, m_dInterestRate• 方法: Yearly(), AccumulateInterest(),...
– 定义自己的变量– 重载父类的方法: setInterestRate( )等– 构造函数的继承
下一页
Java语言与面向对象的程序设计35
上一页 退 出第一页
FINALIZER { . . . . . . }FINALIZER { . . . . . . }
一种特殊的函数在一个对象被返还给系统存储 HEAP之前自动执行
Java 的垃圾回收机制:每个对象有自己的 REFERENCE 计数器 , 计数器减为零时对象丢失,系统在其后某个时刻自
动回收不再可用的对象类似于析构函数,完成资源释放操作
下一页
Java语言与面向对象的程序设计36
上一页 退 出第一页
JavaJava 中的多态与重载中的多态与重载多态:同名的不同方法共存重载 (overload): 同名方法被多次重新定
义– 同名提高了抽象程度,降低维护工作量
定义、调用时如何区别被重载的方法– 同类中的同名方法
用不同的参数列表来区别同名的不同方法不能用返回值(可忽略)来区别
– 不同类中的同名方法:冠以类名以示区别
下一页
Java语言与面向对象的程序设计37
上一页 退 出第一页
例子:多态与重载例子:多态与重载OverrideClass 程序
在已有的 BankAccount 类的基础上重载 BankAccount 类的构造函数
下一页
Java语言与面向对象的程序设计38
上一页 退 出第一页