美文网首页java基础
Java变量声明与使用时的内存分配机制

Java变量声明与使用时的内存分配机制

作者: 冰糖雪梨葫芦甜 | 来源:发表于2018-11-19 12:00 被阅读0次

前言

考虑如下代码:

//: xin/greglee/demo/Demo.java
public class Demo {
    public static void main(String[] args) {
        // test1
        int a = 6;
        int b = a;
        b = 77;
        System.out.println(a);
        // test2
        Node node1 = new Node(6);
        Node node2 = node1;
        node2.data = 77;
        System.out.println(node1.data);
    }
}
class Node {
    int data;
    public Node(int data) {
        this.data = data;
    }
}/*output:
6
77
*///:~

test1与test2进行了相似的过程,但为何得到的结果却截然相反呢?希望在阅读本文后,读者能够找到问题的答案。

JVM中的堆和栈

堆(heap)

用于存放所有的Java对象。

栈(stack)

用于存放基本类型的数据和对象的引用。

变量的声明与使用

基本类型

Java中的基本类型有8种:boolean、char、byte、short、int、long、float、double(注意:String是对象,不是基本类型)。
声明一个基本类型的变量时,会在栈中为该变量分配一块内存,当对其初始化和赋值时,可以简单的理解为将值存储在这块内存中。
注:事实并非如此,这样描述是为了简化理解,但这样理解通常不会得到错误的结果,如果读者感兴趣,可自行查阅JVM相关资料。

对象

声明
声明一个对象类型的变量时,同样会在栈中为该变量分配一块内存,不同的是:这块内存用来存储一个对象的引用
赋值
当使用new关键字创建一个对象,会在堆中分配空间来存储此对象,通过赋值号 “=” 可以将new关键字创建出的对象的引用存储在相应对象类型的变量中。
当使用赋值号将一个对象类型的变量赋值给另一个变量时,由于该变量存储的是一个对象的引用,因此实际上是将引用赋值给了另一个变量。此时,可以简单的描述为:这两个变量引用了同一个对象。
调用
当使用英文句点(.)通过一个对象类型的变量调用其引用对象的成员时,首先通过该变量存储的引用找到其引用的对象,然后再从此对象中找到相应的成员。
tips:关于对象的引用和对象的关系,可以理解为遥控器和电视机的关系:遥控器是引用,引用的是电视机,你可以通过控制遥控器来控制电视机。

回到问题

对于test1,使用了两个基本类型的变量a、b,两个变量各有一块内存存储它的值。因此改变b的值并不会影响a的值,故输出6。
对于test2,使用了两个对象类型的变量node1、node2,两个变量各有一块内存来存储一个对象的引用。
Node node1 = new Node(6) 创建了一个Node对象,将其data值初始化为6,并将该对象的引用赋值给node1。
Node node2 = node1 将node1存储的引用赋值给了node2,也就是说,node2和node1引用了同一个对象
node2.data = 77 通过node2存储的引用找到其引用的对象、访问该对象的成员data,并将77赋值给该对象的成员data。
System.out.println(node1.data) 输出node1引用的对象的成员data的值,由于node1和node2引用的是同一个对象,而上面已经通过node2将该对象的成员data的值赋值为77,因此输出77。

相关文章

  • Java变量声明与使用时的内存分配机制

    前言 考虑如下代码: test1与test2进行了相似的过程,但为何得到的结果却截然相反呢?希望在阅读本文后,读者...

  • Java学习笔记4(对象与内存的控制)

    Java 内存管理分为:内存分配和内存回收实例变量 和 类变量 局部变量 特点:作用时间短,存储在方法的栈内存中 ...

  • 06 性能优化-内存优化-内存的分配和回收机制

    1 Java内存分配机制和回收机制 1.1、Java的内存分配区域 Java内存分配主要包括以下几个区域: 方法区...

  • JVM内存模型

    概览 Java程序内存的分配是在JVM虚拟机内存分配机制下完成,Java内存模型(Java Memory Mode...

  • 安卓和java内存分配和管理机制 (jdk1.7之前和之后区别)

    java使用虚拟机jvm进行内存的分配 在Java中,内存的分配是由jvm完成的。 java采用GC机制进行内存管...

  • JavaScript的垃圾回收机制

    垃圾回收 程序是运行在内存里的,当声明一个变量、定义一个函数时都会占用内存,当变量或函数不再使用时,就把所分配的内...

  • 管理与分配内存

    1. java的内存管理机制 Java的内存管理就是对象的分配和释放问题 ,分两个部分 分配:内存的分配是由程序完...

  • Java内存泄露

    1. Java内存回收机制 原文转自:Java 内存泄露 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地...

  • Android内存管理机制

    Android内存管理机制的定义 内存的分配 内存的回收 管理机制的说明 管理的内存对象 进程 对象 变量 管理的...

  • JVM 内存管理

    内存管理=内存分配+内存回收 内存分配 JMM指Java内存管理线程之间的共享变量存储在主内存(main memo...

网友评论

    本文标题:Java变量声明与使用时的内存分配机制

    本文链接:https://www.haomeiwen.com/subject/cnvofqtx.html