第6章_抽象、封装与类

第6章_抽象、封装与类
第6章_抽象、封装与类

第六章抽象、封装与类主要内容

?一、抽象与封装

二、J a v a的类

三、对象的创建与使用

四、参数传递

五、匿名对象

1、抽象

抽象内涵

去除掉对象中与主旨无关的次要部

分,或是暂时不予考虑的部分

抽取出与研究工作有关的实质性的

内容加以考察

软件开发方法中所使用的抽象类型 (1)过程抽象

(2)数据抽象

(1)过程抽象

将整个系统功能划分为若干部分,强调功能完成的过程和步骤

面向过程的软件开发方法采用的就

是这种抽象方法

使用过程抽象有利于控制、降低整个

程序的复杂度

缺点:这种方法本身自由度较大,难

于规范化和标准化,操作起来有一定

难度,在质量上不易保证

(2)数据抽象

2、封装

利用抽象数据类型将数据和操作封装在一起

数据被保护在抽象数据类型的内部

系统其他部分只能通过被授权操作

与抽象数据交互

在面向对象程序设计中

抽象数据类型通过“类”来代表

每个类都封装相关的数据和操作

在实际开发过程中

类常用来构建系统内部的模块

?封装特性把类内的数据保护得很严密,

模块与模块间仅通过严格控制的界面进

行交互

?使它们之间耦合和交叉大大减少,从而

降低了开发过程的复杂性,提高了效率

和质量,减少了可能的错误

保证程序中数据的完整性和安全性主要内容

一、抽象与封装

?二、J a v a的类

三、对象的创建与使用

四、参数传递

五、匿名对象

二.J a v a的类

?1.J a v a类概念

2.类的定义与修饰

3.域

4.方法

1、J a v a类概念

类(C l a s s)和对象(O b j e c t)是面向对象程序设计方法中最核心的概念。

类是对某一类事物的描述(共性),是

抽象的、概念上的定义;

对象则是实际存在的属该类事物的

具体的个体(个性),因而也称为实

例(I n s t a n c e)。

1、J a v a类概念

类是J a v a程序的基本组成要素 封装了一类对象的状态和方法,是该

类对象的原型

J a v a程序设计就是定义类的过程

J a v a程序中定义的类的数目和功能

都是有限的

编程时还需要用到大量系统定义好

的类,即J a v a类库中的类

1、J a v a类概念

类的构成:类头+类体

类体由数据成员(属性、域)与函数成员封装而成。

J a v a语言把数据成员称为域变量、

属性、成员变量等;

把函数成员称为成员方法,简称为成

员方法。

举例:圆柱体类。

二.J a v a的类

1.J a v a类概念

?2.类的定义与修饰

3.域

4.方法

(1)定义类

定义类(声明类)

实际是定义类的静态属性和动态属

性(方法)。用户定义一个类实际上

就是定义一个新的抽象数据类型。 必须先定义类,然后才可利用所定义的类来声明相应的变量,并创建对象。

(1)定义类

定义类的语法结构

(1)定义类——实例

实例:圆柱体类的定义

(2)类的修饰符

J a v a程序在定义类时,可在c l a s s之前增加若干类的修饰符,修饰限定所定义的类的特性

类的修饰符分为访问控制符和非访问

控制符两大类,有些类的修饰符也可以用来修饰类中的域或方法

本节讨论类的非访问控制符

(2)类的修饰符——a b s t r a c t 抽象类是没有具体对象的概念类

抽象类不能直接被实例化,一般作为其它类的超类

举例

假设“鸟”是一个类,它可以派生出

若干个子类如“鸽子”、“燕子”、“麻

雀”、“天鹅”等

问题:那么是否存在一只实实在在的

鸟,它既不是鸽子,也不是燕子或麻

雀,它不是任何一种具体种类的鸟,

而仅仅是一只抽象的“鸟”呢?(2)类的修饰符——a b s t r a c t 抽象类是其所有子类的公共属性的集合

使用该特性可提高程序开发和维护

效率

以“鸟”的概念为例

假设需要向别人描述“天鹅”是什么,

通常都会这样说:“天鹅是一种脖子

长长,姿态优美的候鸟”

?可见定义是建立在已知道什么是

“鸟”的前提之上

◆只有在被进一步问及“鸟”是什

么时,才会具体解释说:“鸟是

一种长着翅膀和羽毛的卵生动

物”

◆而不会在一开始就把“天鹅”描

述成“是一种脖子长长,姿态优

美,长着翅膀和羽毛的卵生动

物”

(2)类的修饰符——a b s t r a c t 举例

已有两个类C i r c l e和R e c t a n g l e,完成相关参数计算

(2)类的修饰符——a b s t r a c t

举例

问题

假设有若干个C i r c l e,以及若干个

R e c t a n g l e,希望计算它们的总面积

?直截了当的做法是将它们分别放

到两个数组中,用两个循环,加

上一个加法,这种做法不是最理

想的

如果还有其它形状,t r i a n g l e,

e l l i p s e s等

?上述方法显得“累赘”

我们希望有一种统一的表示,例如用

一个数组s h a p e[],接受所有的形

状,然后用

f o r(i=0;i

g t h;i++)

a r e a_t o t a l+=

s h a p e[i].a r e a();

(2)类的修饰符——a b s t r a c t 举例

解决方案

(3)类的修饰符——f i n a l

f i n a l所修饰的类不可以有子类

如果把一个应用中有继承关系的类组织成一棵倒长的树,所有类的父类是树根,每一个子类是一个分支,那么声明为f i n a l的类就只能是这棵树上的叶结点,它不可能再有分支子类(3)类的修饰符——f i n a l

被定义为f i n a l的类通常是一些有固定作用、用来完成某种标准功能的类 如J a v a系统定义好的用来实现网络

功能的I n e t A d d r e s s、S o c k e t等 在J a v a程序中,当通过类名引用一个类或其对象时

实际真正引用的既可能是这个类或

其对象本身

也可能是这个类的某个子类及子类

