类与对象

1. 对象的内存

1.1 单个对象内存解析

典型代码

  1. Person p1 = new Person();
  2. Person p2 = new Person();
  3. Person p3 = p1

内存解析:

image.png

等号左边的变量是在栈中创建,等号右边的对象是在堆中创建

变量被赋予的只是对象的地址值

在创建对象的时候其属性先被赋予初始的值

数组对象的内存解析

image.png

jvm内存结构

image.png

虚拟机栈:java会将局部变量放到虚拟机栈中

虚拟机堆:存放代码中的实例(对象、数组等) 对象的属性也会在虚拟机堆中加载

方法区:类的加载信息、常量池、静态域

代码块

代码块分为非静态代码块和静态代码块

二者区别

  • 静态代码块
    • 内部可以输出语句
    • 随着类的加载而执行。而且只执行一次
    • 如果一个类定义多个代码块这按先后顺序进行执行
    • 静态代码块只能调用静态的属性、静态的方法
  • 非静态代码块
    • 随着对象的创建而执行
    • 可以再对象的创建的时,对对象的属性进行初始化