java中从内存区域和类加载机制理解类变量、成员变量和局部变量加载过程

1 定义

1.1 类变量

归属类的变量,它是通过在定义类的属性的时,增加static修饰符,所以又称为静态变量。类变量不仅可以直接通过类名.变量名来访问,也可以通过类对象.变量来访问.

1.2成员变量

归属于类的实例的变量,没有经过static修饰,成员变量存在于类之内,方法和代码块之外。实例变量只能通过类对象.变量访问。

1.3局部变量

是在类中方法体里面所定义的变量,不管是方法的形参,还是方法体内所定义的变量都是局部变量。局部变量的作用域是以其所在方法体的头大括号开始到尾大括号结束。

2基本数据类型默认值

这里写图片描述
所有引用类型的初始化值为null。

3 初始化问题

前面讲解了基本的概念,下面我们就说说关键点,各种变量初始化的过程到底是怎样,看了好多博客说的并不是很好,这里说下我个人的理解,如有错误,请大家指正出来,共同学习。
下面我通过一个简单的例子进行说明:

public class Test {
    //局部变量
    private int i=2;
    //类变量
    private static int y=3;

    public void demo(){
        int z=4;
        System.out.println(z);
    }

    public static void main(String[] args) {
       Test test=new Test();
       test.demo();
    }
}

Degub运行该类:
这里写图片描述
执行main方法虚拟机会初始化该类,此时有y=0,这和虚拟机的类加载机制不谋而合,首先什么事虚拟机的类加载机制呢?简单的理解就是虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。
类的加载过程包括五个阶段:加载、验证、准备、解析和初始化。
当我们运行的时候首先执行 private static int y=3;读取了类的静态字段会进行初始化,初始化之前会有准备阶段,准备阶段做的事情就是为类变量分配内存,并设置类变量的初始值,这里设置初始值通常情况下是数据类型的零值所以y=0,并不是直接把3赋值给y。这里为什么说通常情况呢?因为final修饰的常量特殊,如果有这样一行代码:public static final int value=1,此时value的值为1;
这里写图片描述
然后y进行初始化这时候y=3,对类变量赋值。
接下来执行Test test=new Test();
这里写图片描述
此时实例化该类首先对i赋初始值i=0;当我们新建一个对象时,虚拟机会在java堆中申请一块内存区域用以存放类的数据。而成员变量就是类的数据,也是放在这块内存区域中的。只需要JVM在申请内存的时候顺便把整块区域都置为零即可完成初始化。
这里写图片描述
然后在把2赋值给i。

这里写图片描述
最后执行test.demo();这是才使用到了局部变量z,把4赋值给4,局部变量是存放于java虚拟机栈中在执行java方法的时候会创建一个栈帧,用于存放局部变量表,操作数栈,动态链表,方法出口等信息。局部变量在编译器就会知道各种基本数据类型,分配所需要的内存空间,就已经确定好了,所以直接知道z=4。
整个过程执行结束。

猜你喜欢

转载自blog.csdn.net/yu0_zhang0/article/details/81128004