数据都存放在哪里? 1.寄存器。记得以前汇编里面有学习过,叫做register的东西,Java里面接触不到这个。 2.栈。Stack。放在RAM里面,随机存储器用来存储基础类型,例如short int long float double char byte boolean等,或者用来存储对象的引用。 例如: A a = new A(); A b = a; A c = a; 这里的b,c都是放在栈里面。 3.堆。Heap,也放在RAM里面,例子里面的a就是放在这里的。凡是new 出来的。。。不过String放在哪里的呢?是不是也放在这里呢? String s = "abc";//这里"abc"存放在常量存储区,s是引用,所以s在栈里面。 String s2= new String("abc"); //s2是new出来的,所以在堆里面。 String s3 = "abc"+"def"; // 如果"abcdef"已经在常量存储器里面创建了,那么s3就是引用,放入Stack,否则s3就在堆里 4.静态存储区,也在RAM里面。也就是Static声明的字段都放在这里,那Static声明的方法和类是不是也放在这里呢? 5.常量存储区,在ROM,只读存储器。用来放final声明的。 6.非RAM中。例如数据库,例如网络流中,用那种持久化技术存起来就好了。
其实我们可以将上面的6个部分笼统的分为4个,寄存器,栈(包括栈,静态存储区,常量存储区),堆,非RAM。寄存器和非RAM不在我们讨论范围内。只关心栈和堆。 先来段程序。 主程序: Test t = new Test(); t.see();
具体的类: class Test{ static int s1=1; String s2="abc";
public void see(){ int i=0; System.out.println("see"); } } 解释一下这段程序,先将主程序指令存入Stack,执行,第一句的时候,在Heap里面为t分配空间,建立对象实例的属性值,属性类型,以及对象本身的类型标记,在Stack里面建立对象的方法。最终将Heap里面t的4字节地址返给Stack中,等到t.see()调用的时候,see()方法默认传个隐藏参数进来,即调用see方法的对象的Heap地址,然后执行。 为什么静态方法不能调用非静态属性? 因为静态方法是最开始load进来的,放在Stack里,可以直接通过栈寻址找到它的,而非静态属性则是存放在Heap里面,只有实例化出具体对象才能存在。