zoukankan      html  css  js  c++  java
  • 引用类型在内存中的情况

    这里有一个类已经声明好,class Car{

      String name;

    }

    这里类只有一个name属性,下面来实例化对象,对其属性赋值,

    Car car1=new Car();

    car1.name="现代";

    在内存中整个过程是怎么样的呢?首先我们的内存条分成三个区域,分别是 栈内存,堆内存,存储区。

    类加载过程中,JVM首先在内存中开辟一块空间,JVM的一个小弟叫类加载器ClassLoader把放在硬盘上的的class文件加载到

    存储区,当然,这里其实并非真的把硬盘上的class文件拷贝到内存,毕竟实际文件很大,计算机内存有限,完全放进去那多少内存也不够。

    因此,这里只是在存储区的方法区(存储区有细分为三块,常量缓冲区,方法区(就是指类,方法是依托在类里面的嘛),静态元素区(static))建立了一个映射关系,

    在方法区就有了一个跟硬盘一模一样的模板类Car。

    Car car1=new Car();

    Car car1这半句,在栈内存中声明了一个引用类型car1,如果要new Car(),则是通过在方法区的Car模板在堆内存中建立了一个内存空间,即new Car,

    通过‘=’赋值给car1,这里的赋值是将在堆内存中new Car的内存地址给了car1.

    car1.name="现代";这句话的含义是通过栈内存的car1地址找到堆内存的name,并给它赋值(注意,new的对象属性一开始都有初始默认值的)

    如果再声明一个

    Car car2=new Car();

    car2.name="宾利";

    那么跟之前的过程一模一样,在堆内存新开辟了一个car2的空间,两者互不影响。

    假如Car car1只声明,不new呢

    Car car1=car2;

    那么打印出来的name应该是什么?

    car1如果不new,则在堆内存中没有开辟空间,即不存在实例化对象。

    将car2赋值给car1,则实际将car2的地址给了car1,那么如果car1.name的值也就变成跟car2.name一样了。两者都指向宾利这一个地址。

  • 相关阅读:
    在linux系统安装tomcat后,bin文件下startup.sh启动不
    利用教育邮箱注册JetBrains产品(pycharm、idea等)的方法
    linux 查看当前系统版本号
    windows 重装系统
    linux rpm方式安装mysql
    官网下载MySQL最新版本的安装包
    Redis随笔
    八大排序算法的java实现
    XML的两种解析方式
    Quartz快速入门
  • 原文地址:https://www.cnblogs.com/hebiao/p/11576223.html
Copyright © 2011-2022 走看看