第2节 对象和类
推荐给好友
打印
加入收藏
更新于2009-05-10 13:36:20

6.2 对象和类

对象(object)
现实世界中可以明确标识的任何事物。例如:一个人、一个汽车、一个圆、一张单据……
对象具有状态和行为
状态是域(Field)以及域的当前值构成的集合
行为是方法的集合

类(class)
类是定义对象的结构
类是定义一个对象的数据和方法的蓝本
对象是类的实例(instance)

对象的结构



用UML表示对象和类的关系



类的声明
class Circle
{ double radius = 1.0;
double findArea()
{ return radius*radius*3.14159; }
}
基本数据类型的成员变量的自动初始化
当一个对象被创建时会对其中各种类型的成员变量自动进行初始化赋值

数据成员-对象的自动初始化
对象成员变量的自动初始化值=null;

6.2.1 声明对象(产生一个句柄)


类名 对象名;
例如:
Circle myCircle;

创建对象(句柄与对象的关联)
对象名 = new 类名();
例子:myCircle = new Circle();

在一条语句中声明和创建对象
类名 对象名 = new 类名();
例子:Circle myCircle = new Circle();

6.2.2 简单类型变量和对象类型变量的区别



简单类型变量和对象类型变量的赋值



总结一下:对象与对象的引用
尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“句柄”(Handle)或“引用”,甚至一个“指针”。
可将这一情形想象成用遥控板(引用)操纵电视机(对象)。
只要握住这个遥控板,就相当于掌握了与电视机连接的通道。
但一旦需要“换频道”或者“关小声音”,我们实际操纵的是遥控板(引用),再由遥控板自己操纵电视机(对象)。
如果要在房间里四处走走,并想保持对电视机的控制,那么手上拿着的是遥控板,而非电视机。
引用和对象可以单独存在。

罗唆:初始化的重要性
对象和句柄可以单独存在:
即使没有电视机,遥控板亦可独立存在。也就是说,只是由于拥有一个句柄,并不表示必须有一个对象同它连接。可创建一个Circle引用:
如:Circle s;
但这里创建的只是句柄,并不是对象。若此时向s发送一条消息,就会获得一个错误(运行时)。这是由于s实际并未与任何东西连接(即“没有电视机”)。
句柄和对象的关联:
创建一个句柄时,记住无论如何都进行初始化:
Circle s = new Circle();

堆栈
驻留于常规RAM区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。
这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——特别是对象引用,但Java对象并不放到其


一种常规用途的内存池(也在RAM区域),其中保存了Java对象。
和堆栈不同, “堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。
因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!

静态存储
“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。

常数存储
常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。

一个存储实例
我们在一段程序执行过程中,分析内存模型的变化情况。

Point类?可放置一个二维图形点的x和y坐标



到达checkpoint #1时的内存模型


到达checkpoint #2时的内存模型



到达checkpoint #3时的内存模型



到达checkpoint #4时的内存模型



到达checkpoint #5时的内存模型



Review: 使用new关键字创建对象过程分析



基本数据类型的作用域



不合法的使用



对象的作用域



6.2.3 垃圾回收

一个方法退出时,局部变量和形参变量的内存弹出堆栈区。这使原先分配给局部变量的对象内存在堆中空闲(即没有向这块内存单元的引用),这个闲置对象内存由内存单元收集程序管理。

6.2.4 访问对象中的数据和方法

访问对象的数据:
objectName.data
例如:myCircle.radius
访问对象的方法:
objectName.method()
例如:myCircle.findArea()
示例:使用对象
在该例子中创建一个Circle类的对象myCircle,并且应用该对象中的数据和方法。
属于:
实例(成员)变量
实例(成员)方法


练习将上述两个类合成一个类



1,赋值运算符
请阅读程序,并分析程序的运行结果



2,关系运算符(==和!=)
请阅读程序,并分析程序的运行结果



3,逻辑运算符——短路
请阅读程序,并分析程序的运行结果



4,位运算符
为了方便对二进制位进行操作,Java给我们提供了四个二进制位操作符:
按位与
按位或
按位异或
按位取反

位运算符
按位与
01101101
00110111
00100101
结论:按位与,只有壹(1)壹(1)为1。

位运算符
按位或
01101101
00110111
01111111
结论:按位或,只有零(0)零(0)为0。

位运算符
按位异或
01101101
00110111
01011010
结论:按位异或,只有零(0)壹(1)或壹(1)零(0)为1。

位运算符
按位取反
01101101
10010010
结论:对二进制数按位取反,即0变成1,1变成0。

移位运算符
ava中有三个移位运算符
左移:<<
带符号右移:>>
无符号右移:>>>

移位运算符
数 x x<<2 x>>2 x>>>2
17 00010001 00 01000100 00000100 01 00000100 01
-17 11101111 11 10111100 11111011 11 00111011 11

聪明的你:试试吧!
作一个程序:能够打出任意输入数值的二进制表达形式!!!



上一节         下一节
相关链接


 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.