黑马程序员技术交流社区

标题: 论局部变量,成员变量和全局变量 [打印本页]

作者: 茶茶boy    时间: 2020-2-28 16:41
标题: 论局部变量,成员变量和全局变量
论成员变量    局部变量   全局变量之间的区别:

这也是静态变量存在的主要作用:(注意:严格来说在Java中静态变量是没有全局变量,全局变量是c语言的概念(不依赖类而存在),而Java所有变量必须依赖于类,但是,Java类中静态变量却起到了类似c语言中全局变量的作用,即所有类和对象都可通过类名.属性名的方法来使用它,所以,静态变量又叫全局静态变量)

总结:静态属于类,但是被项目所有类和对象共享

    所谓静态,是指,当类加载的时候,就开始被创建,在类中只有一份,在类消失的时候才被清理
      在类中只有一份的补充解释: 变量值只有一个(可变)   地址值一经加载便不会改变(不可变)



public class Student{

   public void  method(){

     Stringname="张三";
    static int age=18;
    ..................
    }

}



上面伪代码执行过程: 当Student 被虚拟机加载时  会发现类中的静态变量,那么他会在方法区开辟一个空间来对这个变量实例化并赋予默认值或相应值,同时在堆中开辟一个空间来存储这个方法区的地址,

后面如果对这个类进行实例化,这个类对象在堆中是这样的:
1: 在堆中开辟空间,将空间地址返回给栈中引用类型变量 Student st;

              此时堆中有Student的成员变量和成员方法的地址(指向方法区),以及静态属性的地址,
    注意,这个地址指向的不是方法区而是(那么他会在方法区开辟一个空间来对这个变量实例化并赋予默认值或相应值,同时在堆中开辟一个空间来存储这个方法区的地址)
    这句话中的地址,这句话的地址才是静态属性真正的地址

若对象有一方法,这个方法使用到了这个静态变量,其运行步骤如下:
1: 栈中对象.方法语句执行,通过对象去堆中找方法,找到地址值,通过这个地址值去方法区找方法,找到,方法进栈,
方法执行发现需要静态变量,去这个对象找,找到一串地址(指向上述绿色那个值),找到的是这个静态变量的实际位置(注意:是实际位置,不是这个静态变量)
通过这个地址在方法区中终于找到了这个静态变量,返回给方法
2:方法开始执行,然后方法弹栈



方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
唯一指的是静态变量地址的唯一(限制引用类型),不是值的唯一
关于值的唯一补充解释:不能允许多个值,不是不能改值


    放在栈中,当方法被调用时而存在,当方法调用结束而消失,生存时间短
    作用在整个类中(除静态方法不能使用,静态方法没有隐式的this),被对象调用。(堆中找)
              作用在一个局部区域,比如说在一个方法中,方法调用。(随之进栈)

     在对象被创建时而存在,当对象被GC回收的同时,他也会消失,生存时间适中。



总结


                     new的对象放在堆中,8中基本数据类型(还记得吗)变量放在栈中,变量所对应的值是放在栈中。
切记:静态变量不可写在方法内,只能写在类中方法外:这也是为啥它能在方法区中被实例化的一个原因









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2