Java变量与对象的内存

概念

以下列程序为例:

public class  数组内存
{
	public static void main(String[] args) //这是一个main方法
	{
		int it = 20;  //占用4个字节
		int[] iArr = new int[4];  //数组占16字节
	}
}

一、变量与对象:

——变量是地址(16进制),对象是创建出来的空间
即:iArr是(数组引用)变量;int[4]是(数组)对象(/实例)
*(把数组换成类,一样成立)*eg:Dog d = new Dog();则Dog()是类对象(实例对象)
【重申】创建对象:var 变量 = new 构造器(参数)

对象:实例对象+数组对象+字符串对象 等等

二、搞清楚:基本类型和引用类型

*基本类型变量:一个数、字符、布尔值等。
即:it为基本类型变量

*引用类型变量:是一个对象类型,其值是指向内存空间的引用(即地址),内存中存了引用类型变量的值
即:iArr为引用类型变量,即数组引用变量。

这句话是错的:基本类型数据存储在栈内存,而引用类型数据存储在堆内存

三、栈内存与堆内存

(1)栈内存在一个方法内定义的变量 会存储在栈内存中,方法执行完后,栈内存会销毁。(栈内存是每次方法运行时分配的一块临时的、很小的内存区
也就是说——方法中的局部变量不管是什么类型 )是存储在栈内存中的。
(每个方法都有自己对应的栈区,有几个方法就有几个栈区)

即:it 是在方法(main方法)里面定义的局部变量,是基本类型变量,因此it放入栈内存中(占用4个字节)
iArr 也是在方法中定义的局部变量,引用类型变量iArr在栈内存中,
————基本类型变量+引用类型变量 存放在栈内存。

(2)堆内存:当在程序中创建一个对象时,这个对象会被保存在堆内存中以便反复利用,堆内存中的对象不会随着方法的结束而销毁,之后可以被另一个引用变量所引用。只有当一个对象没有任何引用变量引用它时,垃圾回收器才会在合适的时候回收它。
堆内存是JVM启动时分配的一块永久的、很大的内存区

——new出来的变量放在堆内存中!
即:int[4]是数组对象(实例),是在堆内存中的!!(new出来的)

又比如说:

定义Dog类:
public class Dog{
String name;
String color = “黄色”;
int age;
}

再定义DogTest类:
public class DogTest{
…main…
var d = new Dog();

}
这个Dog()实例里实际放的是Dog类中的成员变量,在这里new之后就是实例变量,它们实际上在堆内存中!!!

详细步骤:1)声明变量d(创建main方法栈帧,存放引用变量:var d );2)在堆中初始化对象Dog(此处自动默认初始化);3)把被初始化对象的地址赋给d变量;4)再给成员变量赋值。
( 执行引擎每调用一个函数(方法)时,就为这个函数创建一个栈帧,并加入虚拟机栈。)
在这里插入图片描述
对象Dog()的成员变量,可以不用指定初始值,系统会分配默认初始值。(字符串类型存储的是它的地址,不是字符本身)

内存总结:

Java的内存分配 上,主要分4个块!
(1)一块是用来装源文件代码的,就是编译的东西。
(2)一块是用来装静态变量的,例如用static关键字的变量,例如字符串常量。
(3)一块是stack,也就是,是用来装变量和引用类型的!但区别在于,装了变量以后,变量上是有值的,而引用类型本身在stack上是没有值的。
(4)一块是heap,也就是!堆可以一句话概括,装new出来的东西
——所以综上所述,基本数据类型都在stack中,而引用类型,变量是放在stack中,new出来真正有内容的东西放在heap中,也就是当new了一个新的引用类型,他就会放在堆中,同时栈中的引用类型变量会指向堆中你new出来的东西!

public class DogTest
{
      Dog d = new Dog();
     System.out.println("d.name");//输出null
      System.out.println("d.color");//输出黄色
      System.out.println("d.age");//输出0
      d.name = 旺财;
      System.out.println("d.name");//输出旺财
      
      Dog dg = d;
      System.out.println("dg.name");//输出旺财
      
      dg.name = "小花";
      System.out.println("dg.name");//输出小花
}

在这里插入图片描述
当dg.name = “小花”;语句执行后,地址不再指向“旺财”,而是指向“小花”
在这里插入图片描述

所有的类都是引用类型的变量!
数组也是引用类型的变量!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值