57
1 / 57 Java Java 技技技技技 技技技技技 面面面面面面面面 面面面 面面面 西 2008 年 11 年 面面面面[email protected] QQ: 610568018 面面 : 202.117.58.97/java

Java 技术与应用

Embed Size (px)

DESCRIPTION

Java 技术与应用. - 面向对象技术概述. 西安交大 卫颜俊 2008 年 11 月 电子信箱: [email protected] QQ: 610568018 网站 : 202.117.58.97/java. 主要内容. 面向对象技术概述 面 向对象的实现 ( 程序设计 ) ◆. 传统的结构化技术. 特征: 以数据为中心,线性和过程化的处理方式 每一步的开发都是在假定前一步完全规范和正确的基础上进行 缺点: 软件可重用性弱 软件可维护性差 无法使用组件技术 开发效率低 软件危机问题依然存在 ◆. 面向对象技术. 特征: - PowerPoint PPT Presentation

Citation preview

Page 1: Java 技术与应用

1 / 57

JavaJava 技术与应用技术与应用-面向对象技术概述

西安交大 卫颜俊 2008 年 11 月

电子信箱: [email protected]: 610568018

网站 : 202.117.58.97/java

Page 2: Java 技术与应用

2 / 57

主要内容

面向对象技术概述

面向对象的实现(程序设计) ◆

Page 3: Java 技术与应用

3 / 57

传统的结构化技术 特征:

以数据为中心,线性和过程化的处理方式 每一步的开发都是在假定前一步完全规范和

正确的基础上进行 缺点:

软件可重用性弱 软件可维护性差 无法使用组件技术 开发效率低 软件危机问题依然存在◆

Page 4: Java 技术与应用

4 / 57

面向对象技术 特征:

以对象为中心,以任何事物都是对象为前提

对象、类、继承性、消息机制和多态性是面向对象技术的特征。

克服了结构化的诸多缺点 目前流行的设计工具:

UML (统一建模语言) ◆

Page 5: Java 技术与应用

5 / 57

面向对象技术中的主要概念 对象 (Object) :

对现实实体的抽象,定义实体的属性与方法。 类 (Class)

描述具有相同属性和方法的对象的集合。

对象与类之间的关系 类定义该集合中每个对象的共同属性和方法, 一个对象只是类的一个实例。 ◆

Page 6: Java 技术与应用

6 / 57

面向对象技术中的主要概念 继承性

反应在类的层次结构上,下一级类承袭上一级类的内容。

消息机制 保证对象之间通过传递消息来建立联系,使对象

之间建立联系更好的一种方式 多态性

反映了现实世界事物之间的动态相关性。 ◆

Page 7: Java 技术与应用

7 / 57

面向对象技术的基本活动 发现并且标识对象和类

事物(电脑、温度),角色(母亲、牧师),事件(中断、点击),作用(打电话、开会)

描述对象和类之间的关系 关联( “ use-a” )人与电脑 聚集(整体 / 部分关系, “ has-a” )学校

与学院 继承(属性和方法的继承, “ is-a” )大学

生与研究生 通过描述每个类的功能确定对象的行为等。

书:写书、印书、买书、卖书和读书◆

Page 8: Java 技术与应用

8 / 57

面向对象软件开发过程

面向对象分析( OOA ) 面向对象设计( OOD ) 面向对象实现( OOP ) 面向对象测试( OOT ) 面向对象维护( OOM ) ◆

Page 9: Java 技术与应用

9 / 57

案例 : 虚拟酒店点菜系统的分析

Page 10: Java 技术与应用

10 / 57

案例的功能 客人使用账号和密码登录成功以后,可以随意

点菜,由系统将点好的菜单传送到厨师处。还可以查看厨师为自己炒好的菜单,并食用;

厨师使用账号和密码登录成功以后,可以看到所有客人向其点的菜单,并炒好任意一个菜,由系统将炒好的菜单传送到客人;

系统管理员可以统计每一位客人的消费金额,和每一位厨师的收入金额。 ◆

Page 11: Java 技术与应用

11 / 57

案例的分析结果 厨师类、菜系类、菜谱类、客人类和菜单类

Page 12: Java 技术与应用

12 / 57

案例的设计结果 (1) 厨师类、菜系类、菜谱类、客人类、菜单

类和各个类的相关操作

Page 13: Java 技术与应用

13 / 57

