JAVA变量及内存分配

来源:互联网 发布:php网络数据采集 编辑:程序博客网 时间:2024/05/16 05:21

JAVA变量的要素包括便变量名、类型、作用域。本质上讲,变量实际上是内存中的一块区域,使用变量名来访问这块区域。每个变量使用前必须要先声明,然后赋值才可以使用。

根据变量的声明位置,可以分成

①局部变量:声明在方法体内(包含方法的参数)或语句块内部的变量。

②成员变量:声明在方法体外,类内部的变量。成员变量可以使用任何一种数据类型,包括引用类型和基本类型(见下面),在定义成员变量时可以对他进行初始化,如果不对其进行初始化,JAVA将使用默认值进行初始化,如图(1)。成员变量的作用域是该成员变量所在的整个类体。注:类外面不能有方法的声明

如: public class Person{

    String name;//声明在类内部方法体外,所以是成员变量

    static int age;//声明在类内部方法体外,所以是成员变量

    public static void main(String[] args){

      int i;//声明在方法体内,是局部变量

                Person person=new Person();//person是局部变量,也是引用变量。

               System.out.println("age的值是"+age);//这个是正确的,因为JAVA已经对其进行了初始化,打印结果是0

               System.out.println("i的值是"+i);//这个是错误的,对于局部变量,系统不会自动初始化,必须要用户初始化(赋值)后才可以使用!

 

  }

         public void run(int m){  //m是方法的参数,是局部变量

                   //函数体                                                                                                                                                                 图(1)

    }

}

 根据所属数据类型分为:基本数据类型和引用类型,如图(2)。

图(2)

基本类型和引用类型的内存分配方式是不一样的。基本类型只占一块内存,引用类型实质上是指针,占两块内存。

如 int i=0;在内存里面只分配了一块内存,里面存放的就是值0,使用i这个名字来访问这块内存。

又如 String s;//此时为引用变量s分配了一块内存,但是目前这个内存什么也没有存,因为此时s不指向任何一个对象,所以是null

s=new String("hello");//使用new创建了一个对象后,又分配一块内存(堆),这个对象的内容“hello”就存放在新分配的内存中。而之前给s分配的内存也有了内容,根据这个内容就可以找到第二块内存,使用其中的内容(“hello”).

 

这里顺便说一下程序执行过程中内存的分配,如图(3):

图(3)

程序执行时都必须是在内存中。所以程序首先加载到内存,这时候程序代码就放在code segment这样的内存区域,然后找到main开始执行并如图所示为各种其他的变量、常量、对象等分配相应的内存。其中new出来的变量是放在堆中,局部变量是放在栈中的。例如上面代码示例中,Person person=new Person();person是一个局部变量,为它分配了栈内存,而person对象的实际内容如name和age的值是保存在堆中的,根据栈中存储的内容找到堆中person的具体内容,其内存分配情况参考下图(4)。此外,同一个类的每个对象有不同的成员变量存储空间,同一个类的每个对象共享方法,方法在执行的时候才会为其分配空间,不执行时候,就是一段代码。JAVA中进行函数调用传参时,基本类型传递的是该数值本身,引用类型传递的是对对象的引用,而不是对象本身。

图(4)