的对象,即具有一定的不确定性

将一个类定义为f i n a l,则可以将它的内容、属性和功能固定下来,与它的类名形成稳定的映射关系,从而保证引用这个类时所实现的功能的正确无误

补充:a b s t r a c t与f i n a l的使用注意点

a b s t r a c t和f i n a l修饰符不能同时修饰

一个类

因为a b s t r a c t类自身没有具体对

象,需要派生出子类后再创建子类的

对象

f i n a l类不可能有子类,这样

a b s t r a c t f i n a l类就无法使用,也就

没有意义

但是a b s t r a c t和f i n a l可以各自与其他

修饰符合用

例如一个类可以是p u b l i c a b s t r a c t

的,也可以是p u b l i c f i n a l的

?这里的p u b l i c是访问控制符 当一个以上的修饰符修饰类或类中

的域、方法时,这些修饰符之间以空

格分开,写在c l a s s关键字之前,修

饰符之间的先后排列次序对类的性

质没有影响

二.J a v a的类

1.J a v a类概念

2.类的修饰符

?3.域(成员变量)

4.方法

(1)成员变量(域)

类的成员变量描述了该类的内部信息,一个成员变量可以是简单变量,也可以是对象、数组等其他结构型数据。

成员变量的格式:[修饰符]变量类型变量名[=初值];

在定义类的成员变量时,可以同时赋初值,但对成员变量的操作只能放在方法

中。

(1)成员变量(域)

域是类和对象的静态属性,可以是基本数据类型变量,也可以是其他类(系统类或自定义类)的对象

定义域的操作就是说明变量或创建对象的操作

与类相似,域(成员变量)也可以拥有若干修饰符,包括访问控制符和非访问控制符

本节讨论域的非访问控制符

(2)成员变量修饰符——s t a t i c

用s t a t i c修饰的域是仅属于类的静态域(s t a t i c f i e l d)

静态域本质特点:

它们是类的域,不属于任何一个类的

具体对象

不保存在某个对象的内存区间中,而

是保存在类的内存区域的公共存储

单元

对于该类的任何一个具体对象而言,

静态域是一个公共的存储单元,任何

一个类的对象访问它时,取到的都是

相同的数值

任何一个类的对象去修改它时,也都

是在对同一个内存单元进行操作(2)成员变量修饰符——s t a t i c 举例

程序定义对应200电话卡的类

P h o n e C a r d200

所有200电话卡的接入号码都是

“200”,所以定义静态域

c o n n e c t N u m b e r标志所有

P h o n e C a r d200对象的接入号码

使用200电话卡通话的附加费对每张

电话卡也是一致的,所以定义类的静

态域a d d i t o r y F e e

(2)成员变量修饰符——s t a t i c 举例

T e s t S t a t i c F i e l d.j a v a(使用

P h o n e C a r d200类)

(3)成员变量修饰符——f i n a l f i n a l用来修饰常量

一个类的域如果被声明为f i n a l,它

的值一旦给定,那么它的取值在程序

的整个执行过程中都不会改变,如s t a t i c f i n a l S t r i n g

c o n n e c t N u m b e r=″200″;

定义f i n a l域时,若不是s t a t i c的域,则必须且只能赋值一次,不能缺省,这种

域的赋值的方式有两种

在定义变量时赋初始值

在每一个构造函数中进行赋值

在定义f i n a l局部变量(方法中的变量)时,也必须且只能赋值一次

它的值可能不是常量,但它的取值在

变量存在期间不会改变

(3)成员变量修饰符——f i n a l 用f i n a l修饰符说明常量时,需要注意以下几点

需要说明常量的数据类型

需要同时指出常量的具体取值

由于所有类对象的常量成员,其数值

都固定一致,为节省空间,常量通常

声明为s t a t i c,如常量值:

?I n t e g e r.M A X_V A L U E(表示最大整

数)

?M a t h.P I(表示圆周率)

在定义s t a t i c f i n a l域时,若不给定初始值,则按默认值进行初始化

数值为0

b o o l e a n型为f a l s e

引用型为n u l l

(4)成员变量修饰符

——v o l a t i l e

被v o l a t i l e修饰符所修饰的域

说明这个域可能同时被几个线程所

控制和修改,即这个域不仅仅被当前

程序所掌握

在运行过程中可能存在其他未知的

程序操作来影响和改变该域的取值

在使用当中应该特别留意这些影响

因素

v o l a t i l e常用来修饰接受外部输入的域,如

表示当前时间的变量

?将由系统的后台线程随时修改,

以保证程序中取到的总是最新的

当前的系统时间

?因此可以把它定义为易失域

二.J a v a的类

1.J a v a类概念

2.类的修饰符

3.域(成员变量)

?4.方法

(1)方法概述

类的动态属性,标志类所具有的功能和操作

用于将类和对象的数据封装在一起 定义方法的目的

定义具有相对独立和常用功能的

模块

使程序结构清晰,也利于模块在

不同场合的重复利用环境的数据

类的方法用来定义对类的成员变量进行的操作,是实现类内部功能的机制,同时也是类与外界进行交互的重要窗口。

(1)成员方法

方法由方法头和方法体组成

方法可以是有返回值也可以无返回值(v o i d,主体中不用r e t u r n语句)

方法可带参数也可以不带参数。

(2)方法修饰符——a b s t r a c t (抽象方法)

抽象方法仅有方法头、没有具体方法体的实现,如

a b s t r a c t v o i d p e r f o r m D i a l

();

a b s t r a c t方法只有方法头的声明,

而用一个分号来代替方法体的定义

方法体的具体实现,留到各子类在各

自的类定义中完成

a b s t r a c t方法隐藏具体的细节信

息,使调用该方法的程序不必过分关注类及其子类内部的具体状况

注意

所有抽象方法都必须存在于抽象类

之中

但抽象类不一定只能拥有抽象方法,

可以包含非抽象的方法

(2)方法修饰符——a b s t r a c t (抽象方法)