案例的设计结果 (2) 系统的人机界面包括:客人面板类、客人窗口类、厨师面板类和厨师窗口类;

数据管理包括:厨师表、菜系表、菜谱表、菜单表和客人表;

任务管理包括:界面数据刷新线程。 ◆

Page 14: Java 技术与应用

14 / 57

面向对象的实现 (OOP)OOP 即 Object-Oriented   Programming

上世纪 60 年代的 simula 语言70 年代第二代的 smalltalk 语言80 年代中后期的 C++ 语言90 年代中后期的 Java 语言

OOP 任务是使用一种面向对象的计算机语言把面向对象设计模型中的每个成分书写出来。 ◆

Page 15: Java 技术与应用

15 / 57

面向对象的实现的要点 对象、方法和类:

对象具有属性和方法 同类的对象具有相同属性和方法 对象接收和发送对应事件(动作)

的消息◆

Page 16: Java 技术与应用

16 / 57

面向对象实现中的基本概念 对象是相关状态和行为的软件绑定 类为建立对象的蓝图或原型 继承提供组织和构建软件的强大而自然

的机制

接口是类与外部世界之间的契约 包是按逻辑方式组织类和接口的名字空

间。 ◆

Page 17: Java 技术与应用

17 / 57

猫(对象)

Page 18: Java 技术与应用

18 / 57

猫类

属性 ( 数据 )名字毛色年龄品种习性身长身高体重主人

行为 ( 方法 )吃喝跑抓散步玩杂技看电视睡觉

Page 19: Java 技术与应用

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: } ◆

Page 20: Java 技术与应用

20 / 57

OOP 的优点总结 通过代码重用节省开发时间和成本

一个应用中的对象类可以用在另一个应用中

易于测试和调试 类作为单独模块独立测试 重用对象不必进一步测试◆

Page 21: Java 技术与应用

21 / 57

 

 

Page 22: Java 技术与应用

22 / 57

包的定义与使用 定义: package 包名 ;

package chapter1.vector;public class Mosquito { int capacity;

}

使用: import 包名 .{*| 类 | 接口 };package chapter1.test;import chapter1.vector.Mosquito;class Test {} ◆

Page 23: Java 技术与应用

23 / 57

类的定义类修饰符 class 类名 [< 类型参数 >] [extends 父类名 ] [implements 父接口名 ]{ 类体} ◆

Page 24: Java 技术与应用

24 / 57

主要的类修饰符 无类修饰,表示该类的权限为 friendly ,位于同一个包中的类可以使用该类,

public ,表示该类的权限为最大,称为公共类,任何其它类都可以使用该类,

abstract ,表示该类为抽象类,不能直接定义其对象,

final ,表示该类不能产生子类。 ◆

Page 25: Java 技术与应用

25 / 57

  extends 父类名,表示正在定义的类继承

了父类, implements 父接口名,表示正在定义的

类实现了父接口名。 ◆

Page 26: Java 技术与应用

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 {} ◆

Page 27: Java 技术与应用

27 / 57

类的成员变量的定义

变量修饰符 类型 变量名 [, 类型 变量名 ,…, 类型 变量名 ] ; ◆

Page 28: Java 技术与应用

28 / 57

主要的成员变量修饰符 无变量修饰,表示该变量的权限为 friendly ,位于同

一个包中的类可以使用该变量, public ,表示该变量的权限为最大,任何其它类都可

以使用, protected ,表示该变量的权限为保护型,留给子类继

承用, private ,表示该变量的权限为最小,只有该类内部可

以使用, static ,表示该变量为静态的。在系统中只分配一次存

储单元,是整个类的属性,而不归类的任何具体对象独有,即使用类的任何对象访问时,取相同的值,而使用类的任何对象去修改时,都是对同一个存储单元进行。应该使用类名作前缀,即“类名 . 变量名”来存取该属性,

final ,表示该变量为常量,不可修改其值。 ◆

Page 29: Java 技术与应用

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 : } ◆

Page 30: Java 技术与应用

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 {}

Page 31: Java 技术与应用

31 / 57

成员方法的定义

方法修饰符 返回类型 方法名 ( 形式参数列表 ) throws 异常类列表 {

方法体} ◆

Page 32: Java 技术与应用

32 / 57

主要的成员方法修饰符 无方法修饰,位于同一个包中的类可以使用该变量, public ,表示该方法的权限为最大,任何其它类都可以使

用, protected ,表示该方法的权限为保护型,留给子类继承

