解析对象--什么是对象

本文如有不严谨之处,请留言指正,我及时作出更改。

本文主要针对有一定基础的java程序猿,不适合零基础的人阅读。转载请注明出处。

 

对于java程序猿来说,大家对对象都是非常熟悉的,那么请问,对象是什么?在java中以什么形态存在?

ok,举一个例子(bug)

public Person{

private int age;

public int getAge(){

return age;

}

public void setAge(int age ){

this.age = age;

}

}

在mian中这么写:

Person p = null;

p.getAge();

这是一个很简单的bug,报错信息为 NullPointException 。修改这个bug也很简单,只需要在调用函数之前,对对象进行初始化就可以了,比如 Person p = new Person()

但是大家有没有想过,为什么报错信息会是这个?为什么不是ObjectNotCreated呢?

这个命名是有一定道理的,所以,对象是什么?

大家知道java中有基本类型(比如int)和复杂类型(比如Object)。

当你创建一个int型变量的时候,比如 int i = 1 , 那么该变量是怎么被创建出来的呢?

(注意:java内存包含栈和堆。栈的速度快,但是内存很小,所以使用的时候必须要清楚的知道从哪里开始到哪里结束;堆的速度慢,但是内存很大,用的时候根本不需要考虑从哪开始到哪结束,财大气粗,随便一划拉就是一堆。详情请百度)

解析int i = 1 这行代码可得:等号左边描述的内容是一个int类型的变量,变量名为i,等号右边描述的就是一个数值1。那么编译器是怎么工作的?首先编译器会在栈中为int i分配一块内存,然后会在内存中寻找,是否已经有一块已知内存并且存放的内容是1,如果有的话,将i指向该块内存;如果没有,则开辟一块内存,将1存放进去,并将i指向该块内存。

那么,Person p = new Person()又是怎么被创建的呢?

解析Person p = new Person()可得:等号左边描述的内容是一个Person类型的变量,变量名字为p,等号右边......

创建对象的时候,编译器会在栈中为Person p 划分一块区域,然后会在堆中为对象的主体划分一块区域,并将该内存地址的引用返回给p,由此可见,Person p = new Person()等号右边完成了对象内存的区域划分(考虑一下,对象是怎么被创建的?),并将该区域的引用返回给p,大致过程如下所示:

解析对象--什么是对象

 

也就是说,对象其实是堆中的一块内存区域,而我们平时操作的只是指向该内存的引用,引用也可以换一种说法,叫做指针(专门存放地址的一种变量),所以之前的报错信息才会是NullPointException。

写到这里也算是讲完了对象是什么。来个bug巩固一下。

下面的代码错哪了?为啥错了?怎么改?

要求:创建3个age分别为0,1,2的Person类对象,并放入List中

List<Person> pList = new ArrayList<Person>();

Person person = new Person();

for(int i=0;i<3;i++){

person.setAge(i);

pList.add(person);

}