(3)方法修饰符——s t a t i c(静态方法)

用s t a t i c修饰的方法,是属于整个类的类方法

不用s t a t i c限定的方法,是属于某个具体类对象或实例的方法

声明一个方法为s t a t i c至少以下重

作业5 抽象与封装三

作业五抽象与封装三 确定以下代码段中是否存在错误,如果有错误,指出是逻辑错误还是语法错误,请在程序中用“绿色”标出错误的地方,并在每个练习的空白处写下正确的代码。如果代码中没有错误,则在答案中写上“没有错误”。注意:在每个程序段中可能包含多处错误。 问题1 、以下代码定义了Product类,它有一个不带参数的构造方法,将产品的名称设置为一个空的String,将price设置为0.00;该类还有一个toProductString方法,它返回一个包含产品的name和price的String import java.text.*; public class Product{ private String name; private double price; private static DecimalFormat money=new DecimalFormat("$0.00"); public Product() { name=" "; price=0.00; } Public String toProductString() { return name+" costs "+money.format(price); } }//end class Product 答案:没有错误 问题2 、如下代码定义了Product类的另一个构造方法,它有2个参数,并将这些参数赋给相应的实例变量 public Product(String name, double price) { name= name; price=price; } 答案: https://www.360docs.net/doc/2c3927632.html,= name; this.price=price; 若类的构造方法中的参数与类的实例变量命名为相同的名称,在成员方法中引用的变量名为局部变量,若想引用视力变量就要加上this 问题3、如下代码定义了两个set方法,用于设置Product类的name和price

第6章_抽象、封装与类

第六章抽象、封装与类主要内容 ?一、抽象与封装 二、J a v a的类 三、对象的创建与使用 四、参数传递 五、匿名对象 1、抽象 抽象内涵 去除掉对象中与主旨无关的次要部 分,或是暂时不予考虑的部分 抽取出与研究工作有关的实质性的 内容加以考察 软件开发方法中所使用的抽象类型 (1)过程抽象 (2)数据抽象

(1)过程抽象 将整个系统功能划分为若干部分,强调功能完成的过程和步骤 面向过程的软件开发方法采用的就 是这种抽象方法 使用过程抽象有利于控制、降低整个 程序的复杂度 缺点:这种方法本身自由度较大,难 于规范化和标准化,操作起来有一定 难度,在质量上不易保证 (2)数据抽象 2、封装 利用抽象数据类型将数据和操作封装在一起 数据被保护在抽象数据类型的内部 系统其他部分只能通过被授权操作 与抽象数据交互 在面向对象程序设计中 抽象数据类型通过“类”来代表

每个类都封装相关的数据和操作 在实际开发过程中 类常用来构建系统内部的模块 ?封装特性把类内的数据保护得很严密, 模块与模块间仅通过严格控制的界面进 行交互 ?使它们之间耦合和交叉大大减少,从而 降低了开发过程的复杂性,提高了效率 和质量,减少了可能的错误 保证程序中数据的完整性和安全性主要内容 一、抽象与封装 ?二、J a v a的类 三、对象的创建与使用 四、参数传递 五、匿名对象 二.J a v a的类 ?1.J a v a类概念

2.类的定义与修饰 3.域 4.方法 1、J a v a类概念 类(C l a s s)和对象(O b j e c t)是面向对象程序设计方法中最核心的概念。 类是对某一类事物的描述(共性),是 抽象的、概念上的定义; 对象则是实际存在的属该类事物的 具体的个体(个性),因而也称为实 例(I n s t a n c e)。 1、J a v a类概念 类是J a v a程序的基本组成要素 封装了一类对象的状态和方法,是该 类对象的原型 J a v a程序设计就是定义类的过程

面向对象及封装

面向对象抽象及封装 主讲:钟起杭 面向过程:面向过程关注的是一个具体的流程,考虑它是如何实现,关心的是功能的实现。面向对象:把客观的可见的事物都当做是一个对象(万事万物皆对象),面向对象设计思想在考虑问题时,以具体的事物(对象)为单位,考虑它的属性(特征)及动作(方法),关注的是整体,这符合我们解决问题的一般思路—>因人而异,因时而异都在面向对象编程思想中体现,这也使得面向对象编程更加容易,因为这种思想更加贴近我们的日程生活。 面向对象的特点: 抽象:万事万物皆对象,那么对于具有一定相同属性的事物可以归类于一个集合,对这类食物的简单外观或者动作的描述(抽象)- 产生了类。那么对事物的具体描述就能产生具有这类共同属性的对象。 封装:什么是封装?封装就是将对象具有的一些属性和方法通过封装打包到一起,共同体现一个事物的特征。为什么要封装?因为对象也是隐私的,没有人希望外界能知道自己的隐私,所以为了确保对象(爱人)在外界的良好形象就要保护好对象的隐私(对于人来说),那么对于程序来说,让别人知道的隐私越少,暴露出来的bug也能越少。当然隐私有时候也不是绝对的,比如有些事情对于家人就不算隐私,对同事,同学就完全算是隐私(身体上的特征),所以java语言就有不同的访问修饰符来适应这些不同的情况。 访问修饰符: public:公共的,可以理解为一个人的外貌特征,是谁都能看到的了解的。 protected:对于家庭是非隐私的,对于外界却是隐私的 default:在某一人群中不是秘密,对于陌生人来说就算是隐私了(只能在本包中能看到,跨包了就没办法看到的。) private:完全的隐私,除了自己别人都不能知道的。

抽象、封装与类(一)

