Java学习笔记(疯狂Java讲义第三版)——对象、引用和指针

public class Person
{
public int age;
public String name;
public void say(String content)
{
System.out.println(content);
}
}
Person p1 = new Person();//该语句声明了变量类型为Person、变量名为p1的引用类型变量。同时创建了一个Person类的对象
p1.age = 5;
p1.name = “张三”;
我们重点看语句Person p1 = new Person();
此时需要注意:变量p1在计算机内存中的栈区域,而new Person()对象则在计算机的堆内存中。在这里,可以这样来简单理解计算机的内存——在计算机的内存分为好多个区域,其中有一个区域叫做栈,一个区域叫做堆。
特别注意,只要在方法中声明的变量无论是基础数据类型还是引用数据类型,该变量都会出现在"栈"这个内存区域中。而只要是通过new关键字创造出来的对象都在内存区域的"堆"这个区域中,这一点跟是不是在方法中创建对象无关,只要是通过new关键字创建的对象都会在堆内存区中。

而该赋值语句Person p1 = new Person();实际上并不是把new Person()对象本身赋给了变量p1,而是将new Person()对象所在堆内存区域中的位置信息赋值给p1变量。换句话说Person类型p1变量本身并不是存储了new Person()对象本身,而是存储了该对象所在的名为"堆"内存这一区域中的位置信息。
而p1.age = 5;和p1.name = “张三”;实际的操作流程是先通过p1中存储的new Person()对象所在的位置信息,在堆内存中找到new Person()对象本身。然后再访问new Person()对象里面的成员变量age和name。
而由于并不是通过对象new Person()本身来访问它自己的成员而是通过变量名为p1这一Person类型的变量来间接访问new Person()对象的成员。所以该访问形式也称为讲解访问。而p1类似的变量也称为引用类型变量。

而为什么不能直接访问呢?个人认为大概有以下两个原因。
1.Java语言语法规定是不能直接访问堆内存中的变量的。
2.我们注意看Person类的成员变量,里面有一个int类型的成员变量和一个String类型的成员变量。所以它的实际所占用的空间相对来说还是比普通变量要大的多的,直接使用并不方便。而且直接把对象本身赋值给变量p1,那么p1本身也变得很大了,这样是十分浪费内存空间的。而实际上p1本身是很小的,因为它只需存储对应对象的位置信息即可。同时通过它的位置信息来间接访问也会轻便很多。
这就好比别人问你一个比较复杂的问题,直接回答他是需要费时费力的,而此时我们可以直接给他一个网址,上面就有关于他所问的问题的答案,这样对于你自己来说就会简单很多了,毕竟你仅仅提供了一个网址就解决了他的问题。

其实Java中的应用类型变量本质就是c语言中的指针,里面存储的位置信息就相当于指针中存储的地址信息,new Person();就类似与C语言中的malloc()函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值