570 likes | 719 Views
Java 技术与应用. - 面向对象技术概述. 西安交大 卫颜俊 2008 年 11 月 电子信箱: Mr.Java@163.com QQ: 610568018 网站 : 202.117.58.97/java. 主要内容. 面向对象技术概述 面 向对象的实现 ( 程序设计 ) ◆. 传统的结构化技术. 特征: 以数据为中心,线性和过程化的处理方式 每一步的开发都是在假定前一步完全规范和正确的基础上进行 缺点: 软件可重用性弱 软件可维护性差 无法使用组件技术 开发效率低 软件危机问题依然存在 ◆. 面向对象技术. 特征:
E N D
Java技术与应用 -面向对象技术概述 西安交大 卫颜俊 2008年11月 电子信箱:Mr.Java@163.com QQ: 610568018 网站: 202.117.58.97/java
主要内容 • 面向对象技术概述 • 面向对象的实现(程序设计)◆
传统的结构化技术 • 特征: • 以数据为中心,线性和过程化的处理方式 • 每一步的开发都是在假定前一步完全规范和正确的基础上进行 • 缺点: • 软件可重用性弱 • 软件可维护性差 • 无法使用组件技术 • 开发效率低 • 软件危机问题依然存在◆
面向对象技术 • 特征: • 以对象为中心,以任何事物都是对象为前提 • 对象、类、继承性、消息机制和多态性是面向对象技术的特征。 • 克服了结构化的诸多缺点 • 目前流行的设计工具: UML(统一建模语言) ◆
面向对象技术中的主要概念 • 对象(Object) : 对现实实体的抽象,定义实体的属性与方法。 • 类(Class) 描述具有相同属性和方法的对象的集合。 • 对象与类之间的关系 类定义该集合中每个对象的共同属性和方法, 一个对象只是类的一个实例。◆
面向对象技术中的主要概念 • 继承性 • 反应在类的层次结构上,下一级类承袭上一级类的内容。 • 消息机制 • 保证对象之间通过传递消息来建立联系,使对象之间建立联系更好的一种方式 • 多态性 • 反映了现实世界事物之间的动态相关性。 ◆
面向对象技术的基本活动 • 发现并且标识对象和类 事物(电脑、温度),角色(母亲、牧师),事件(中断、点击),作用(打电话、开会) • 描述对象和类之间的关系 • 关联( “use-a”)人与电脑 • 聚集(整体/部分关系, “has-a”)学校与学院 • 继承(属性和方法的继承, “is-a”)大学生与研究生 • 通过描述每个类的功能确定对象的行为等。 书:写书、印书、买书、卖书和读书◆
面向对象软件开发过程 • 面向对象分析(OOA) • 面向对象设计(OOD) • 面向对象实现(OOP) • 面向对象测试(OOT) • 面向对象维护(OOM) ◆
案例的功能 • 客人使用账号和密码登录成功以后,可以随意点菜,由系统将点好的菜单传送到厨师处。还可以查看厨师为自己炒好的菜单,并食用; • 厨师使用账号和密码登录成功以后,可以看到所有客人向其点的菜单,并炒好任意一个菜,由系统将炒好的菜单传送到客人; • 系统管理员可以统计每一位客人的消费金额,和每一位厨师的收入金额。 ◆
案例的分析结果 • 厨师类、菜系类、菜谱类、客人类和菜单类 ◆
案例的设计结果(1) • 厨师类、菜系类、菜谱类、客人类、菜单类和各个类的相关操作 ◆
案例的设计结果(2) • 系统的人机界面包括:客人面板类、客人窗口类、厨师面板类和厨师窗口类; • 数据管理包括:厨师表、菜系表、菜谱表、菜单表和客人表; • 任务管理包括:界面数据刷新线程。 ◆
面向对象的实现(OOP) OOP即Object-OrientedProgramming 上世纪60年代的simula语言 70年代第二代的smalltalk语言 80年代中后期的C++语言 90年代中后期的Java语言 OOP任务是使用一种面向对象的计算机语言把面向对象设计模型中的每个成分书写出来。 ◆
面向对象的实现的要点 对象、方法和类: • 对象具有属性和方法 • 同类的对象具有相同属性和方法 • 对象接收和发送对应事件(动作)的消息◆
面向对象实现中的基本概念 • 对象是相关状态和行为的软件绑定 • 类为建立对象的蓝图或原型 • 继承提供组织和构建软件的强大而自然的机制 • 接口是类与外部世界之间的契约 • 包是按逻辑方式组织类和接口的名字空间。 ◆
猫类 属性(数据) 名字 毛色 年龄 品种 习性 身长 身高 体重 主人 行为(方法) 吃 喝 跑 抓 散步 玩杂技 看电视 睡觉 ◆
猫类的书写 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: } ◆
OOP的优点总结 • 通过代码重用节省开发时间和成本 • 一个应用中的对象类可以用在另一个应用中 • 易于测试和调试 • 类作为单独模块独立测试 • 重用对象不必进一步测试◆
包的定义与使用 • 定义:package 包名; package chapter1.vector; public class Mosquito { int capacity; } • 使用:import 包名.{*|类|接口}; package chapter1.test; import chapter1.vector.Mosquito; class Test {} ◆
类的定义 类修饰符 class 类名 [<类型参数>] [extends 父类名] [implements 父接口名]{ 类体 } ◆
主要的类修饰符 • 无类修饰,表示该类的权限为friendly,位于同一个包中的类可以使用该类, • public,表示该类的权限为最大,称为公共类,任何其它类都可以使用该类, • abstract,表示该类为抽象类,不能直接定义其对象, • final,表示该类不能产生子类。 ◆
extends 父类名,表示正在定义的类继承了父类, • implements 父接口名,表示正在定义的类实现了父接口名。 ◆
举例 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 {} ◆
类的成员变量的定义 变量修饰符 类型 变量名 [,类型 变量名,…, 类型 变量名]; ◆
主要的成员变量修饰符 • 无变量修饰,表示该变量的权限为friendly,位于同一个包中的类可以使用该变量, • public,表示该变量的权限为最大,任何其它类都可以使用, • protected,表示该变量的权限为保护型,留给子类继承用, • private,表示该变量的权限为最小,只有该类内部可以使用, • static,表示该变量为静态的。在系统中只分配一次存储单元,是整个类的属性,而不归类的任何具体对象独有,即使用类的任何对象访问时,取相同的值,而使用类的任何对象去修改时,都是对同一个存储单元进行。应该使用类名作前缀,即“类名.变量名”来存取该属性, • final,表示该变量为常量,不可修改其值。 ◆
举例(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 : } ◆
举例(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 {} ◆
成员方法的定义 方法修饰符 返回类型 方法名(形式参数列表) throws 异常类列表{ 方法体 } ◆
主要的成员方法修饰符 • 无方法修饰,位于同一个包中的类可以使用该变量, • public,表示该方法的权限为最大,任何其它类都可以使用, • protected,表示该方法的权限为保护型,留给子类继承用, • private,表示该方法的权限为最小,只有该类内部可以使用, • static,表示该方法为静态的,直接通过类就可以使用, • final,表示该方法不可在子类中覆盖, • native,表示本地方法,由C/C++语言编写, • abstract,表示抽象方法,用在抽象类中, • synchronized,表示同步方法(用在线程方面)。◆
throws 异常类列表 方法体的格式如下: 代码块; return 返回值;◆
举例(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 : publicstaticfinal int getTotalMoves() {} 8 : publicabstract void int area(); 9 : } ◆
举例(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: } ◆
三种特殊方法的定义 • 构造方法 类名([参数列表]){ ……} • 析构方法 protected void finalize() throws Throwable { …...} • 主方法 public static void main (String args[]){ …… } ◆
构造方法 • 构造方法完成对象状态的初始化工作,其名字与类相同 • 如果在定义一个类时,定义了构造方法,则以定义的格式为准 • 如果未明确定义构造方法,则Java编译器会增加一个无形式参数的构造方法(称为缺省构造方法) • 而且当这个类是原生类(不继承任何其它类),增加的构造方法的方法体为空代码块 • 这个类存在父类时,则构造方法无参数且调用父类的构造方法。 ◆
子类没有定义构造方法时,自动继承父类不含参数的构造方法,并在创建新子类对象时自动执行子类没有定义构造方法时,自动继承父类不含参数的构造方法,并在创建新子类对象时自动执行 子类有自己的构造方法时,创建新子类对象时也要先执行父类不含参数的构造方法,再执行自己的构造函数 使用super(参数)方法可以显式调用父类的构造方法,且该调用语句必须是子类构造方法的第一个可执行语句。 一个类可能有多个构造方法 使用this(参数)方法调用同一个类的构造方法,且此时this应是第一个可执行语句◆
静态初始化器 完成静态数据成员的初始化工作 静态初始化器中的语句在类加载内存时执行,时间上先于构造方法执行 class Point { static int useCount; static int totaUseCount; static{ useCount=3; totaUseCount=useCount+6; } } ◆
举例 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: } ◆
方法重载 • 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;} 一个类中定义了几个同名方法,它们完成同一类操作,但是又有区别。◆
举例(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: } ◆
举例(2) 13: public void speak(String word, boolean reverse) { 14: if (reverse) { 15: System.out.println(new StringBuffer(word).reverse()); 16: } 17: else { 18: System.out.println(word); 19: } 20: } 21: } ◆
构造方法的重载(举例) 1 : class Point { 2 : int x, y; 3 : Point(int x, int y) { 4 : this.x = x; 5 : this.y = y; 6 : } 7 : } 8 : ◆
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: } ◆
内部类 定义在另一个类中的类一般称为嵌套类(nested classes),如果再强加一个限制,即其前面不加static标识符,则称为内部类(inner class) 内部类的作用: 主要应用在事件驱动的控制结构中 从逻辑上将类进一步编组,并控制其可见度◆
举例(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); ◆
举例(2) 12: } 13: } 14: } 15: 16: class Other { 17: Outer outer = new Outer(); 18: Outer.Inner inner = outer.new Inner(); 19: } ◆
对象的定义 Java语言中的对象包括三个状态,定义、使用和释放,其中最后一个状态由Java的GC机制来完成,目的是回收无用对象。前两个状态由程序员来完成。 修饰符 类名 [<类型参数>] 对象名=new类名 [<类型参数>](参数列表); ◆
举例(1) ColoredPoint coloredPoint=new ColoredPoint(100,200,0xFFFFFF); ◆