抽象、封装与类(一) 学生姓名:学号:专业班级: 实验类型:□验证□综合□设计□创新实验日期:实验成绩: 一、实验项目名称 抽象、封装与类(一) 二、实验目的 1、熟练掌握如何自定义一个类。 2、熟练掌握如何定义构造函数,如何创建对象。 三、实验基本原理 在计算机技术的软件开发方法中所使用的抽象有两类:一类是过程抽象,另一类是数据抽象。 过程抽象将整个系统的功能划分为若干部分,强调功能完成的过程和步骤。面向过程的软件开发方法采用的就是这种抽象方法。数据抽象是与过程抽象不同的抽象方法,它把系统中需要处理的数据和这些数据上的操作结合在一起,根据功能、性质、作用等因素抽象成不同的抽象数据类型。每个抽象数据类型既包含了数据,也包括了针对这些数据的授权操作,是相对于过程抽象更为严格、也更为合理的抽象方法。 封装就是指利用抽象数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型的内部,系统的其他部分只有通过包裹在数据外面的被授权的操作,才能够与这个抽象数据类型交流和交互。封装使得抽象数据类型对内成为一个结构完整,可自我管理、自我平衡、高度集中的整体;对外则是一个功能明确、接口单一、可在各种合适的环境下都能独立工作的右击的单元。 Java程序设计就是定义类的过程,但是Java程序中定义的类的数目和功能都是有限的,编程时还需要用到大量的系统定义好的类,即Java类库中的类。 类库是JAVA语言的重要组成部分。JAVA语言由语法规则和类库两部分组成,语法规则确定JAVA程序的书写规范;类库(或称为运行时库)则提供了JAVA 程序与运行它的系统软件(JAVA虚拟机)之间的接口。 创建对象:首先说明新建对象所属的类名,然后说明新建对象的名字,赋值号右边的NEW是为新建对象开辟内存空间的算符。 构造函数是与类同名的方法。 四、主要仪器设备及耗材 计算机一台、my Eclipse软件 五、实验步骤 (1)打开My Eclipse,新建工程和类。分别输入本实验的代码。 (2)按照需求,输入如下代码: P95~96:4-7、4-8、4-9(综合) 模仿例4-2,编写如下程序。 定义一个表示学生的类Student,包括属性“学号”、“班号”、“姓名”、“性别”、“年龄”;方法“获得学号”、“获得班号”、“获得姓名”、“获得性别”、“获得年龄”、“修改年龄”。 为Student类定义构造函数初始化所有属性,增加一个方法public String toString(),把Student类对象的所有属性信息组合成一个字符串输出。 在main()中创建Student类对象,测试自定义类。

抽象工厂模式abstractfactory

抽象工厂模式 概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具·体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式。 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 模型图 逻辑模型: 物理模型: 生活中的例子 抽象工厂的目的是要提供一个创建一系列相关或相互依赖对象的接口,而不需要指定它们具体的类。这种模式可以汽车制造厂所使用的金属冲压设备中找到。这种冲压设备可以制造汽车车身部件。同样的机械用于冲压不同的车型的右边车门、左边车门、右前挡泥板、左前挡泥板和引擎罩等等。通过使用转轮来改变冲压盘,这个机械产生的具体类可以在三分钟内改变。 抽象工厂之新解 虚拟案例 中国企业需要一项简单的财务计算:每月月底,财务人员要计算员工的工资。 员工的工资 = (基本工资 + 奖金 - 个人所得税)。这是一个放之四海皆准的运算法则。

为了简化系统,我们假设员工基本工资总是4000美金。 中国企业奖金和个人所得税的计算规则是: 奖金 = 基本工资(4000) * 10% 个人所得税 = (基本工资 + 奖金) * 40% 我们现在要为此构建一个软件系统(代号叫Softo),满足中国企业的需求。 案例分析 奖金(Bonus)、个人所得税(Tax)的计算是Softo系统的业务规则(Service)。 工资的计算(Calculator)则调用业务规则(Service)来计算员工的实际工资。 工资的计算作为业务规则的前端(或者客户端Client)将提供给最终使用该系统的用户(财务人员)使用。 针对中国企业为系统建模 根据上面的分析,为Softo系统建模如下: 代码: 针对美国企业为系统建模 为了拓展国际市场,我们要把该系统移植给美国公司使用。 美国企业的工资计算同样是: 员工的工资 = 基本工资 + 奖金 - 个人所得税。 但是他们的奖金和个人所得税的计算规则不同于中国企业: 美国企业奖金和个人所得税的计算规则是:

封装,继承,多态,抽象,接口

