解析对象--什么是对象

对于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,报错信息为 NullPointerException 。修改这个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,大致过程如下所示:

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

写到这里也算是讲完了对象是什么。来个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);

}

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值