通过本文简单说明一下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下运行通过】
(如有错误,敬请指正)