Upload
wilma-mathis
View
74
Download
0
Embed Size (px)
DESCRIPTION
Java 技术与应用. - 面向对象技术概述. 西安交大 卫颜俊 2008 年 11 月 电子信箱: [email protected] QQ: 610568018 网站 : 202.117.58.97/java. 主要内容. 面向对象技术概述 面 向对象的实现 ( 程序设计 ) ◆. 传统的结构化技术. 特征: 以数据为中心,线性和过程化的处理方式 每一步的开发都是在假定前一步完全规范和正确的基础上进行 缺点: 软件可重用性弱 软件可维护性差 无法使用组件技术 开发效率低 软件危机问题依然存在 ◆. 面向对象技术. 特征: - PowerPoint PPT Presentation
Citation preview
1 / 57
JavaJava 技术与应用技术与应用-面向对象技术概述
西安交大 卫颜俊 2008 年 11 月
电子信箱: [email protected]: 610568018
网站 : 202.117.58.97/java
2 / 57
主要内容
面向对象技术概述
面向对象的实现(程序设计) ◆
3 / 57
传统的结构化技术 特征:
以数据为中心,线性和过程化的处理方式 每一步的开发都是在假定前一步完全规范和
正确的基础上进行 缺点:
软件可重用性弱 软件可维护性差 无法使用组件技术 开发效率低 软件危机问题依然存在◆
4 / 57
面向对象技术 特征:
以对象为中心,以任何事物都是对象为前提
对象、类、继承性、消息机制和多态性是面向对象技术的特征。
克服了结构化的诸多缺点 目前流行的设计工具:
UML (统一建模语言) ◆
5 / 57
面向对象技术中的主要概念 对象 (Object) :
对现实实体的抽象,定义实体的属性与方法。 类 (Class)
描述具有相同属性和方法的对象的集合。
对象与类之间的关系 类定义该集合中每个对象的共同属性和方法, 一个对象只是类的一个实例。 ◆
6 / 57
面向对象技术中的主要概念 继承性
反应在类的层次结构上,下一级类承袭上一级类的内容。
消息机制 保证对象之间通过传递消息来建立联系,使对象
之间建立联系更好的一种方式 多态性
反映了现实世界事物之间的动态相关性。 ◆
7 / 57
面向对象技术的基本活动 发现并且标识对象和类
事物(电脑、温度),角色(母亲、牧师),事件(中断、点击),作用(打电话、开会)
描述对象和类之间的关系 关联( “ use-a” )人与电脑 聚集(整体 / 部分关系, “ has-a” )学校
与学院 继承(属性和方法的继承, “ is-a” )大学
生与研究生 通过描述每个类的功能确定对象的行为等。
书:写书、印书、买书、卖书和读书◆
8 / 57
面向对象软件开发过程
面向对象分析( OOA ) 面向对象设计( OOD ) 面向对象实现( OOP ) 面向对象测试( OOT ) 面向对象维护( OOM ) ◆
9 / 57
案例 : 虚拟酒店点菜系统的分析
◆
10 / 57
案例的功能 客人使用账号和密码登录成功以后,可以随意
点菜,由系统将点好的菜单传送到厨师处。还可以查看厨师为自己炒好的菜单,并食用;
厨师使用账号和密码登录成功以后,可以看到所有客人向其点的菜单,并炒好任意一个菜,由系统将炒好的菜单传送到客人;
系统管理员可以统计每一位客人的消费金额,和每一位厨师的收入金额。 ◆
11 / 57
案例的分析结果 厨师类、菜系类、菜谱类、客人类和菜单类
◆
12 / 57
案例的设计结果 (1) 厨师类、菜系类、菜谱类、客人类、菜单
类和各个类的相关操作
◆
13 / 57
案例的设计结果 (2) 系统的人机界面包括:客人面板类、客人窗口类、厨师面板类和厨师窗口类;
数据管理包括:厨师表、菜系表、菜谱表、菜单表和客人表;
任务管理包括:界面数据刷新线程。 ◆
14 / 57
面向对象的实现 (OOP)OOP 即 Object-Oriented Programming
上世纪 60 年代的 simula 语言70 年代第二代的 smalltalk 语言80 年代中后期的 C++ 语言90 年代中后期的 Java 语言
OOP 任务是使用一种面向对象的计算机语言把面向对象设计模型中的每个成分书写出来。 ◆
15 / 57
面向对象的实现的要点 对象、方法和类:
对象具有属性和方法 同类的对象具有相同属性和方法 对象接收和发送对应事件(动作)
的消息◆
16 / 57
面向对象实现中的基本概念 对象是相关状态和行为的软件绑定 类为建立对象的蓝图或原型 继承提供组织和构建软件的强大而自然
的机制
接口是类与外部世界之间的契约 包是按逻辑方式组织类和接口的名字空
间。 ◆
17 / 57
猫(对象)
18 / 57
猫类
属性 ( 数据 )名字毛色年龄品种习性身长身高体重主人
行为 ( 方法 )吃喝跑抓散步玩杂技看电视睡觉
◆
19 / 57
猫类的书写
1 : class 猫 {2 : // 属性3 : String 名字 ;4 : Color 毛色 ;5 : int 年龄 ;6 : String 品种 ;7 : String 习性 ;8 : int 身长 ;9 : int 身高 ;10: int 体重 ;11: String 主人 ;
12: // 方法13: void 喝 () {}14: void 跑 () {}15: void 抓 () {}16: void 散步 () {}17: void 玩杂技 () {}18: void 看电视 () {}19: void 睡觉 () {}20: } ◆
20 / 57
OOP 的优点总结 通过代码重用节省开发时间和成本
一个应用中的对象类可以用在另一个应用中
易于测试和调试 类作为单独模块独立测试 重用对象不必进一步测试◆
21 / 57
22 / 57
包的定义与使用 定义: package 包名 ;
package chapter1.vector;public class Mosquito { int capacity;
}
使用: import 包名 .{*| 类 | 接口 };package chapter1.test;import chapter1.vector.Mosquito;class Test {} ◆
23 / 57
类的定义类修饰符 class 类名 [< 类型参数 >] [extends 父类名 ] [implements 父接口名 ]{ 类体} ◆
24 / 57
主要的类修饰符 无类修饰,表示该类的权限为 friendly ,位于同一个包中的类可以使用该类,
public ,表示该类的权限为最大,称为公共类,任何其它类都可以使用该类,
abstract ,表示该类为抽象类,不能直接定义其对象,
final ,表示该类不能产生子类。 ◆
25 / 57
extends 父类名,表示正在定义的类继承
了父类, implements 父接口名,表示正在定义的
类实现了父接口名。 ◆
26 / 57
举例1 : package points;2 : abstract class Point {}3 : 4 : package points;5 : public class Point3d extends Point
{}6 : 7 : import points.Point3d;8 : public final class Point4d extends
Point3d {} ◆
27 / 57
类的成员变量的定义
变量修饰符 类型 变量名 [, 类型 变量名 ,…, 类型 变量名 ] ; ◆
28 / 57
主要的成员变量修饰符 无变量修饰,表示该变量的权限为 friendly ,位于同
一个包中的类可以使用该变量, public ,表示该变量的权限为最大,任何其它类都可
以使用, protected ,表示该变量的权限为保护型,留给子类继
承用, private ,表示该变量的权限为最小,只有该类内部可
以使用, static ,表示该变量为静态的。在系统中只分配一次存
储单元,是整个类的属性,而不归类的任何具体对象独有,即使用类的任何对象访问时,取相同的值,而使用类的任何对象去修改时,都是对同一个存储单元进行。应该使用类名作前缀,即“类名 . 变量名”来存取该属性,
final ,表示该变量为常量,不可修改其值。 ◆
29 / 57
举例 (1)1 : package points;2 : public class Point {3 : private int x, y;4 : protected int useCount ;5 : static int totalUseCount;6 : public static final int TOTALMOVES=10;
7 : } ◆
30 / 57
举例 (2)9 : package points;10: class Point3d extends Point {}11: 12: package points;13: class Test{}14: 15: import points.*;16: class Point4d extends Point {}
◆
31 / 57
成员方法的定义
方法修饰符 返回类型 方法名 ( 形式参数列表 ) throws 异常类列表 {
方法体} ◆
32 / 57
主要的成员方法修饰符 无方法修饰,位于同一个包中的类可以使用该变量, public ,表示该方法的权限为最大,任何其它类都可以使
用, protected ,表示该方法的权限为保护型,留给子类继承
用, private ,表示该方法的权限为最小,只有该类内部可以使
用, static ,表示该方法为静态的,直接通过类就可以使用, final ,表示该方法不可在子类中覆盖, native ,表示本地方法,由 C/C++ 语言编写, abstract ,表示抽象方法,用在抽象类中, synchronized ,表示同步方法(用在线程方面)。 ◆
33 / 57
throws 异常类列表
方法体的格式如下:代码块 ;return 返回值 ; ◆
34 / 57
举例 (1)1 : package points;2 : public abstract class Point {3 : public void move(int dx, int dy) {}4 : private void printMoves() {}5 : protected int getUseCount() {}6 : static int getTotalUseCount() {}7 : public static final int getTotalMoves() {}8 : public abstract void int area();9 : } ◆
35 / 57
举例 (2)11: package points;12: class Point3d extends Point {13: public int area() {}14: }15: 16: package points;17: class Test {}18: 19: import points.*;20: class Point4d extends Point {21: public int area() {}22: } ◆
36 / 57
三种特殊方法的定义 构造方法
类名 ([ 参数列表 ]){ ……} 析构方法
protected void finalize() throws Throwable { …...}
主方法public static void main (String args[]){ ……} ◆
37 / 57
构造方法 构造方法完成对象状态的初始化工作,其名字与类
相同 如果在定义一个类时,定义了构造方法,则以定义
的格式为准 如果未明确定义构造方法,则 Java 编译器会增加
一个无形式参数的构造方法(称为缺省构造方法) 而且当这个类是原生类(不继承任何其它类),增
加的构造方法的方法体为空代码块 这个类存在父类时,则构造方法无参数且调用父类
的构造方法。 ◆
38 / 57
子类没有定义构造方法时,自动继承父类不含参数的
构造方法,并在创建新子类对象时自动执行子类有自己的构造方法时,创建新子类对象时也要先
执行父类不含参数的构造方法,再执行自己的构造函数
使用 super( 参数 ) 方法可以显式调用父类的构造方法 , 且该调用语句必须是子类构造方法的第一个可执行语句。
一个类可能有多个构造方法 使用 this( 参数 ) 方法调用同一个类的构造方法 ,
且此时 this 应是第一个可执行语句◆
39 / 57
静态初始化器完成静态数据成员的初始化工作静态初始化器中的语句在类加载内存时执行,时间上先于构造方法执行
class Point { static int useCount; static int totaUseCount; static{ useCount=3; totaUseCount=use
Count+6; } } ◆
40 / 57
举例1 : class Guest {2 : final int SERIALNO;3 : private static int totalSerialNo;4 : static {5 : totalSerialNo = 10000;6 : }7 : 8 : Guest() {9 : totalSerialNo = totalSerialNo + 1;10: SERIALNO = totalSerialNo;11: }12: } ◆
41 / 57
方法重载 int add(int x,int y){return x+y;} float add(float x,float y){return x+y;} float add(float x,int y){return x+y;} String add(char x,char y){return ""+x+
y;}
一个类中定义了几个同名方法,它们完成同一类操作,但是又有区别。 ◆
42 / 57
举例 (1) 1 : class Chinese {2 : public void speak() {3 : System.out.println(" 您好 !");4 : }5 : public void speak(int count) {6 : for (int i = 0; i < count; i++) {7 : System.out.println(" 您好 !");8 : }9 : }10: public void speak(String word) {11: System.out.println(word);12: } ◆
43 / 57
举例 (2) 13: public void speak(String word, boolean re
verse) {14: if (reverse) {15: System.out.println(new StringBuffer(wo
rd).reverse());16: }17: else {18: System.out.println(word);19: }20: }21: } ◆
44 / 57
构造方法的重载 ( 举例 )1 : class Point {2 : int x, y;3 : Point(int x, int y) {4 : this.x = x;5 : this.y = y;6 : }7 : }8 : ◆
45 / 57
9 : class ColoredPoint extends Point {10: static final int WHITE = 0, BLACK = 1;11: int color;12: ColoredPoint(int x, int y) {13: this(x, y, WHITE);14: }15: ColoredPoint(int x, int y, int color) {16: super(x, y);17: this.color = color;18: }19: } ◆
46 / 57
内部类
定义在另一个类中的类一般称为嵌套类( nested classes ),如果再强加一个限制,即其前面不加 static 标识符,则称为内部类( inner class )
内部类的作用 :主要应用在事件驱动的控制结构中从逻辑上将类进一步编组 , 并控制其可见
度◆
47 / 57
举例 (1)1 : class Outer {2 : int x = 3;3 : void showX() {4 : System.out.println(x);5 : }6 : 7 : class Inner {8 : int y = x + 5;9 : void showY() {10: showX();11: System.out.println(y); ◆
48 / 57
举例 (2)12: }13: }14: }15:16: class Other {17: Outer outer = new Outer();18: Outer.Inner inner = outer.new Inner
();19: } ◆
49 / 57
对象的定义 Java 语言中的对象包括三个状态,定义、
使用和释放,其中最后一个状态由 Java 的 GC 机制来完成,目的是回收无用对象。前两个状态由程序员来完成。
修饰符 类名 [< 类型参数 >] 对象名 =new 类名 [< 类型参数 >]( 参数列表 ); ◆
50 / 57
举例 (1) ColoredPoint coloredPoint=new ColoredPoint(100,200,0xFFFFFF);
◆
51 / 57
举例 (2) 1 : class Adder<T> {2 : T x;3 : T y;4 : Adder(T x,T y){5 : this.x=x;6 : this.y=y;7 : }8 : T add(T x, T y) { return x + y; }9 : } ◆
52 / 57
举例 (3) Adder<int> adder1= new Adder<int> (3,5);adder1.x=3;
Adder<double> adder2= new Adder< double > (3.3,5.5);adder1.y=5;
Adder<String> adder2= new Adder< String > ("3.3 ", "5.5 ");int x=adder1.add(3,5); ◆
53 / 57
大例子 - 【例 2-2 】正方形类
分析出的结果: 正方形类,它既具有边长、位置、边界颜
色和内部颜色等属性,又具有画图、擦图和移动等操作
◆
54 / 57
大例子 设计出的结果 :
◆
55 / 57
大例子 程序代码 (1) :
◆
1 : import java.awt.*;2 : 3 : public class 正方形类 {4 : public int 边长 ;5 : public Point 位置 ;6 : public Color 边界颜色 ;7 : public Color 内部颜色 ;8 : 9 : public 正方形类 (int 边长 , Point 位置 , Color 边界颜色 , Color 内部颜色 ) {10: this. 边长 = 边长 ;11: this. 位置 = 位置 ;12: this. 边界颜色 = 边界颜色 ;13: this. 内部颜色 = 内部颜色 ;14: }15: 16: public void 画图 (Canvas 画布 ) {17: 画布 .getGraphics().setColor( 边界颜色 );
56 / 57
大例子 程序代码 (2) :
◆
18: 画布 .getGraphics().drawRect( 位置 .x, 位置 .y, 边长 , 边长 );19: 20: 画布 .getGraphics().setColor( 内部颜色 );21: 画布 .getGraphics().fillRect( 位置 .x, 位置 .y, 边长 , 边长 );22: }23: 24: public void 擦图 (Canvas 画布 ) {25: 画布 .getGraphics().setColor(Color.WHITE);26: 画布 .getGraphics().drawRect( 位置 .x, 位置 .y, 边长 , 边长 );27: 画布 .getGraphics().fillRect( 位置 .x, 位置 .y, 边长 , 边长 );28: }29: 30: public void 移动 (Point 新位置 ) {31: 位置 = 新位置 ;32: }
57 / 57