(60)对象
最后更新于:2022-04-01 10:59:36
## Java编程那些事儿60——对象
郑州游戏学院陈跃峰
出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb)
### 8.3 对象
对象(Object)是面向对象技术的核心,按照面向对象的思考方式,现实中的每个实体都是一个对象,比如一个人、数据库中的一张表等,总结起来,就是面向对象技术中的经典语句——万事万物皆对象。
#### 8.3.1 什么是对象?
其实面向对象技术只是提供了一种思考的方式,其思考方式就是把一个复杂的结构看成是一个整体,这样可以降低认知的复杂性。比如认识一个电脑,按照面向对象的认知方式,就是先把电脑分成一个个的对象:显示器对象、硬盘对象、CPU对象等等,然后再一个一个的进行认知。
同时面向对象技术也是一种设计方式,其设计方式是把一个负责的模块划分为一个个小的模块分开进行设计,这样可以降低设计的复杂性。比如设计一个电脑,按照面向对象的设计方式,就是把电脑分成一个个的对象:显示器对象、硬盘对象、CPU对象等等,然后再一个一个的进行设计。
正因为面向对象无论在认知和设计方面都降低了复杂性,所以在程序设计语言中得到了广泛的应用。其实也就是是对现实已存在的内容的升华,所以面向对象存在于生活的很多方面,并不是计算机程序设计领域里的“阳春白雪”。
在语法角度来看,对象就是一个变量,只是该变量比较复杂,其内部既包含属性(数据),也包含方法(功能)。在Java语言中,把复合数据类型(包括数组、类和接口)的变量都称作对象。所以对象的概念相对来说,就显得跟具体了。
每个对象中存储类中对应属性的数值,或者从数据角度来理解对象的话,也可以把对象看作是类似C语言中结构体变量类似的结构。
下面来介绍一下Java语言中对象相关的语法。
#### 8.3.2 对象的语法
对象相关的语法主要包含四个部分:对象的声明、对象的初始化、引用对象中的属性和引用对象中的方法。
例如,有如下一个类的代码:
~~~
public class Box{
/**长度*/
int length;
/**宽度*/
int width;
/**高度*/
int height;
public Box(){
length = 10;
width = 10;
height = 10;
}
public Box(int l,int w,int h){
length = l;
width = w;
height = h;
}
/**求体积的方法*/
public int volume(){
return length * width * height;
}
}
~~~
##### 8.3.2.1 对象的声明
对象的声明,就是声明一个变量,其语法格式和变量声明的语法完全相同,格式如下:
数据类型对象名;
这里要求数据类型必须为复合数据类型,基本数据类型声明的结构只能称为变量,而不能称为对象。
示例代码:
Box b;
这里声明了一个Box类型的对象b,该对象在内存中不占用存储空间,其值为null。当然声明对象时也可以采用如下格式:
Box b,b1;
##### 8.3.2.2 对象的初始化
由于只声明的对象在内存中没有存储空间,所以需要为对象在内存中申请空间,并初始化各个属性的值,这个过程称作对象的初始化。
对象的初始化,都是通过直接或间接调用构造方法实现。对象的初始化可以和对象的声明写在一起,也可以分开进行书写,其语法格式如下:
对象名 = new 构造方法(参数);
例如:
Box b = new Box();
Box b1;
b1 = new Box(2,3,4);
其中对象b使用Box类中不带参数的构造方法进行初始化,按照Box类的结构,对象b中每个属性的值被都被初始化为10。而对象b1使用Box类中带参数的构造方法进行初始化,依据构造方法的结构,依次指定对象b1中的长、宽、高依次是2、3、4。
在初始化对象时,调用的构造方法必须在类中声明过,否则不能调用。因为类名和构造方法的名称相同,所以名称一般不容易发生错误,在实际使用时注意参数列表的结构也需要匹配。
有些时候,因为某些原因,把构造方法隐藏起来,这个时候可以使用其它的途径来创建对象,例如使用某些方法的返回值进行初始化等。
对象在初始化以后就可以进行使用了。
##### 8.3.2.3 引用对象中的属性
对象是一个复合变量,很多时候需要引用对象内部的某一个属性,其语法格式为:
对象名.属性名
该语法中“.”代表引用,使用该表达式可以引用对象内部的属性,则该表达式的类型和该属性在类中声明的类型一致。
例如:
b.width = 5;
该语法中,b是对象名,width是对象b中的属性,因为在类Box中width属性的类型是int型,则该表达式的类型也是int类型,在程序中可以把该表达式看成是int类型的变量进行实际使用。
而在实际的面向对象程序中,一般都避免使用对象直接引用属性(使用访问控制符实现访问限制),而替代的以getter和setter方法进行访问。
##### 8.3.2.4 引用对象中的方法
如果需要执行对象内部的功能,则需要引用对象中的方法,也就是面向对象术语中的“消息传递”,其语法格式如下:
对象名.方法名(参数)
这里“.”也代表引用,使用该代码可以引用对象内部的方法,该语法中的参数必须和引用方法的声明结构匹配。
例如:
int v = b.volume();
这里引用对象b中的volume方法,实现的功能是求对象b的体积,并且把求得的体积赋值给变量v。
在实际的项目中,通过引用对象中的方法实现项目中信息的传递以及功能的实现,通过对象和对象之间的关联,构造成一个有机的系统,从而代表实际项目中标的各种需求。
对象相关的语法就介绍这么多,在后续的学习中将经常用到。
#### 8.3.3 对象的存储形式
对象是一个复合数据类型的变量,其存储方式和一般变量的存储方式也不相同。在Java的执行环境中,存储区域一般分为两类:
1. 栈内存
该区域存储基本数据类型
2. 堆内存
存储实际的对象内容。
而实际的对象存储比一般变量复杂,对象的存储分为两部分:对象的内容、对象内容的起始地址。