java中变量 常量的存储

来源:互联网 发布:驱鼠软件 编辑:程序博客网 时间:2024/05/16 07:54
                 

实用举例: 
1:堆栈(stack) 
方法的参数值 
public void sun (int a , int b)  
//调用方法是在栈内存中为参数分配存储空间,方法结束自动释放。  局部变量 
public static void main(String[] args){  int a = 5;   } //在方法中的局部变量,存储在栈内存中,方法结束时候,释放内存 引用变量 
Person p = new Person(“zhaoyue”, 22); //调用构造方法的时候,“形参”先在堆栈中开辟内存,存放“实参”,再把“实参”的//一份拷贝传入对象之中。此时,“实参”的拷贝存放在堆(heap)中,构造方法结束,//堆栈中的内存释放。 
堆栈的存储要领:压栈,出栈,自动清除! 
 
2:堆(heap) 
成员变量 
public class Person{ String name;   int age; } // New 的时候存储在堆中。  
    
new得到的对象 
Person p = new Person(“zhaoyue”, 22); // New 的时候存储在堆中。  
3:数据区(Data segment) 
3.1:静态存储(static storage) 静态变量 
public static int a = 5; 
//JVM运行时首先为其开辟空间,位置不变,程序运行结束时空间释放。并且在运行时只加载一次。 
 
静态方法 
public static void run() {  print(“hello”);  } 
//JVM运行时首先为其开辟空间,位置不变,程序运行结束时空间释放。并且在运行时只加载一次。  

3.2地址池(address pool) 非new的字符串 
String s = “hello world”;   3.3常量存储(constant storage) 常量  public final int a = 5;  
4:Code segment(代码区) 
4.1:Code segment 存放代码 
4.2:方法区(method area) 成员方法 
 Public void run(){System.out.println(“I’m run!”);} 
//类装载的时候存储在方法区,初始时被隐藏,实例化对象时被激活。   
具体解释: 
在java中有6中存取机制: 1: 寄存器(register) 2: 堆栈(stack) 3: 堆(heap) 
4: 静态存储(static storage) 5: 常量存储(constant storage) 6: 非RAM存储 
 
1 寄存器(register):这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。   
2 堆栈(stack):位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时候,JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些JAVA数据存储在堆栈中——特别是对象引用,但是JAVA对象不存储其中。  
3 堆(heap):一种通用性的内存池(也存在于RAM中),用于存放所有的JAVA对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候,只需要new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代码。用堆进行存储分配比用堆栈进行存储存储需要更多的时间。  
4: 静态存储(static storage):这里的“静态”是指“在固定的位置”。静态存储里存放程序运行时一直存在的数据。你可用关键字static来标识一个对象的特定元素是静态的,但JAVA对象本身从来不会存放在静态存储空间里。  
5: 常量存储(constant storage):常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中   
6: 非RAM存储:如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。  
速度: 
就速度来说,有如下关系:  
    寄存器 > 堆栈 > 堆 > 其他   
关系: 
然后我主要要说下堆与堆栈的关系:  
      堆:堆是heap,是所谓的动态内存,其中的内存在不需要时可以回收,以分配给新的内存请求,其内存中的数据是无序的,即先分配的和随后分配的内存并没有什么必然的位置关系,释放时也可以没有先后顺序。一般由使用者自由分配,在C语言中malloc分配的就是堆,需要手动释放。   
      堆栈:就是stack。实际上是只有一个出入口的队列,即后进先出(frist in , last out),先分配的内存必定后释放。一般由,由系统自动分配,存放函数的参数值,局部变量等,自动清除。   
还有,堆是全局的,堆栈是每个函数进入的时候分一小块,函数返回的时候就释放了,静态和全局变量,new得到的变量,都放在堆中,局部变量放在堆栈中,所以函数返回,局部变量就全没了。   
       JAVA中的基本类型,其实需要特殊对待。因为,在JAVA中,通过new创建的对象存储在“堆”中,所以用new 创建一个小的、简单的变量,如基本类型等,往往不是很有效。因此,在JAVA中,对于这些类型,采用了与C、C++相同的方法。也就是说,不用new 来创建,而是创建一个并非是“引用”的“自动”变量。这个变量拥有它的“值”,并置于堆栈中,因此更高效。 
 
再说一说类的实例方法! 











原创粉丝点击