1.1封装 封装是面向对象编程的三大特征之一。封装就是将通过抽象得到的属性和方法相结合,形成一个有机的整体——“类”。封装的目的是增强数据安全性和简化编程,使用者不必了解具体的实现细节,所有对数据的访问和操作都必须通过特定的方法,否则便无法使用,从而达到数据隐藏的目的。 封装是面向对象编程语言对客观世界的模拟,客观世界的属性都是被隐藏在对象内部的,外界不能直接进行操作或者修改。譬如:常见的空调电视机等对象,这些对象都是封装好的,普通人只可以通过对小小的按钮操作来控制这些家电;不可以随意打开设备进行修改对象内容的配置。但是专业人员可以修改这些家电,而我们就是要做这些“专家”;如下图所示。 操作按钮 操作按钮 图1.1.1 封装对象 1.1.1为什么需要封装 通过第一阶段的学习,我们知道类由属性和方法组成,在类的外部通过本类的实例化对象可以自由访问和设置类中的属性信息,这样不利于属性信息的安全,示例1.1就是如此。示例1.1 public class Person { public String name; public int age; public void sayHello(){ System.out.print("你好!"); } } public class Test { public static void main(String[] args) { Person p=new Person(); https://www.360docs.net/doc/2c3927632.html,="皇帝"; p.age=1000;//属性信息可以直接设置 p.sayHello();

} } 上述代码在第一阶段Java的课程中经常见到,大致一看没什么问题,但是仔细分析过之后会发现:把年龄设置成1000合理吗? 由于Person类的属性都是公有的(public),那也就意味着在Person类的外部,通过Person类的实例化对象可以对这些公有属性任意修改,这就使得我们无法对类的属性进行有效的保护和控制。这属于设计上的缺陷,那能不能避免这种情况呢?这就需要用到下面的封装了。 1.1.2现实生活中的封装 现实生活中封装的例子随处可见,例如药店里出售的胶囊类药品,我们只需要知道这个胶囊有什么疗效,怎么服用就行了,根本不用关心也不可能去操作胶囊的药物成分和生产工艺。再例如家家户户都用的电视机,我们只需要知道电视机能收看电视节目,知道怎么使用就行了,不用关心也不可能去搞清楚电视机内部都有哪些硬件以及是如何组装的。这些都是现实生活中封装的例子。 在刚才的两个例子中,我们可以认为药物成分是胶囊的属性,但是用户不需要也不可能去操作它。我们也可以认为内部硬件是电视机的属性,但是用户也不需要去操作它。这就是现实生活中封装的特征,程序中的封装与此类似。 1.1.3程序中的封装 封装就是:将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部的信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。简而言之,封装就是将类的属性私有化,并提供公有方法访问私有属性的机制,我们看示例1.2。 示例1.2 public class Person{ //将属性使用private修饰,从而隐藏起来 private String name; private int age; public void sayHello() { System.out.print("你好!"); } } public class Test { public static void main(String[] args) { Person p=new Person(); https://www.360docs.net/doc/2c3927632.html,="杰克"; //编译报错 p.age=1000; //编译报错 p.sayHello(); } }

实验7 抽象与封装综合应用

实验7 抽象与封装综合应用 抽象与封装综合应用 课程名称:面向对象程序设计实验 实验项目名称:实验7 抽象与封装综合应用 【实验目的】 1. 掌握高精度数值类BigInteger类的成员变量和方法的应用 2. 掌握Calendar、Date类在时间表示上的应用 3. 掌握类之间的主要关系:一般关联、聚集关联中的组合、分享关联;理解类关系中“整 体-部分”这个重要关联关系的设计策略与Java代码实现方法 【实验步骤】 1、编程实现:大整数的数值计算。编写一个Java应用程序,计算两个大整数的和、差、积和商,并计算一个大整数的因子个数。(部分源码参考讲义) import java.math.*; public class BigIntegerExample { public static void main(String args[]) { BigInteger n1=new BigInteger("987654321987654321987654321"), n2=new BigInteger("123456789123456789123456789"), result=null; //n1和n2做加法运算 result = 【代码1】,; //打印输出求和结果 System.out.print(" "+【代码2】 ); System.out.println("和:"+result.toString()); result = 【代码3】//n1和n2做减法运算 System.out.println("差:"+result.toString()); result = 【代码4】//n1和n2做乘法运算 System.out.println("积:"+result.toString()); result = 【代码5】//n1和n2做除法运算 System.out.println("商:"+result.toString()); BigInteger m = new BigInteger("1968957"),

C第3章规范标准答案

C++习题参考答案 第1章面向对象程序设计概论 一、名词解释 抽象封装消息 【问题解答】 面向对象方法中的抽象是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。 面向对象方法中的封装就是把抽象出来的对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。 消息是面向对象程序设计用来描述对象之间通信的机制。一个消息就是一个对象要求另一个对象实施某种操作的一个请求。 二、填空题 (1)目前有面向过程的结构化程序设计方法和面向对象的程序设计方法两种重要的程序设计方法。 (2)结构化程序设计方法中的模块由顺序、选择和循环3种基本结构组成。(3)在结构化程序设计方法中,程序可表示为程序=数据结构+算法;而面向对象的程序设计方法,程序可表示为程序=对象+消息。 (4)结构化程序设计方法中的基本模块是过程;而面向对象程序设计方法中的基本模块是类。 (5)面向对象程序设计方法具有抽象性、封装性、继承性和多态性等特点。 三、选择题(至少选一个,可以多选) (1)面向对象程序设计着重于( B )的设计。 A. 对象 B. 类 C. 算法 D. 数据 (2)面向对象程序设计中,把对象的属性和行为组织在同一个模块内的机制叫做( C )。 A. 抽象 B. 继承 C. 封装 D. 多态 (3)在面向对象程序设计中,类通过( D )与外界发生关系。 A. 对象 B. 类 C. 消息 D. 接口 (4)面向对象程序设计中,对象与对象之间的通信机制是( C )。 A. 对象 B. 类 C. 消息 D. 接口 (5)关于C++与C语言的关系的描述中,( D )是错误的。 A. C语言是C++的一个子集 B. C语言与C++是兼容的 C. C++对C语言进行了一些改进 D. C++和C语言都是面向对象的 【结果分析】 C语言是面向过程的。C++语言是一种经过改进的更为优化的C语言,是一种混合型语言,既面向过程也面向对象。 (6)面向对象的程序设计将数据结构与( A )放在一起,作为一个相互依存、不可分割的整体来处理。 A. 算法 B. 信息 C. 数据隐藏 D. 数据抽象 (7)下面( A )不是面向对象系统所包含的要素。 A. 重载 B. 对象 C. 类 D. 继承

实验6 抽象与封装-3

实验6 抽象与封装-3 抽象与封装-3 课程名称:面向对象程序设计实验 实验项目名称:实验6 抽象与封装-3 学生姓名:专业:学号: 实验地点:实验日期:年月日 【实验目的】 1. 掌握Array 类的使用方式 2. 掌握String类和StringBuffer类的使用方式 3. 掌握Math类,掌握静态成员的使用方式 4. 掌握Calendar、Date类在时间表示上的应用 5.了解Integer类、Double类、Character类 6.熟悉重要JAVA API中类的成员变量和方法的应用。 【实验步骤】 1、编写一个Java应用程序,判断两个字符串是否相同,判断字符串的前缀、后缀是否和某个字符串相同,按照字典顺序比较两个字符串的大小关系,检索字符串,创建子字符串,将数字型字符串转换为数字,将字符串存放到数组中,用字符数组创建字符串。 public class StringExample { p ublic static void main(String args[]) { String s1=new String("you are a student"); String s2=new String("how are you"); if(【代码1】) // 使用equals方法判断s1与s2是否相同 { System.out.println("s1与s2相同"); } else { System.out.println("s1与s2不相同");

} String s3=new String("22030219851022024"); if(【代码2】) //判断s3的前缀是否是"220302"。 { System.out.println("吉林省的身份证"); } String s4=new String("你"), s5=new String("我"); if(【代码3】)//按着字典序s4大于s5的表达式。 { System.out.println("按字典序s4大于s5"); } else { System.out.println("按字典序s4小于s5"); } int position=0; String path="c:\\java\\jsp\\A.java"; position=【代码4】; //获取path中最后出现目录分隔符号的位置 System.out.println("c:\\java\\jsp\\A.java中最后出现\\的位 置:"+position); String fileName=【代码5】;//获取path中"A.java"子字符串。 System.out.println("c:\\java\\jsp\\A.java中含有的文件名:"+fileName); String s6=new String("100"), s7=new String("123.678"); int n1=【代码6】; //将s6转化成int型数据。 double n2=【代码7】; //将s7转化成double型数据。 double m=n1+n2; System.out.println(m); String s8=【代码8】; //String调用valuOf(int n)方法将m转化为字符串对象 position=s8.indexOf("."); String temp=s8.substring(position+1); System.out.println("数字"+m+"有"+temp.length()+"位小数") ; String s9=new String("ABCDEF"); char[] a=【代码9】; //将s9存放到数组a中。 【代码10】//采用for循环,输出a数组的各个字符。 } } (1)【代码1】 s1.equals(s2) (2)【代码2】 s3.startsWith("220302") (3)【代码3】 https://www.360docs.net/doc/2c3927632.html,pareTo(s5) > 0

类的封装与继承习题(题)

1.以下关于继承的叙述正确的是( C )。 A、在Java中类只允许单一继承 B、在Java中一个类只能实现一个接口 C、在Java中一个类不能同时继承一个类和实现一个接口 D、在Java中接口只允许单一继承 2.有继承关系时用到的关键字是(A )。( 2 分) A:extend B:extends C:implements D:implement 3:Java变量中,以下不属于复合类型的数据类型是( D)。( 2 分) A:类 B:字符型 C:数组型 D:接口 4:java中定义数组名为abc,下面(B )可以得到数组元素的个数。( 2 分) A:abc.length( ) B:abc.length C:len(abc) D:ubound(abc) 5:下列说法正确的是(A )。( 2 分) A:编译后的Java源程序根据文件中定义的类和接口的个数产生相应个数的.class 字节码文件。 B:Java语言的源文件中不是任何地方都可以加注释的。 C:一个文件中可以有多个访问权限为public的类。 D:含有main()方法的类可以为public的类,也可以为其他类。 6:在调用构造函数时(C )( 2 分) A:子类可以不加定义就使用父类的所有构造函数 B:不管类中是否定义了何种构造函数,创建对象时都可以使用默认构造函数C:先调用父类的构造函数 D:先调用形参多的构造函数 7:Java与C/C++比较说法错误的是(D)。( 2 分) A:Java不提供goto语句,所以也就没指定goto作为关键字。

B:Java没有指针。 C:Java没有联合和结构 D:Java只有单继承没有多重继承。 8:若需要定义一个类域或类方法,应使用( B)修饰符。( 2 分) A:static B:package C:private D:public 9:下列说法( C)是正确的。( 2 分) A:程序执行到break语句是一定会结束所有的循环 B:程序执行到continue语句时会结束当前循环 C:break语句和continue语句都可以和标签协同使用 D:continue语句和break语句的作用相同 10:以下说法正确的是(D )。( 2 分) A:每个Java类都至少有一个构造方法,如果没有则机器自动生成一个默认的构造方法。 B:如果类里定义了一个或多个构造方法,那么java也提供默认的构造方法 C:每个Java类中用户必须定义至少一个构造方法。 D:以上都不对 11:对封装的理解正确的是(A )。( 3 分) A:封装就是把对象的属性和行为结合成一个独立的单位。 B:封装就是把对象完全隐蔽起来,不让外界访问。 C:封装性是一个使用问题。 D:封装和抽象是一回事。 12:对成员的访问控制保护最强的是(C )。( 3 分) A:public B:缺省 C:private D:protected

2.抽象和封装

抽象和封装 0.英语单词 1.抽象 我们需要设计一个电子宠物系统,其中领养宠物功能的详细需求如下: 根据控制台提示,输入领养宠物的昵称; 根据控制台提示,输入领养宠物的类型,有两种选择:狗狗和企鹅; 如果选择狗狗,要选择狗狗的品种,有两种选择:?聪明的拉布拉多犬?或?中华田园犬?如果选择类型,选择企鹅的性别:?Q仔?或?Q妹?。 所领养宠物的健康值默认是100,表示非常健康。 所领养的宠物和主人的亲密度是0,表示和主人不熟。 在控制台打印宠物信息,包括昵称、健康值、亲密度、品种或性别,表示领养成功。 领养成功后主人可以和狗狗玩接飞盘的游戏,也可以让狗狗看家;如果领养的是企鹅,主人可以和企鹅一起游泳,也可以和企鹅玩过家家的游戏。 根据上面的描述,进行分析和设计,找出类,设计类;并画出类图! 分析: 1)先找简单名词 2)再找修饰性名词 3)然后找动词 4)优化 类图 抽象时遵循的原则: 属性、方法的设臵是为了解决业务问题的;

