java对象的内存管理_Java对象与内存管理

1、实例变量和类变量的内存分配

类变量:使用static修饰的成员变量是类变量,属于该类本身

实例变量:没有使用static修饰的成员变量是实例变量,属于该类的实例

由于同一个JVM内每个累只对应一个Class对象,因此同一个JVM内的一个类的类变量只需一块内存空间。

对于实例变量而言,该类没创建一次实例,就需要为实例变量分配一块内存空间,所以,程序中有几个实例,实例变量就需要几块内存空间。

2、类变量的初始化时机总是出于实例变量的初始化之前

我们先看下下面三段代码:

1)因为两个实例变量都是在创建变量的时候才开始分配空间,此时num2还没有分配,所以前向引用就会出现编译错误。

intnum = num2 +3;//非法前向引用,会报错

intnum2 =2

2)因为两个类变量在JVM加载类的时候分配空间,此时num2还没有分配,所以前向引用就出现变异错误。

staticintnum = num2 +3;//非法前向引用,会报错

tatic intnum2 =2

3)因为类变量num2在JVM加载类的时候空间已经分配好,而num在创建实例的时候踩分配空间,此时num2已经分配成功了,所以num前向引用成功。

intnum = num2 +3;//正确使用

staticintnum2 =2;

由上面三段代码块就可以验证得:类变量的初始化时机总是出于实例变量的初始化之前

3、Java对象的初始化方式及其执行顺序

Java对象的初始化方式有三种:1)构造器  2)初始化块  3)定义变量时指定初始化值

如果这三种初始化方式同时出现,也要注意,他们也有一个执行顺序的规定:

1)静态初始化块只在类第一次创建对象的时候运行一次,后面就不会再运行,而类在每次创建对象时,非静态初始化块总是会运行一次。

publicclassTest{

static{

System.out.println("执行---静态初始化代码块.");

}

{

System.out.println("执行---非静态初始化代码块.");

}

publicstaticvoidmain(String[] args) {

for(inti =1; i <=2; i++) {

System.out.println("创建第 "+ i +" 个对象");

newTest();

System.out.println();

}

}

}

运行结果:

2bbe6ad8f7f448f7795c10538b338d7a.png

2)构造器每次创建对象时,构造器必然有执行的机会,此时,非静态初始化块必定也将获得机会并且运行在构造器之前

publicclassTest{

{

System.out.println("执行---非静态初始化代码块.");

}

publicTest() {

System.out.println("执行---构造器.");

}

publicstaticvoidmain(String[] args) {

for(inti =1; i <=2; i++) {

System.out.println("创建第 "+ i +" 个对象");

newTest();

System.out.println();

}

}

}

运行结果:

731fda78acddb98095c9b96a92caf72f.png

31/3123>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值