用, private ,表示该方法的权限为最小,只有该类内部可以使

用, static ,表示该方法为静态的,直接通过类就可以使用, final ,表示该方法不可在子类中覆盖, native ,表示本地方法,由 C/C++ 语言编写, abstract ,表示抽象方法,用在抽象类中, synchronized ,表示同步方法(用在线程方面)。 ◆

Page 33: Java 技术与应用

33 / 57

throws 异常类列表

方法体的格式如下:代码块 ;return 返回值 ; ◆

Page 34: Java 技术与应用

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 : } ◆

Page 35: Java 技术与应用

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: } ◆

Page 36: Java 技术与应用

36 / 57

三种特殊方法的定义 构造方法

类名 ([ 参数列表 ]){ ……} 析构方法

protected void finalize() throws Throwable { …...}

主方法public static void main (String args[]){ ……} ◆

Page 37: Java 技术与应用

37 / 57

构造方法 构造方法完成对象状态的初始化工作,其名字与类

相同 如果在定义一个类时,定义了构造方法,则以定义

的格式为准 如果未明确定义构造方法,则 Java 编译器会增加

一个无形式参数的构造方法(称为缺省构造方法) 而且当这个类是原生类(不继承任何其它类),增

加的构造方法的方法体为空代码块 这个类存在父类时,则构造方法无参数且调用父类

的构造方法。 ◆

Page 38: Java 技术与应用

38 / 57

子类没有定义构造方法时,自动继承父类不含参数的

构造方法,并在创建新子类对象时自动执行子类有自己的构造方法时,创建新子类对象时也要先

执行父类不含参数的构造方法,再执行自己的构造函数

使用 super( 参数 ) 方法可以显式调用父类的构造方法 , 且该调用语句必须是子类构造方法的第一个可执行语句。

一个类可能有多个构造方法 使用 this( 参数 ) 方法调用同一个类的构造方法 ,

且此时 this 应是第一个可执行语句◆

Page 39: Java 技术与应用

39 / 57

静态初始化器完成静态数据成员的初始化工作静态初始化器中的语句在类加载内存时执行,时间上先于构造方法执行

class Point { static int useCount; static int totaUseCount; static{ useCount=3; totaUseCount=use

Count+6; } } ◆

Page 40: Java 技术与应用

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: } ◆

Page 41: Java 技术与应用

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;}

一个类中定义了几个同名方法,它们完成同一类操作,但是又有区别。 ◆

Page 42: Java 技术与应用

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: } ◆

Page 43: Java 技术与应用

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: } ◆

Page 44: Java 技术与应用

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 : ◆

Page 45: Java 技术与应用

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: } ◆

Page 46: Java 技术与应用

46 / 57

内部类

定义在另一个类中的类一般称为嵌套类( nested classes ),如果再强加一个限制,即其前面不加 static 标识符,则称为内部类( inner class )

内部类的作用 :主要应用在事件驱动的控制结构中从逻辑上将类进一步编组 , 并控制其可见

度◆

Page 47: Java 技术与应用

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); ◆

Page 48: Java 技术与应用

48 / 57

举例 (2)12: }13: }14: }15:16: class Other {17: Outer outer = new Outer();18: Outer.Inner inner = outer.new Inner

();19: } ◆

Page 49: Java 技术与应用

49 / 57

对象的定义 Java 语言中的对象包括三个状态,定义、

使用和释放,其中最后一个状态由 Java 的 GC 机制来完成,目的是回收无用对象。前两个状态由程序员来完成。

修饰符 类名 [< 类型参数 >] 对象名 =new 类名 [< 类型参数 >]( 参数列表 ); ◆

Page 50: Java 技术与应用

50 / 57

举例 (1) ColoredPoint coloredPoint=new ColoredPoint(100,200,0xFFFFFF);

Page 51: Java 技术与应用

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 : } ◆

Page 52: Java 技术与应用

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); ◆

Page 53: Java 技术与应用

53 / 57

大例子 - 【例 2-2 】正方形类

分析出的结果: 正方形类,它既具有边长、位置、边界颜

色和内部颜色等属性,又具有画图、擦图和移动等操作

Page 54: Java 技术与应用

54 / 57

大例子 设计出的结果 :

Page 55: Java 技术与应用

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( 边界颜色 );

Page 56: Java 技术与应用

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: }

Page 57: Java 技术与应用

57 / 57