关注主要属性、方法; 如果没有必要、勿增加额外的类、属性和方法。 2.类的定义 生活中描述事物无非就是描述事物的属性和行为,如人有身高、体重等属性,有说话、打球等行为。 Java中用类(class)来描述事物也是如此,属性:对应类中的成员变量,行为对应类中的成员函数。 定义类其实就是定义类的成员:成员变量和成员函数。 实例Dog.java Penguin.java 3.成员变量和局部变量的区别: 成员变量定义在类中,在整个类中都可以被访问; 成员变量随着对象的创建而建立,存在于对象所在的堆内存中; 成员变量都有默认初始值。 局部变量定义在局部范围内(方法内、语句或语句块内); 局部变量存在于栈内存中,局部变量只在所在的范围内有效,超出作用范围,变量所占内存就会被释放; 局部变量没有默认值,必须初始化。 实例: 成员变量的初始值 引用数据类型null 基本数据类型 byte short int long 0 float double 0.0 char ‘’ boolean false 4.创建和使用对象 1)创建对象的语句Dog dog = new Dog(); Penguin penguin = new Penguin(); 2)对象的内存结构 3)调用属性对象名.属性名 4)调用方法对象名.方法名 实例:Test.java 5.使用final定义常量 实例:Dog.java和Penguin.java的改进

