1、1 / 57,Java技术与应用,面向对象技术概述,西安交大 卫颜俊 2008年11月电子信箱:Mr.JQQ: 610568018网站: 202.117.58.97/java,2 / 57,主要内容,面向对象技术概述面向对象的实现(程序设计) ,3 / 57,传统的结构化技术,特征:以数据为中心,线性和过程化的处理方式每一步的开发都是在假定前一步完全规范和正确的基础上进行缺点:软件可重用性弱软件可维护性差无法使用组件技术开发效率低软件危机问题依然存在,4 / 57,面向对象技术,特征:以对象为中心,以任何事物都是对象为前提对象、类、继承性、消息机制和多态性是面向对象技术的特征。克服了结构化的诸
2、多缺点目前流行的设计工具: UML(统一建模语言) ,5 / 57,面向对象技术中的主要概念,对象(Object) :对现实实体的抽象,定义实体的属性与方法。类(Class)描述具有相同属性和方法的对象的集合。 对象与类之间的关系类定义该集合中每个对象的共同属性和方法, 一个对象只是类的一个实例。 ,6 / 57,面向对象技术中的主要概念,继承性反应在类的层次结构上,下一级类承袭上一级类的内容。消息机制保证对象之间通过传递消息来建立联系,使对象之间建立联系更好的一种方式 多态性反映了现实世界事物之间的动态相关性。 ,7 / 57,面向对象技术的基本活动,发现并且标识对象和类事物(电脑、温度),
3、角色(母亲、牧师),事件(中断、点击),作用(打电话、开会) 描述对象和类之间的关系关联( “use-a” )人与电脑聚集(整体/部分关系, “has-a” )学校与学院继承(属性和方法的继承, “is-a” )大学生与研究生通过描述每个类的功能确定对象的行为等。书:写书、印书、买书、卖书和读书,8 / 57,面向对象软件开发过程,面向对象分析(OOA)面向对象设计(OOD)面向对象实现(OOP)面向对象测试(OOT)面向对象维护(OOM) ,9 / 57,案例:虚拟酒店点菜系统的分析,10 / 57,案例的功能,客人使用账号和密码登录成功以后,可以随意点菜,由系统将点好的菜单传送到厨师处。还
4、可以查看厨师为自己炒好的菜单,并食用;厨师使用账号和密码登录成功以后,可以看到所有客人向其点的菜单,并炒好任意一个菜,由系统将炒好的菜单传送到客人;系统管理员可以统计每一位客人的消费金额,和每一位厨师的收入金额。 ,11 / 57,案例的分析结果,厨师类、菜系类、菜谱类、客人类和菜单类,12 / 57,案例的设计结果(1),厨师类、菜系类、菜谱类、客人类、菜单类和各个类的相关操作,13 / 57,案例的设计结果(2),系统的人机界面包括:客人面板类、客人窗口类、厨师面板类和厨师窗口类;数据管理包括:厨师表、菜系表、菜谱表、菜单表和客人表;任务管理包括:界面数据刷新线程。 ,14 / 57,面向
5、对象的实现(OOP),OOP即Object-OrientedProgramming上世纪60年代的simula语言70年代第二代的smalltalk语言80年代中后期的C+语言90年代中后期的Java语言OOP任务是使用一种面向对象的计算机语言把面向对象设计模型中的每个成分书写出来。 ,15 / 57,面向对象的实现的要点,对象、方法和类:对象具有属性和方法同类的对象具有相同属性和方法对象接收和发送对应事件(动作)的消息,16 / 57,面向对象实现中的基本概念,对象是相关状态和行为的软件绑定类为建立对象的蓝图或原型继承提供组织和构建软件的强大而自然的机制接口是类与外部世界之间的契约包是按逻辑
6、方式组织类和接口的名字空间。 ,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: vo
7、id 玩杂技() 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;clas
8、s Test ,23 / 57,类的定义,类修饰符 class 类名 extends 父类名 implements 父接口名 类体 ,24 / 57,主要的类修饰符,无类修饰,表示该类的权限为friendly,位于同一个包中的类可以使用该类,public,表示该类的权限为最大,称为公共类,任何其它类都可以使用该类,abstract,表示该类为抽象类,不能直接定义其对象,final,表示该类不能产生子类。 ,25 / 57,extends 父类名,表示正在定义的类继承了父类,implements 父接口名,表示正在定义的类实现了父接口名。 ,26 / 57,举例,1 : package poin
9、ts;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,表示该变量的权限为最大,任何其它
10、类都可以使用,protected,表示该变量的权限为保护型,留给子类继承用,private,表示该变量的权限为最小,只有该类内部可以使用,static,表示该变量为静态的。在系统中只分配一次存储单元,是整个类的属性,而不归类的任何具体对象独有,即使用类的任何对象访问时,取相同的值,而使用类的任何对象去修改时,都是对同一个存储单元进行。应该使用类名作前缀,即“类名.变量名”来存取该属性,final,表示该变量为常量,不可修改其值。 ,29 / 57,举例(1),1 : package points;2 : public class Point 3 : private int x, y;4 : p
11、rotected 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 Test14: 15: import points.*;16: class Point4d extends Point ,31 / 57,成员方法的定义,方法修饰符 返回类型 方法名(形式参数列表) thr
12、ows 异常类列表 方法体 ,32 / 57,主要的成员方法修饰符,无方法修饰,位于同一个包中的类可以使用该变量,public,表示该方法的权限为最大,任何其它类都可以使用,protected,表示该方法的权限为保护型,留给子类继承用,private,表示该方法的权限为最小,只有该类内部可以使用,static,表示该方法为静态的,直接通过类就可以使用,final,表示该方法不可在子类中覆盖,native,表示本地方法,由C/C+语言编写,abstract,表示抽象方法,用在抽象类中,synchronized,表示同步方法(用在线程方面)。 ,33 / 57,throws 异常类列表方法体的格式
13、如下:代码块;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
14、: ,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 .主方法pub
15、lic static void main (String args) ,37 / 57,构造方法,构造方法完成对象状态的初始化工作,其名字与类相同如果在定义一个类时,定义了构造方法,则以定义的格式为准如果未明确定义构造方法,则Java编译器会增加一个无形式参数的构造方法(称为缺省构造方法)而且当这个类是原生类(不继承任何其它类),增加的构造方法的方法体为空代码块这个类存在父类时,则构造方法无参数且调用父类的构造方法。 ,38 / 57,子类没有定义构造方法时,自动继承父类不含参数的构造方法,并在创建新子类对象时自动执行子类有自己的构造方法时,创建新子类对象时也要先执行父类不含参数的构造方法,再
16、执行自己的构造函数使用super(参数)方法可以显式调用父类的构造方法,且该调用语句必须是子类构造方法的第一个可执行语句。 一个类可能有多个构造方法 使用this(参数)方法调用同一个类的构造方法,且此时this应是第一个可执行语句,39 / 57,静态初始化器,完成静态数据成员的初始化工作静态初始化器中的语句在类加载内存时执行,时间上先于构造方法执行class Point static int useCount; static int totaUseCount; static useCount=3; totaUseCount=useCount+6; ,40 / 57,举例,1 : class
17、 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,i
18、nt 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(St
19、ring word) 11: System.out.println(word);12: ,43 / 57,举例(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: ,44 / 57,构造方法的重载(举例),1 : class Point 2 : int x, y;3 : Point(in
20、t 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
21、: ,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:
22、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=ne
23、w ColoredPoint(100,200,0xFFFFFF); ,51 / 57,举例(2),1 : class Adder 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 adder1= new Adder (3,5);adder1.x=3; Adder adder2= new Adder (3.3,5.5);adder1.y=5;Adder adder2= new Adder (3.3 ,
24、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 正方形
25、类(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().setColo
26、r(内部颜色);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,本讲结束!,谢谢!,