第一篇:Java 教案-第08章 对象和类
第8章 对象和类
8.1 介绍(Introduction)
虽然我们已经学过了Java基础知识,如选择,循环,方法和数组,但这些Java的特征对于我们开发图形用户接口和大规模的软件系统还远远不够。假设我们想开发如图所示的GUI(goo-ee),我们如何编写?
从这章开始我们开始介绍面向对象编程,方便我们开发Gui和大规范软件系统。8.2 定义类为Object类型
面向对象编程(Object-Oriented Programming OOP)就是利用对象进行编写。对象object代表现实世界中独一无二的一个实体。如,一个学生,一张桌子,一个按钮,甚至一个贷款都可以被看着是对象。一个对象有它自己独有的特征,状态和行为。
1.2.对象的状态(也称属性或特征)用包含当时数据的数据字段来表示。如一个圆对象,有半径这个数据字段,它就是圆的特征和属性。一个矩形有高和宽两个特征,作为矩形对象的2个字段。对象的行为(也称动作或操作)通过方法定义。对象调用方法就是高手这个对象要执行一个动作。
如可以为圆对象定义一个getArea()方法,那么圆对象调用getArea()方法来返回圆的面积。
我们可以用一个普通的类来定义一个同类型的对象。一个类就是一个模板,一个蓝图或合同,它们定义一个对象的数据字段和方法。对象就是这个类的实例。我们可以为类创建若干个对象,创建对象就是所谓的实例化。对象和实例经常相互交叉。类和对象的关系就像是一个苹果派和一个苹果派配方一样。我们可以利用配方制作很多苹果派,每个苹果派都不完全一样,有各自的作用。如图显示了一个Circle类和它的三个对象。
一个Java类用变量来定义数据字段,用方法来定义操作或动作。类提供一种非常特别类型的方法,称之为构造方法,也称构造器,这个构造方法的调用会创建一个新对象。虽然一个构造方法可以执行任何动作,但构造方法的设计是用来为对象的数据字段和方法进行初始化的,如下圆类的定义。
Circle类和我们之前见过的类都不同,它没有main方法,也不能被运行,它仅仅是定义了一个圆对象类。包含main方法的类,为了方便,以后我们称为主类。类和对象用UML符号描述如下。
8.3 定义类和创建对象
程序创建3个圆对象,半径分别为1.0,2.5,125,显示每一个圆对象的半径和面积,改变第二个圆的半径,并显示新面积和半径。
程序包含2个类,第一个类为TestCircle1为主类,它存在的意义就在于测试第二个类。我们可以把这2个类放在同一个文件中,但只有一个类是公共类,而且文件的名字要与公共类的名字一致。因此这个文件的名字为TestCircle1.java,因为TestCircle1是public的。
有很多种方式来编写Java程序,例如,我们可以把2个类写成一个类,如下:
再举一个例子,电视机类,每个电视机都是一个对象包含当前频道,当前音量和开关状态;还包含一系列行为(变换频道,调整音量,进行开关电源)。UML类图来表示电视机类。
8.4 利用构造器构造对象
构造方法是一类特殊的方法,它有3个特征: 1.构造方法的名字必须与类名一致
2.构造方法没有返回类型,甚至不是void类型。
3.构造方法只有在对象创建的时候才通过new来调用,主要用来为对象进行初始化。
构造方法可以被重载,使得对象可以以不同的初始数据被创建。如下方法不是构造方法,因为之前的void。
用new来构造一个类的对象,方式如下:new ClassName(arguments);例如,new Circle()会用没有参数的构造方法来创建一个Circle类对象。而new Circle(25);会用带参数的构造方法来创建一个Circle类的对象。一个类通常会提供一个没有参数的构造方法,因此一个类可以不定义构造方法,也称默认的构造方法,也只有当系统没有显式定义构造方法的时候在自动提供。8.5 通过引用变量来访问对象
新创建的对象被分配了内存空间,可以通过变量引用来进行访问。
8.5.1 引用变量和引用类型
对象通过对象引用变量还进行访问,引用变量包含对这个对象的引用,这个引用变量的声明如下:
类就是我们程序员定义的数据类型,类是引用数据类型,这就意味着这个类类型的变量可以指向这个类的一个实例。如下语句声明了一个Circle类型的引用变量myCircle。
Circle myCircle;这个myCircle就是对一个Circle对象的一个引用,下面的语句就是创建一个对象,并使得这个引用变量指向这个对象。
可以把引用变量的声明与对象的创建放在一条语句中:
在Java中,数组被看做是对象类,是引用数据类型,用new创建,而且也要声明它的引用变量。
8.5.2 访问对象的数据和方法
当对象被创建以后,它的数据是能够被访问的,它的方法也可以通过点操作符进行调用的。这个点操作符称为对象成员访问符(.)。1.objectRefVar.dataField引用对象中的数据段。2.objectRefVar.method(arguments)调用对象的方法。
如之前我们举例中,myCircle.radius,myCircle.getArea()。数据段radius称实例变量,因为它依赖于特定的实例,getArea方法称实例方法,因为只有特定的实例才能调用它。
注意:我们之前可以使用Math.methodName(arguments);(如Math.pow(3, 2.5))来调用Math 类中的方法,那么我们能否用Circle.getArea();来调用getArea方法呢?答案是否定的。因为在Math中所有的方法都是static方法,称为类方法,静态方法,而getArea是实例方法,必须先实例化(创建对象),才能被调用。
我们可以创建匿名对象来调用实例方法,即不为对象创建引用变量,以后也不可能用到这个对象,如:
8.5.3 引用数据字段和null值
数据字段可以是引用类型的,如String,数组,或其他类类型。如下语句:
如果一个数据字段是引用数据类型,它不指向任何对象,它为一个代表空引用的Java特殊值null。Null是
一个常数就如true和false一样。一个引用数据类型的默认值为null,就如数值类型数据的默认值为0一样。但要注意的是Java不会为方法内的局部变量分配默认值。
下面的例子会编译出错,原因是x和y两个变量没有缺省值(方法中的局部变量,不预设缺省值)。
8.5.4 基本数据类型变量和引用类型变量的区别
每个变量都是一个存储空间保存着的数据的代表,当声明一个变量时,就是通知编译器这个变量将要保存并代表什么类型的数据。对于基本数据类型,就是基本
数据类型的数值;而对于引用数据类型的变量,这个值是一个对它代表对象的一个地址引用。如下图所示区别。
当把一个变量赋值给另外一个变量是,另外一个变量必须是相同类型。对于基本数据类型,一个变量的实际
值被分配给另外一个变量,对于引用数据类型,这个变量的引用分配给另外一个变量,如图。
8.6 使用Java 类库
前面定义了Circle1,并为这个类创建了对象。我们会经常的Java类库中的类来开发程序,这节会给出几个实用Java类库的例子。8.6.1 Data 类
在第二章我们已知可以使用System.currentTimeMillis()获得当前的毫秒数,然后经过一系列的计算最终猜得到当前的时间,日期。Java提供了系统独立的,封装的类Java.util.Date,可以直接获得当前的时间,如图。
我们可以使用Date类没参数的构造方法来创建当前的日期和时间的实例,这个实例的getTime()方法会返回一个从格里尼治标准时间1970年1月1日0时到当前时间的毫秒数,它的toString方法会以字符串的时间返回日期和时间,如下代码:
这个Date类还有另外一个构造方法Date(long elapseTime),它使用给定的常整型毫秒数(相对于格林威治时间)来构造一个对象实例,8.6.2 Random类
我们之前使用Math.random()方法来获得一个[0-1)随机数。我们也可以通过使用Java.util.Random类来获得随机数,如下生成各种类型的随机数。
当我们创建Random对象时,我们必须给出一个特定的种子或使用缺省的种子,无参数的构造方法用当前时间的毫秒数创建一个Random对象。如果两个Random对象的种子相同,则生成的随机数也是完全一致的。如下程序代码的两个Random对象都是使用3这个种子来创建,他们具有相同的随机数序列。
注意:生成相同序列随机数在软件测试等相关软件应用当中非常有用处。8.6.3 显示GUI组件
Graphical User Interface(GUI)组件是学习和教授面向对象编程最有效的例子。这节简单介绍一下,在第12章再详细讲解。
当我们开发图形用户程序的时候,会用到很多Java类,诸如Jframe,Jbutton,JradioButton,JcomboBox和Jlist等类来创建框架,按钮,单选按钮,复选框,下拉列表等。如下用Jframe类创建的2个窗口。
当然,我们可以在这些窗口中添加很多图形用户组件,如各种按钮,菜单等,这些组件定义的类如下例所示。
8.7 静态变量,常量和方法
通常我们在程序中定义的变量,都是实例变量,这些变量和它对应的类创建的对象相关联。这些变量不能在同一个类创建的对象间共享,如下例。
circle1中的边界radius和circle2中的radius是不相同的,它们存放在不同的内存单元。它们在各自单元中的改变不影响另外一个。
当我们想让类创建的所有对象共享数据,那么这个数据的定义就要用静态变量(static variables),也称类变量(class variables)。类变量的存储在一个共享单元,因此每个对象中修改了静态变量,所有的对象都会受到影响。
Java不仅支持静态变量,还支持静态方法,静态方法不需要创建对象实例就可以用类名调用。
我们修改一下Circle类,加入一个静态变量numberOfObjects来累计类对象个数。如图新的Circle类的UML 模型。
如果要定义静态变量和方法,在变量或方法创建时要在之前加上static修饰符,如下定义。
类定义的常量会被所有的对象共享,因此常量被声明为final static,如之前的常量Math.PI的定义。
实例方法和实例变量都属于实例,只有实例创建以后才存在。类方法或类变量可以通过它的引用变量即类名直接引用。如下例显示如何使用实例变量和类变量,如何使用类方法以及使用后的影响。
当编译TestCircle2.java,Circle2.java如果在上次修改后还没有编译,Java编译器会自动的编译Circle2.java。静态变量和静态方法可以在实例方法和类方法中被使用,但实例变量和实例方法不可以被静态方法使用,只能在实例方法中被使用。如下代码时错误的。
设计指导:当我们创建变量或方法是,它应该是实例的还是类的,我们如何决定?如果一个变量或方法是依靠特定实例的,则应该创建实例变量或方法。如果一个变量或方法不依赖于类创建的任意对象实例,则它应该被创建成类变量或方法。在实践过程中,经常会犯这类错误,如下程序。
8.8 可视化修饰符
我们在前面的类,方法或变量的定义时都是用了public可视化修饰符,说明它可以被任意其他的类读取,如果没有任何修饰符称为默认的,则在同一个包中的其他类可以读取,称为包可见,包隐私或包可进入。包就是组织各种类的文件夹,如果我们想把某个类放到特定的包中,则需要在程序的第一句(所有非注释,非空白语句的第一句)加上: package packageName;如果一个类在定义时没有任何包声明语句,则会被存放在默认包。Java强烈建议程序员在类前加上包声明,而不是都放在默认包中。但为了方便,简单,我们以后讲解的程序都放在默认包中。
除了public和默认修饰符外,还有private和protected两个修饰符。我们先介绍private修饰符,在第11章再讲解protected修饰符。
Privite修饰符使得方法和变量只能被类内的方法使用,或只能它所定义的类中被使用,如下例子。
如果一个类在定义时没有添加任何修饰符,如图访问权限。
可见性修饰符定义了类中的变量和方法是否可被类外的其他类访问。对于类内的访问权限没有明确要求。如图所示。
Private修饰符只能修饰类成员(类中定义的变量或方法),public可以修饰一个类或类中成员。但不能使用public或private来修饰局部变量,否则会产生编译错误。
在大多数情况下构造方法是public的,但如果你禁止用户创建类的实例,这时候就需要private的构造方法。如没有必要创建Math类的实例,因为它的变量和方法都是static的,为了阻止用户创建Math类对象,构造方法的定义为:private Math(){}.8.9 数据封装
在Circle2类中定义的变量radius和numberOfObject可以直接被修改(myCircle.radius=5或Circle2.numberOfObjects=10),这种编程便是不太好,有2个原因:
1.2.数据很容易被篡改,如numberOfObjects是对对象的计数,却容易被错误的修改成任意值:Circle2.numberOfObjects=10。类的维护很困难同时类很容易被出现各种小错误,难于调试。假设我们在其他程序使用了Circle2后,修改这个类来保证半径为非负,则我们不仅要修改这个类,而且还要修改所有要使用它的程序,因
为使用它的程序之前都可以直接修改半径(myCircle.radius=-5)。
为了防止对变量的直接修改访问,我们应该声明变量为private,这就是对变量数据的封装。封装之后外面的类就不能直接访问变量了,但有时用户程序需要得到变量的值,因此定义一个方法来返回它的值,称为get方法getter。为了使得变量的值可以更新,类要提供set方法setter来设置新的变量值。Get方法如下形式:
如果返回类型是boolean,get方法应该如下定义:
Set方法如下定义形式:
我们新建一个circle类,定义radius为private,它对应的setter或getter方法如下:
类的代码如下:
这样我们就能控制私有变量的访问和修改,即使以后修改类,也不用修改使用它的程序,使得程序容易维护。
如下程序使用了Circle类创建的对象,并修改半径。
因此numberOfObject就不能恶意被修改了,如不能把它的值设置为100,除非真的创建100个对象才可以。8.10 传递对象参数
我们可以传递一个对象给方法,像数组一样,传递对象实际上是传递这个对象的引用,如下代码。
如下是具有2个参数的方法,用来对比对象传递和基本数据类型传递数据的区别。
8.11 对象数组
前面我们学到的数组中保存的都是基本数据类型或数组类型,数组中也可以保存对象类型,如下例创建了一个保存10个Circle类型对象的数组。
为了初始化这个数组,我们可以使用for循环。
一个对象类型的数组,实际上就是一个引用变量的数组,如图,circleArray指向整个数组,而circleArray[0]指向一个Circle对象。
用new创建完一个数组后,数组中的每个元素的指向值默认我null,直到赋初值才真正指向对象。如图程序使用对象数组的例子,程序累计一系列圆的面积,包含5个对象的数组,随机初始化数组指向的圆对象半径,最后显示面积总和。
第二篇:java面向对象程序设计教案
武汉大学珞珈学院 系/教研室 Java 面 向 对 象 程 序 设 计 课 教 案
主讲教师:熊春秀 编写时间:2011-4-30
第一章:概述
第 1、2 节:面向对象的基本概念、面向对象程序设计概述 授课时间:2011-2-
22、23
计划学时数:1 教学任务与目的:让学生理解面向对象的基本概念 教学重点:掌握面向对象的基本概念 教学难点:理解面向对象程序设计的方法 教学方法:多媒体+板书 参考书目:《面向对象程序设计导论》,[美]C.Thomas wu著,电子工业出版社 专业词汇:Java虚拟机、Applet程序 备注
第二章:Java特点及运行环境
第 1、2、3 节:Java语言特点、Java应用程序及运行环境、Java Applet程序及运行环境 授课时间:2011-2-
22、23
计划学时数:3 教学任务与目的:让学生学会JDK的下载、安装与环境配置。教学重点:掌握编译和执行Java程序的基本步骤
教学难点:理解Java程序的入口并能够通过命令行传递参数 教学方法:多媒体+板书 参考书目:《面向对象程序设计导论》,[美]C.Thomas wu著,电子工业出版社 专业词汇:JDK、lib、bin 备注 第三章:Java语言基础
第 1、2 节:Java程序的构成、数据类型、表达式以及流程控制语句 授课时间:2011-3-
1、2
计划学时数:3 教学任务与目的:让学生学会Java基本的数据类型和表示方法、数值类型的运算、逻辑运算和比较、条件执行语句(包括三种条件语句和switch语句)、循环控制语句(包括for、while、do while循环及相应的辅助语句)、字符串类String和BufferString以及数组的声明及使用。
教学重点:掌握Java基本的数据类型和表示方法
教学难点:理解Java程序的循环控制语句(包括for、while、do while循环及相应的辅助语句)
教学方法:多媒体+板书 参考书目:《Java语言与面向对象程序设计》,印旻编著,清华大学出版社 专业词汇:变量、数据类型、循环控制语句 备注 第三章:Java语言基础 第 3 节:Java与C比较
授课时间:2011-3-
8、9
计划学时数:3 教学任务与目的:让学生在C语言的基本上进一步学习Java语言。教学重点:掌握Java语言与C语言的区别与联系。教学难点:理解Java语言在C语言上的改进。教学方法:多媒体+板书 参考书目:《Java2参考大全(第四版)》,[美]Herbert Schildt著,张玉清、吴浦峰、尚勇等译,清华大学出版社。专业词汇:Java、C 备注 第四章:抽象、封装与类
第 1 节:抽象、封装与Java类的概念
授课时间:2011-3-
15、16
计划学时数:3 教学任务与目的:让学生学会面向对象的基本特征、掌握如何定义一个类以及如何生成对象、深入掌握方法的定义及技巧、深入掌握类的访问权限与封装机制、深入掌握包的定义与包的使用方法。
教学重点:掌握类的定义与对象的生成。教学难点:理解类的抽象与封装机制。教学方法:多媒体+板书 参考书目:《Java2 实用教程》,耿祥义、张跃平编著,清华大学出版社。专业词汇:抽象、封装、类 备注 第四章:抽象、封装与类 第 2 节:系统定义的类
授课时间:2011-3-
22、23
计划学时数:3 教学任务与目的:让学生学会使用系统定义的类,并掌握与用户自定义类的区别。教学重点:掌握如何定义所需要的类。
教学难点:熟悉Java平台定义了哪些经常要用到、而且满足我们需要的类。教学方法:多媒体+板书 参考书目:《Java2 实用教程》,耿祥义、张跃平编著,清华大学出版社。专业词汇:系统定义的类、用户自定义类 备注 第四章:抽象、封装与类
第 3 节:类、域和方法的修饰符
授课时间:2011-3-
29、30
计划学时数:3 教学任务与目的:让学生学会类的声明。
教学重点:掌握如何定义类的修饰和方法的修饰符。教学难点:熟悉类的变量的定义与使用方法。教学方法:多媒体+板书 参考书目:《Java2 实用教程》,耿祥义、张跃平编著,清华大学出版社。专业词汇:成员变量、类变量、成员方法、类方法 备注 第五章:继承与多态
第 1、2 节:Java的继承与派生、域的继承与隐藏 授课时间:2011-4-
5、6
计划学时数:3 教学任务与目的:让学生全面掌握面向对象的基本特征、掌握如何使用继承性来到达软件的重用、深入掌握继承过程中域的隐藏和方法的覆盖技巧。教学重点:掌握如何使用继承性来到达软件的重用。教学难点:熟悉继承过程中域的隐藏和方法的覆盖技巧。教学方法:多媒体+板书 参考书目:《Java2 实用教程》,耿祥义、张跃平编著,清华大学出版社。专业词汇:继承派生、域、隐藏 备注 第五章:继承与多态
第 3、4 节:方法的继承、重载与覆盖、this与super、构造函数的继承与重载 授课时间:2011-4-
12、13
计划学时数:3 教学任务与目的:让学生通过继承可以更有效地组织程序结构,明确类之间的关系,并充分利用已有的类来创建新类,通过继承可以实现代码的重用,以完成更复杂的设计、开发。教学重点:掌握类的重载与覆盖的区别与联系。教学难点:熟悉类的重载与覆盖使用方法。教学方法:多媒体+板书 参考书目:《Java语言与面向对象程序设计》,印旻编著,清华大学出版社。专业词汇:继承、重载、覆盖、this、super 备注 第五章:继承与多态
第 5、6 节:多态性的实现、接口声明与实现 授课时间:2011-4-
19、20
计划学时数:3 教学任务与目的:让学生深入掌握抽象类和抽象方法的定义,掌握多态通过统一多个相关类的对外接口,在运行时根据不同的情况执行不同的操作,提高类的抽象度和灵活性,深入掌握接口的定义和使用技巧。
教学重点:熟悉多态性实现的两种方式以及接口的实现。教学难点:熟悉多态性与接口的实现方法。教学方法:多媒体+板书 参考书目:《Java语言与面向对象程序设计》,印旻编著,清华大学出版社。专业词汇:多态性、接口 备注 第六章:工具类与算法
第 1、2 节:语言基础类库、Applet类与小程序的基本原理 授课时间:2011-4-
26、27
计划学时数:3 教学任务与目的:深入了解Applet生命周期的主要方法和特点、熟练掌握Applet程序的编写方法、深入了解Applet的安全机制及其合理运用。教学重点:熟练掌握Applet程序的编写方法。
教学难点:深入了解Applet的安全机制及其合理运用。教学方法:多媒体+板书 参考书目:《Java语言与面向对象程序设计》,印旻编著,清华大学出版社。专业词汇:Applet、生命周期 备注 第六章:工具类与算法
第 3、4 节:数组、字符串、常用算法
授课时间:2011-5-
3、4
计划学时数:3 教学任务与目的:让学生学会字符串类String和BufferString、数组的声明及使用。教学重点:熟练掌握字符串与数组的使用方法。教学难点:深入了解数组的使用方法。教学方法:多媒体+板书 参考书目:《Java语言与面向对象程序设计》,印旻编著,清华大学出版社。专业词汇:数组、字符串 备注 第七章:用户图形界面的设计
第 1、2 节:用户自定义成分、事件驱动设计 授课时间:2011-5-
10、11
计划学时数:3 教学任务与目的:让学生学会使用面向对象的程序设计方法构建图形用户界面、深入了解抽象窗口工具包(AWT)、掌握事件处理基本原理和方法。教学重点:熟练掌握图形用户界面的开发方法。教学难点:深入了解图形界面的各种事件。教学方法:多媒体+板书 参考书目:《Java语言与面向对象程序设计》,印旻编著,清华大学出版社。专业词汇:AWT、GUI 备注 第七章:用户图形界面的设计
第 3、4 节:GUI对象,包括:按钮、文本框、鼠标、键盘等事件的处理、布局设计 授课时间:2011-5-
17、18
计划学时数:3 教学任务与目的:让学生深入了解GUI构件及掌握布局控制方法、熟练掌握菜单和对话框、掌握简单绘图方法。
教学重点:熟练使用Java语言提供的布局管理器来管理组件在容器中的布局。教学难点:深入了解组件在程序中安排中位置和大小使用方法。教学方法:多媒体+板书 参考书目:《Java语言与面向对象程序设计》,印旻编著,清华大学出版社。专业词汇:布局管理器、容器 备注 第八章:Java高级编程
第 1、2、3节:异常处理、多线程机制、Java程序对网上资源的访问 授课时间:2011-5-
24、25
计划学时数:3 教学任务与目的:让学生深入理解多线程的基本概念、熟练掌握创建线程的两种基本方法、熟练处理线程的同步问题和死锁问题、深入理解异常的基本概念、熟悉和掌握Java平台定义异常类、熟练掌握创建自定义异常类的方法。教学重点:熟练掌握创建线程的两种基本方法。教学难点:深入了解线程的同步问题和死锁问题。教学方法:多媒体+板书 参考书目:《Java语言与面向对象程序设计》,印旻编著,清华大学出版社。专业词汇:同步、死锁、多线程、异常
第三篇:java面向对象的学习心得
Java面向对象的学习心得
大三的时候学校组织我们去苏州NIIT参加四个月的java实训,我开始系统的学习期java,之前大学的时候学的比较宽泛,没有专门的正对java的学习。
首先我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭,因为我早以习惯用C来编写程序,很欣赏C的简洁性和高效性,喜欢C简练而表达能力丰富的风格,特别忍受不了Java运行起来慢吞吞的速度,相对冗长的代码,而且一个很简单的事情,要写好多类,一个类调用一个类,心里的抵触情绪很强。
我对Java的面向对象的特性琢磨良久,自认为有所领悟,也开始有意识的运用OOP风格来写程序,然而还是经常会觉得不知道应该怎样提炼类,面对一个具体的问题的时候,会觉得脑子里千头万绪的,不知道怎么下手,一不小心,又会回到原来的思路上去。
举个例子,要发广告邮件,广告邮件列表存在数据库里面。倘若用C来写的话,一般会这样思考,先把邮件内容读入,然后连接数据库,循环取邮件地址,调用本机的qmail的sendmail命令发送。
然后考虑用Java来实现,既然是OOP,就不能什么代码都塞到main过程里面,于是就设计了三个类:
一个类是负责读取数据库,取邮件地址,调用qmail的sendmail命令发送; 一个类是读邮件内容,MIME编码成HTML格式的,再加上邮件头;
一个主类负责从命令读参数,处理命令行参数,调用发email的类。
把一件工作按照功能划分为3个模块分别处理,每个类完成一件模块任务。
仔细的分析一下,就会发现这样的设计完全是从程序员实现程序功能的角度来设计的,或者说,设计类的时候,是自低向上的,从机器的角度到现实世界的角度来分析问题的。因此在设计的时候,就已经把程序编程实现的细节都考虑进去了,企图从底层实现程序这样的出发点来达到满足现实世界的软件需求的目标。
这样的分析方法其实是不适用于Java这样面向对象的编程语言,因为,如果改用C语言,封装两个C函数,都会比Java实现起来轻松的多,逻辑上也清楚的多。
我觉得面向对象的精髓在于考虑问题的思路是从现实世界的人类思维习惯出发的,只要领会了这一点,就领会了面向对象的思维方法。
举一个非常简单的例子:假使现在需要写一个网页计数器,客户访问一次页面,网页计数器加1,计数器是这样来访问的后台有一个数据库表,保存每个id(一个id对应一个被统计访问次数的页面)的计数器当前值,请求页面一次,对应id的计数器的字段加1(这里我们忽略并发更新数据库
表,出现的表锁定的问题)。
如果按照一般从程序实现的角度来分析,我们会这样考虑:首先是从HTTP GET请求取到id,然后按照id查数据库表,获得某id对应的访问计数值,然后加1,更新数据库,最后向页面显示访问计数。
现在假设一个没有程序设计经验的人,他会怎样来思考这个问题的呢?他会提出什么样的需求呢?他很可能会这样想:
我需要有一个计数器,这个计数器应该有这样的功能,刷新一次页面,访问量就会加1,另外最好还有一个计数器清0的功能,当然计数器如果有一个可以设为任意值的功能的话,我就可以作弊了。
做为一个没有程序设计经验的人来说,他完全不会想到对数据库应该如何操作,对于HTTP变量该如何传递,他考虑问题的角度就是我有什么需求,我的业务逻辑是什么,软件应该有什么功能。
按照这样的思路(请注意,他的思路其实就是我们平时在生活中习惯的思维方式),我们知道需要有一个计数器类 Counter,有一个必须的和两个可选的方法:
getCount()// 取计数器值方法
resetCounter()// 计数器清0方法
setCount()// 设计数器为相应的值方法
把Counter类完整的定义如下:
public class Counter {
public int getCount(int id){}
public void resetCounter(int id){}
public void setCount(int id, int currentCount){}
}
解决问题的框架已经有了,来看一下如何使用Counter。在count.cgi里面调用Counter来计数,程序片断如下:
// 这里从HTTP环境里面取id值
...Counter myCounter = new Counter();// 获得计数器
int currentCount = myCounter.getCount(id);// 从计数器中取计数
// 这里向客户浏览器输出
...程序的框架全都写好了,剩下的就是实现Counter类方法里面具体的代码了,此时才去考虑具体的程序语言实现的细节,比如,在getCount()方法里面访问数据库,更新计数
值。
从上面的例子中看到,面向对象的思维方法其实就是我们在现实生活中习惯的思维方式,是从人类考虑问题的角度出发,把人类解决问题的思维方式逐步翻译成程序能够理解的思维方式的过程,在这个翻译的过程中,软件也就逐步被设计好了。
在运用面向对象的思维方法进行软件设计的过程中,最容易犯的错误就是开始分析的时候,就想到了程序代码实现的细节,因此封装的类完全是基于程序实现逻辑,而不是基于解决问题的业务逻辑。
学习JDBC编程的经典错误问法是:“我怎样封装对数据库的select操作?”
面向对象的设计是基于解决业务问题的设计,而不是基于具体编程技术的设计。我不会去封装select语句的,我只封装解决问题的业务逻辑,对数据库的读取是在业务逻辑的编码实现阶段才去考虑的问题。
回过头看上面那个发广告邮件的例子,应该如何应用面向对象的思维方法呢?
对于一个邮件来说,有邮件头,邮件体,和邮件地址这三个属性,发送邮件,需要一个发送的方法,另外还需要一个能把所有邮件地址列出来的方法。所以应该如下设计:
类JunkMail
属性:
head
body
address
方法:
sendMail()// 发送邮件
listAllMail()// 列邮件地址
用Java来表示:
public class JunkMail {
private String head;
private String body;
private String address;
public JunkMain(){ // 默认的类构造器
// 从外部配置文件读邮件头和邮件体
this.head=...;
this.body=...;
}
public static boolean sendMail(String address){
// 调用qmail,发送email
}
public static Collection listAllMail(){
// 访问数据库,返回一个邮件地址集合}
}
当把JunkMail设计好了以后,再调用JunkMail类完成邮件的发送,将是非常轻松的事情。
如果说传统的面向过程的编程是符合机器运行指令的流程的话,那么面向对象的思维方法就是符合现实生活中人类解决问题的思维过程。
在面向对象的软件分析和设计的时候,要提醒自己,不要一上来就去想程序代码的实现,应该抛开具体编程语言的束缚,集中精力分析我们要实现的软件的业务逻辑,分析软件的业务流程,思考应该如何去描述和实现软件的业务。毕竟软件只是一个载体,业务才是我们真正要实现的目标。
但是在设计过程中,心里却往往在担心,如果我完全不去考虑程序代码的实现的话,那么我怎么知道我的设计一定合理呢?我怎么知道我设计的类、接口一定可以实现呢?所以经常可以看到的现象就是:
在设计过程中,虽然知道不能过早考虑代码实现,但是每设计一个类,一个接口,心里都要不知不觉的用自己熟悉的编程语言大概的评估一下,看看能否编出来,因此,一不小心,就会又回到按照程序功能实现的思路进行设计的老路上去了。
举个例子来说明,在做Web程序设计的时候,经常要遇到分页显示数据的情况。比如说需要把系统中所有的用户都列出来这样的功能。假设使用User类来表示用户,增加用户addUser(),删除用户deleteUser(),查询所有用户listUsers()方法。而数据库中有一个user表,一条记录是一个用户的信息。下面考虑一下User类的方法的实现:
addUser()和deleteUser()方法都好实现,就是对数据库增加记录和删除记录。对于listUsers()方法,其实就是对user表的select,取出一个记录集。但是该怎么从listUsers()方法中得到所有用户的列表呢?
一个方法调用的返回值只有一个,没有多个,所以很多情况下采用的办法就是返回值定义为集合类型,比如Vector。这样就可以在listUsers()方法的具体代码实现的时候,从数据库依次取出一个个记录,插入到Vector里面来。在主程序里面,调用listUsers()方法可以返回一个Vector,然后再对Vector遍历操作,就可以得到用户列表了。
public class User {
public static void addUser(...){
// 数据库insert一条记录
}
public static void deleteUser(...){
// 数据库delete一条记录
}
public Vector listUsers(...){
// 数据库select结果放到一个集合里面
}
}
这样的设计基本合理,但是仍然有点小问题。因为在设计的时候,就考虑到了用Java的集合类Vector来实现对不定长数据集的存放,因而违反了面向对象设计的一个原则:在设计的时候不应过早的考虑具体程序语言的实现。所以必须用抽象的方法,和具体实现无关的方法来表达业务逻辑。
我们知道,通常对具有集合特征的数据结构进行遍历通常可以使用next和hasNext方法,next实现取下一个用户,hasNext判断是否还有元素。因此我们定义一个接口Iterator,这个接口中定义两个方法next和hasNext:
public interface Iterator {
public boolean hasNext(){}
public Object next(){}
}
而User类的listUses方法返回值改为Iterator接口的实现类:
public class User {
...public Iterator listUsers(){
}
...}
这样就把User类的设计和具体的实现方法分离开了,因为此时任何实现了next()和hasNext()方法的类都可以做为listUsers的返回值,都可以被用来表达“用户列表”,而不仅仅可以使用Vector而已。比如,我可以用ArrayList来表达用户列表,因为ArrayList也实现了Iterator,当然我也可以自己专门写一个类来存放用户列表,只要实现next()和hasNext()方法就行了。
这样在具体的编写代码的时候,程序员具有了最大的灵活性,可以根据具体的情况,采用不同的编程方法来存放用户列表。特别是降低了程序的耦合度,提高了程序的可移植性。对于上面那个JunkMail的listAllMail()方法也同样应该改为接口类型。
然后,在主程序里面就这样来使用User类的listUsers方法:
User myUser = new User();
Iterator iterator = myUser.listUsers();
while(iterator.hasNext()){
iterator.next();
}
这样就可以完全不用考虑程序代码实现了,从高层次上把功能抽象出来,定义成为接口,同时又可以把系统设计的很合理,完全根据业务的需求来进行设计。
结语
通过上面的几个例子的设计说明,使用面向对象的思维方法,其实是一个把业务逻辑从具体的编程技术当中抽象出来的过程,而这个抽象的过程是自上而下的,非常符合人类的思维习惯,也就是先不考虑问题解决的细节,把问题的最主要的方面抽象成为一个简单的框架,集中精力思考如何解决主要矛盾,然后在解决问题的过程中,再把问题的细节分割成一个一个小问题,再专门去解决细节问题。
因而一旦牢牢的抓住了这一点,你就会发现在软件设计和开发过程中,你自己总是会不知不觉的运用面向对象的思维方法来设计和编写程序,并且程序的设计和开发也变得不再那么枯燥,而一个合理运用面向对象技术进行设计和架构的软件,更是具备了思维的艺术美感。
最后,愿面向对象的思维方法也能给您的程序设计之路带来创作的乐趣。
第四篇:Java面向对象程序设计教学大纲
Java面向对象程序设计课程教学大纲
Object-Oriented Programming with Java Syllabus
课程名称 课程类别 建设单位/教研室 前后课程 适用专业、层次 Java面向对象程序设课程英文名Object-Oriented Programming with Java 计 称 专业必修课 学分/学时 4.0/42+42 计算机系/软件工程教研室 考核方式 考试 C语言程序设计
软件工程、计算机科学与技术、网络工程
Upon completion of this course, students should master the basic knowledge of Java language, understand and grasp the basic object-oriented programming design ideas and skillfully use Java language to write, compile and debug programs.These would lay a good foundation for students on independently finish the work of program development with Java in the future.教学目的
The emphasis: 1.The origin of Java, Why should we learn Java language, Java cross-platform principle analysis(JVM)and Java Environment variable configuration.2.Data and Expressions: including Character Strings, Variables and Assignment, Primitive Data Types, Expressions, Data Conversion, Interactive Programs.3.Oriented object programming ideas: including Class, Object, Variables, Methods, Encapsulation, Inheritance, Polymorphism, Interface and so on.4.Java statements: including conditionals and loops statements.5.Arrays: Declaring and using one-dimensional arrays and two-dimensional arrays.6.Exceptions: including exception handling, uncaught exceptions, and try-catch statement and so on.7.GUI: including event handling and graphics user interface.The difficulty:
Object-oriented concept and idea, establishing application model and algorithm of description, the algorithm optimization of program and so on.教材和主要参考资料: Text and references Text :
John Lewis “Java程序设计教程(第六版)英文版” 电子工业出版社 ISBN-978-7-121-08808-7 References:
1.《Java编程思想(英文版 第3版)》,(美)Bruce Eckel编,机械工业出版社出版社; 2.Java程序设计基础》,(美)Gary J.Bronson编, 赵德奎 林仕平译,北京大学出版社。
3.Cay S.Horstmann, Gary Cornell.Java 2核心技术 卷I:基础知识.机械工业出版社, 2001.4.Cay S.Horstmann, Gary Cornell.Java 2核心技术 卷II:高级特性.机械工业出版社, 2001.教学内容 学时 基本要求
按章、节具体列出
教学内容 Topic 具体列出教学的基本要求,如了解、理解、掌握及应用等。
By the end of chapter ,students should understand Chapter 1 Introduction
Chapter 2 Data and ExpressionsChapter 3 Using Classes and Objects Chapter 4 Writing Classes 3+3 To be able to have a fundamental understanding of software role in a computer system. To know components of a computer To understand how those components interact To grasp how computers store and manipulate information To know how computers are connected into networks to share information. To profile programming and programming languages To profile an introduction to Java To grasp object-oriented concepts 3+6 Explore some of the basic types of data used in a Java program and the use of expressions to perform calculations. To understand character strings, concatenation, and escape sequences. To grasp the declaration and use of variables. To be familiar with Java primitive data types. To understand expressions and operator precedence. To grasp the syntax and processing of expressions. To understand the types of data conversions and the mechanisms for
accomplishing them. To know how to create interactive programs. To understand the basic graphic concepts and the techniques for drawing
shapes. To know the concept of a Java applet.4+4 Use the predefined classes in the Java class library that are provided to us to make the process of writing programs easier. To grasp the creation of objects and the use of object reference variables. To be familiar with the services provided by the String class. To know how the java standard class library is organized into packages. To be familiar with the services provided by the Random and Math class. To grasp ways to format output using the NumberFormat and DecimalFormat
classes. To be familiar with enumerated types. To understand wrapper classes and the concept of autoboxing. To understand components and containers used in graphics user interfaces. To know a label component and the use of images.6+6 We've been using predefined classes.Now we will learn to write our own classes to define objects. To grasp the structure and content of a class definition. To understand the concept of object state using instance data. To know the effect of visibility modifiers on methods and data. To grasp the structure of a method definition, including parameters and return
values. To grasp the structure and purpose of a constructor. To grasp the creation of graphical objects. To understand the concepts needed to create an interactive graphical user
interface.Chapter 5 Conditionals and Loops
Chapter 6 OBJECT-ORIENTED DESIGN
Chapter 7 Arrays
Chapter 8 Inheritance To know some basic GUI components and events.4+4 Now we will examine programming statements that allow us to make decisions and repeat processing steps in a loop. To know the flow of control through a method. To understand Boolean expressions that can be used to make decisions. To grasp to perform basic decision making using if and switch statements. To understand issues pertaining to the comparison of certain types of data. To grasp familiarly to execute statements repetitively using while, do, and for
loops. To understand the concept of an iterator object and use one to read a text file. To know how to draw with the aid of conditionals and loops. To know more GUI components and events.4+4 Now we can extend our discussion of the design of classes and objects To know key issues related to the design of object-oriented software. To techniques for identifying the classes and objects needed in a program. To understand the relationships among classes. To understand the effect on the static modifier on methods and data. To grasp the creation of a formal object interface. Further grasp the definition of enumerated type classes. To grasp issues related to the design of methods, including method
overloading. To know issues related to the design of graphics user interface, including
layout managers.6+3 Arrays are objects that help us organize large amounts of information Define and use arrays for basic data organization. To know bounds checking and techniques for managing capacity. To learn to compare the issues related to arrays as objects and arrays of
objects. To grasp the use of command-line arguments. To grasp the syntax and use of variable-length parameter lists. To be familiar with the creation and use of multidimensional arrays. To be familiar with the ArrayList class and its generic parameter. To know more mouse and keyboard events.6+6 Inheritance is a fundamental object-oriented design technique used to create and organize reusable classes. To know the derivation of new classes from existing ones. To understand the concept and purpose of method overriding. To grasp the design of class hierarchies. To grasp the issue of visibility as it relates to inheritance. To have the ability to derive on interface from another. To grasp object-oriented design in the context of inheritance. To know the inheritance structure for GUI components. To explore the creation of listeners by extending adaptor classes.Chapter 9 Polymorphism 3+3 Chapter 10 Exceptions 3+3 有关说明:
拟稿(签名):谢彦麒 Polymorphism is an object-oriented concept that allows us to create versatile software designs To understand polymorphism and explore its benefits. To understand the concept of dynamic binding. To grasp to use inheritance relationships to create polymorphic references. To grasp to use interfaces to create polymorphic references. To grasp sorting and searching using polymorphic implementations. To be familiar with object-oriented design in the context of polymorphism. To know the processing of events as an example of polymorphism. To know more GUI components.Exception handling is an important aspect of object-oriented design To know the purpose of exceptions. To know exception messages and the call stack trace.
To be familiar with the usage of the try-catch statement for handling exception. To understand the concept of exception propagation.
To be familiar with the exception class hierarchy in the Java standard class library. To be familiar with I/O exception and the ability to write text files. To know how to create GUI using mnemonics and tool tips.
To know additional GUI components and containers.核稿(签名): 审批(签名): 年 月 日
第五篇:JAVA面向对象程序设计教学大纲
《JAVA面向对象程序设计》课程教学大纲
Oriented object Programming in JAVA 编号: 08065121
适用专业:计算机科学与技术、网络工程 学时数:32 学分数:2 执笔者:田小玲 编写日期:2009年11月
一、课程的性质和目的
本课程是为计算机科学与技术以及网络工程专业本科生开设的专业选修课,是一门面向对象的编程语言,通过本课程的学习,培养和提高学生面向对象程序设计的能力和Java语言在web开发中的应用能力。
二、课程教学内容
第一章 面向对象软件开发概述(2学时)1.内容
面向对象问题求解的提出、面向对象问题求解的概述、对象、类与实体、对象的属性与相互关系、面向对象的软件开发过程、面向对象程序设计方法的优点、开发环境设置及开发工具简介。
2.要求
(1)了解:面向对象软件开发概述,面向对象的软件开发过程及面向对象程序设计 方法的优点。
(2)掌握:对象的属性与相互关系,对象、类与实体的基本概念。(3)熟练掌握:开发环境设置及开发工具简介(补充)。3.重点
对象、类与实体的基本概念。
4.难点
面向对象程序设计方法的理解。第二章 Java概述(2学时)1.内容
Java语言的特点、Java虚拟机及垃圾回收机制、JDK目录结构、Java 的API结构及Java程序结构、第一个Java Application程序、第一个Java Applet程序、图形界面的输入输出、字符界面的输入输出。
2.要求
(1)了解:Java语言的发展历史及特点,Java Application程序及Java Applet程 序,图形界面的输入输出,字符界面的输入输出。
(2)掌握:Java语言实现机制(补充),Java体系结构(补充)。(3)熟练掌握:Java Application程序的结构。3.重点
Java Application程序的结构。
4.难点
Java语言实现机制。
第三章 Java语言基础(2学时)1.内容
数据类型、变量与常量、表达式、流程控制语句。2.要求
(1)了解:java语言的发展。
(2)掌握:数据类型、变量与常量的定义及使用。(3)熟练掌握:表达式的使用,流程控制语句。3.重点
表达式的使用,流程控制语句。
4.难点
流程控制语句的运用。
第四章 抽象、封装与类(6学时)
1.内容
抽象与封装、Java的类、类的修饰符、域、方法、访问控制符。2.要求
(1)了解:抽象、封装概念,系统定义的类。
(2)掌握:类的修饰符(abstract和final),域(包括静态域、静态初始化器、最终域和易失域),方法(包括抽象方法、静态方法、最终方法)。
(3)熟练掌握:用户程序自定义类及创建对象与定义构造函数,访问控制符(包括public、缺省访问控制符、private、protected)的运用。
3.重点
自定义类、创建对象与定义构造函数。
4.难点
四种访问控制符的运用。第五章 继承与多态(4学时)1.内容
Java的继承、多态、Java的重载、构造函数的继承与重载、包及接口的概念。2.要求
(1)了解:继承及多态的概念,Java接口的概念。(2)掌握:Java的方法重载,包的创建及引用。(3)熟练掌握:构造函数的继承与重载。
3.重点
方法的重载、类的继承。4.难点
属性的隐藏、方法的覆盖。第六章 工具类与算法(2学时)
1.内容
语言基础类库(包括Object类、数据类型类、Math类及System类)、Applet类与Applet小程序、数组。
2.要求
(1)了解:Applet类与Applet小程序。(2)掌握:Java语言基础类库。(3)熟练掌握:数组的声明及初始化。3.重点
数组的声明及初始化、数组的应用。4.难点
编写Applet小程序。
第七章 图形用户界面的设计与实现(8学时)
1.内容
图形用户界面概述、GUI标准组件概述及布局设计、Java的事件处理机制。2.要求
(1)了解:图形界面组件之间的层次关系、容器的概念和作用。(2)掌握:图形用户界面程序的基本结构。(3)熟练掌握:事件监听机制。3.重点
图形用户界面程序的基本结构。4.难点
Java的事件处理机制。
第八章 Java高级编程(6学时)
1.内容
异常处理、Java多线程机制、Swing GUI 组件、流式输入输出与文件处理、用Java实现底层网络通信、Java程序对网上资源的访问。
2.要求
(1)了解:例外的概念、Java中线程的基本概念、Java的线程类与Runnable接口及如何在程序中实现多线程、Java输入输出类库及文件的处理与随机访问、使用Java实现底层网络通信、Java程序对网上资源的访问。
3(2)掌握:例外处理机制。
(3)熟练掌握:Swing GUI组件的运用。3.重点
例外处理机制、Swing GUI组件的创建。
4.难点
自定义异常类。
三、课程教学的基本要求
课程教学的基本要求包含三项:上机环节、作业要求、考试方式。1.上机环节
根据课堂讲授的理论,并结合上机操作让学生及时掌握每章节所学的知识,通过实操可加深学生对面向对象程序设计的思想及Java程序设计的领会。
2.作业要求
(1)作业要求:独立思考完成、书写工整、按时交(2)作业量:每次课均布置作业,作业量约2~3题(3)总作业量:约30~40道题 3.考试方式
(1)考试方式:闭卷笔试(2)评定成绩要求:
总成绩=平时成绩×30%+考试成绩×70%
四、本课程与其它课程的联系与分工
1.前期课程:
程序设计基础、计算机网络、C语言程序设计、C++程序设计 2.后续课程:
软件工程、Web应用程序开发
五、建议教材与教学参考书
[1] 印旻.《Java语言与面向对象程序设计》,清华大学出版社 [2] 於东军,杨静宇.《Java程序设计与应用开发》,清华大学出版社 [3] 辛运帏.《Java程序设计》,清华大学出版社 [4] 姜刚.《Java语言程序设计》,人民邮电出版社 [5] 阎菲.《Java程序设计教程》,中国水利水电出版社