抽象、封装与类(二)

抽象、封装与类(二) 学生姓名:学号:专业班级: 实验类型:□验证□综合□设计□创新实验日期:实验成绩: 一、实验项目名称 抽象、封装与类(二) 二、实验目的 1、熟练掌握属性的定义和静态属性、最终属性的使用。 2、熟练掌握方法的定义和静态方法、抽象方法、最终方法的使用。 三、实验基本原理 在计算机技术的软件开发方法中所使用的抽象有两类:一类是过程抽象,另一类是数据抽象。 过程抽象将整个系统的功能划分为若干部分,强调功能完成的过程和步骤。面向过程的软件开发方法采用的就是这种抽象方法。数据抽象是与过程抽象不同的抽象方法,它把系统中需要处理的数据和这些数据上的操作结合在一起,根据功能、性质、作用等因素抽象成不同的抽象数据类型。每个抽象数据类型既包含了数据,也包括了针对这些数据的授权操作,是相对于过程抽象更为严格、也更为合理的抽象方法。 封装就是指利用抽象数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型的内部,系统的其他部分只有通过包裹在数据外面的被授权的操作,才能够与这个抽象数据类型交流和交互。封装使得抽象数据类型对内成为一个结构完整,可自我管理、自我平衡、高度集中的整体;对外则是一个功能明确、接口单一、可在各种合适的环境下都能独立工作的右击的单元。 Java程序设计就是定义类的过程,但是Java程序中定义的类的数目和功能都是有限的,编程时还需要用到大量的系统定义好的类,即Java类库中的类。 类库是Java语言的重要组成部分。Java语言由语法规则和类库两部分组成,语法规则确定Java 程序的书写规范;类库,或称为运行时库,则提供了Java程序与运行的系统软件(JVM)之间的接口。系统定义的类虽然实现了许多常见的功能,但是用户程序仍然需要针对特定问题的特定逻辑来定义自己的类。用户程序定义自己的类有定义类头和定义类体两个步骤,其中类体又由属性(域)和方法组成。 四、主要仪器设备及耗材 计算机一台、my Eclipse软件 五、实验步骤 (1)打开My Eclipse,新建工程和类。分别输入本实验的代码。 (2)按照实验的需求,输入如下代码: 编写一程序,完成以下工作: 定义一个圆类Circle,成员变量有最终静态属性圆周率PI、半径radius,成员方法有自定义构造方法、获取半径getRadius()、修改半径updateRadius()、计算面积area() 。 再定义一个圆锥类Taper,成员变量有底bottom、高height,成员方法有自定义构造方法、获得底圆半径getBottomR()、修改底圆半径updateBottomR()、获得高getHeight()、修改高updateHeight()、计算体积volume()。 最后写一测试类,测试自定义圆类Circle、圆锥类Taper是否正确。 1、定义圆类Circle class Circle { static final double pi=3.1415926; private double radius;

java面向对象编程类的封装接口和基本类库练习题

面向对象编程基本知识练习 一、判断题 1.不需要定义类,就能创建对象。() 2.构造方法用于给类的private 实例变量赋值。() 3.对象一经声明就可以立即使用。() 4.在定义变量和方法时,必须清楚地在其面前标上访问权限修饰符。() 5.Java 程序中的参数传递都是把参数值传递给方法定义中的参数。() 6.在类定义中,成员访问权限修饰符不能多次出现。() 7.new 操作符动态地为对象按其指定的类型分配内存,并返回该类型的一个引用。() 8.类的方法通常设为public,而类的实例变量一般也设为public。() 9.构造方法在创建对象时被调用。() 10.通过点运算符与类对象的引用相连,可以访问此类的成员。() 11.声明为protected 的类成员只能被此类中的方法访问。() 12.同一个类的对象使用不同的内存段,但静态成员共享相同的内存空间。() 13.类的成员变量可以放在类体的任意位置。() 14.声明为protected 的类成员可以被此类作用域中的任何对象访问。() 15.没有返回值的方法可以用void 来表示,也可以不加。() 二、选择题 1. 下面对对象概念描述错误的是:( ) A 操作是对象的动态属性 B 任何对象都必须有继承性 C 对象间的通讯靠消息传递 D 对象是属性和方法的封装体 2.编译并运行下面的程序,运行结果为:( ) public class A { public static void main(String[] args) { A a=new A(); a.method(8); } void method(int i) { System.out.println(“int:“+i); } void method(long i) { System.out.println(“long:“+i); } } A 程序可以编译运行,输出结果为int:8 B 程序可以编译运行,输出结果为long:8

面向过程、面向对象、类、方法、事件、封装通俗理解

类的概念:类是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和服务说明两个主要部分。 对象的概念:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。从更抽象的角度来说,对象是问题域或实现域中某些事物的一个抽象,它反映该事物在系统中需要保存的信息和发挥的作用;它是一组属性和有权对这些属性进行操作的一组服务的封装体。客观世界是由对象和对象之间的联系组成的。类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类。 类描述了一组有相同特性(属性)和相同行为(方法)的对象。上面大概就是它们的定义吧,也许你是刚接触面向对象的朋友,不要被概念的东西搞晕了,给你举个例子吧,如果你去中关村想买几台组装的PC 机,到了那里你第一步要干什么,是不是装机的工程师和你坐在一起,按你提供的信息和你一起完成一个装机的配置单呀,这个配置单就可以想象成是类,它就是一张纸,但是它上面记录了你要买的PC 机的信息,如果用这个配置单买10 台机器,那么这10 台机子,都是按这个配置单组成的,所以说这10 机子是一个类型的,也可以说是一类的。那么什么是对象呢,类的实例化结果就是对象,用这个配置单配置出来(实例化出来)的机子就是对象,是我们可以操作的实体,10 台机子,10 个对象。每台机子都是独立的,只能说明他们是同一类的,对其中一个机做任何动作都不会影响其它9 台机器,但是我对类修改,也就是在这个配置单上加一个或少一个配件,那么装出来的9 个机子都改变了,这是类对象的关系(类的实例化结果就是对象)。 就不说他的概念,如果你想建立一个电脑教室,首先要有一个房间,房间里面要有N 台电脑,有N 张桌子,N 把椅子,白板,投影机等等,这些是什么,刚才咱们说了,这就是对象,能看到的一个个的实体,可以说这个电脑教室的单位就是这一个个的实体对象,它们共同组成了这个电脑教室,那么我们是做程序,这和面向对象有什么关系呢?开发一个系统程序和建一个电脑教室类似,你把每个独立的功能模块抽象成类,形成对象,由多个对象组成这个系统,这些对象之间都能够接收信息、处理数据和向其它对象发送信息等等相互作用。就构成了面向对象的程序。 上面已经介绍过了,面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,所以我们首先要做的就是如何来声明类,做出来一个类很容易,只要掌握基本的程序语法定义规则就可以做的出来,那么难点在那里呢?一个项目要用到多少个类,用多少个对象,在那要定义类,定义一个什么样的类,这个类实例化出多少个对象,类里面有多少个属性,有多少个方法等等,这就需要读者通过在实际的开发中就实际问题分析设计和总结了。类的定义:class 类名{} 类呢?上面讲过来,使用类是为了让它实例出对象来给我们用,这就要知道你想要的是什么样的对象了,像上面我们讲的一个装机配置单上写什么,你装出来的机子就有什么。比如说,一个人就是一对象,你怎么把一个你看好的人推荐给你们领导呢?当然是越详细越好了:首先,你会介绍这个人姓名、性别、年龄、身高、体重、电话、家庭住址等等。然后,你要介绍这个人能做什么,可以开车,会说英语,可以使用电脑等等。只要你介绍多一点,别人对这个人就多一点了解,这就是我们对一个人的描述,现在我们总结一下,所有的对象我们用类去描述都是类似的,从上面人的描述可以看到,做出一个类来,从定义的角度分两部分,第一是从静态上描述,第二是从动态上描述,静态上的描述就是我们所说的属性,像上面我们看到的,人的姓名、性别、年龄、身高、体重、电话、家庭住址等等。动态

对象、类、封装和接口的通俗解释

什么是类(Class) 面向对象的思想来源于对现实世界的认知。现实世界种类繁多,难于认识和理解。但是聪明的人们学会了把这些纷繁复杂的事物进行分类,从而使世界变得井井有条。比如我们由各式各样的具体的汽车抽象出“汽车”的概念,由形形色色的具体的猫抽象出“猫”的概念,由五彩斑斓的具体的鲜花抽象出“花类”的概念等。汽车、猫、花都代表着一类事物。每一类事物都有特定的状态,比如汽车的品牌、时速、马力、耗油量、座椅数;小猫的年龄、体重、毛色;鲜花的颜色、花瓣形状、花瓣数目,都是在描述事物的状态。每类事物也都有一定的行为,比如汽车启动、行驶、加速、减速、刹车、停车;猫捉老鼠;鲜花盛开。这些不同的状态和行为将各类事物区分开来。 面向对象编程也采用了类的概念,把事物编写成一个个“类”。在类中,用数据表示事物的状态,用函数实现事物的行为,这样就使编程方式和人的思维方式保持一致,极大的降低了思维难度。 什么是封装(Encapsulation) 制造汽车的过程中什么人最牛?当然不是焊钢板的,也不是装轮胎的,更不是拧螺丝的,而是设计汽车的工程师,因为他知道汽车的运行原理。但是我们开车时,需要知道汽车的运行原理吗?答案显然不需要。汽车的运行原理已经被伟大的工程师封装在汽车内部,提供给司机的只是一个简单的使用接口,司机操纵方向盘、刹车及各种按钮就可以灵活自如的开动汽车了。 与制造汽车相似,面向对象技术把事物的状态和行为的实现细节封装在类中,形成一个可以重复使用的“部件”。类一旦被设计好,就可以像工业部件一样,被成千上万的对其内部原理毫不知情的程序员使用。类的设计者相当于汽车工程师,类的使用者相当于司机。这样程序员就可以充份利用他人已经编写好的“部件”,而将主要精力集中在自己的专属领域。 对象是封装了数据和操作的程序块。所谓封装是为这个程序块建立显示的界面。其它对象只能向这个界面发消息,不能访问内部的私有数据和操作。比如我们要求某人“坐下”(发消息),某人接受消息后调整自己的肌肉、神经使自己坐下(操作),从而改变了他的状态(描述姿态的数据变了)。外界不必过问动用了哪几条神经,收缩了哪几块肌肉。 什么是接口(Interface) 司机操纵方向盘、刹车及各种按钮就可以灵活自如的使用汽车,同样,人们通过类的接口使用类。程序员在编写类时精心地为它设计接口,而设计良好的接口不但方便其他程序员使用,还有利于类的升级改造。 假设你是一个环保人士,最近你用节能的荧光灯代替了普通的白炽灯。白炽灯通过加热电阻丝照亮整个屋子;荧光灯则是激活空气中的某些分子的电子能而发光。虽然它们的原理不同,但是它们的功能却是一样的—照明。因为两种灯具有相同的接口,所以你只需拧下白炽灯,然后再拧上荧光灯即可,轻易的实现“零件”的更新换代。同样,在面向对象编程中,只要保持接口不变,你可以任意更