内存分配问题

通过本文简单说明一下java程序在定义变量及使用变量时内存的分配

下面举一个例子

例1:

class diyige
{
	int i;
	int j;
}

class asd
{
	public static void main(String[] args)
	{
		diyige aa = new diyige(); //11行
		aa.i = 10; 
		aa.j = 20;
		System.out.printf("%d, %d\n", aa.i, aa.j);
	}
}
输出结果为:

10, 20

在本程序中,第11行代码就等价于C语言中的 (diyige *)malloc(sizeof(diyige));

而new diyige() ,就是在堆中动态分配一块区域,被当做了diyige类的对象


可以将java中的引用理解成指针(当然,它们之间还是有所不同的)

aa本身的内存是在栈中分配的

这行代码的执行结果就是将堆中内存的地址赋给了aa,所以aa指向堆中的内存,aa代表了堆中的内存

aa.i 代表: aa这个静态指针变量所指向的动态内存中的A对象的i这个成员

aa.j 代表: aa这个静态指针变量所指向的动态内存中的A对象的j这个成员


另外,需要说明的是,最后将i, j两个变量的值打印输出,除了可以像上面的程序那样,用System.out.printf("%d, %d\n", aa.i, aa.j);之外,还可以这样,System.out.println(aa.i +", "+ aa.j);或者这样System.out.print(aa.i +", "+ aa.j);

使用哪种都行,具体的不做过多说明


下面再举一个例子

例2:

class dierge
{
	int i = 10;
	int j = 20;
}

public class asd
{
	public static void main(String[] args)
	{
		dierge aa1 = new dierge(); //11行
		dierge aa2 = new dierge(); //12行
		
		aa1.i = 50;
		aa2.i = 80;
		System.out.printf("%d %d\n", aa1.i, aa2.i);
	}
}

输出结果为:

50 80


在本程序中,需要注意的是,11、12行是生成了两个对象aa1和aa2,通过最终的输出结果可以知道,aa1和aa2所指向的已经不是同一个对象,即此时改变aa1中的变量的值,不影响aa2中变量的值,反之亦如此


再举一个例子

例3:

class dierge
{
	int i = 10;
	int j = 20;
}

public class asd
{
	public static void main(String[] args)
	{
		dierge aa1 = new dierge(); 
		dierge aa2 = aa1;   //12行
		
		aa1.j = 99;
		System.out.printf("%d\n", aa2.j);
	}
}

输出结果为:

99

通过这个程序我们可以看到,最终aa2中的变量的值与aa1中的变量的值相同,这是因为执行完第12行的代码后,aa1已经和aa2等价了


【所有代码均在windows系统下eclipse环境JDK 1.7运行通过】

(如有错误,敬请指正)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值