Java对象与内存管理
作者:网络转载 发布时间:[ 2013/4/1 9:47:59 ] 推荐标签:
1、实例变量和类变量的内存分配
类变量:使用static修饰的成员变量是类变量,属于该类本身
实例变量:没有使用static修饰的成员变量是实例变量,属于该类的实例
由于同一个JVM内每个累只对应一个Class对象,因此同一个JVM内的一个类的类变量只需一块内存空间。
对于实例变量而言,该类没创建一次实例,需要为实例变量分配一块内存空间,所以,程序中有几个实例,实例变量需要几块内存空间。
2、类变量的初始化时机总是出于实例变量的初始化之前
我们先看下下面三段代码:
1)因为两个实例变量都是在创建变量的时候才开始分配空间,此时num2还没有分配,所以前向引用会出现编译错误。
int num = num2 + 3; //非法前向引用,会报错
int num2 = 2
2)因为两个类变量在JVM加载类的时候分配空间,此时num2还没有分配,所以前向引用出现变异错误。
static int num = num2 + 3; //非法前向引用,会报错
tatic int num2 = 2
3)因为类变量num2在JVM加载类的时候空间已经分配好,而num在创建实例的时候踩分配空间,此时num2已经分配成功了,所以num前向引用成功。
int num = num2 + 3; //正确使用
static int num2 = 2;
由上面三段代码块可以验证得:类变量的初始化时机总是出于实例变量的初始化之前
3、Java对象的初始化方式及其执行顺序
Java对象的初始化方式有三种:1)构造器 2)初始化块 3)定义变量时指定初始化值
如果这三种初始化方式同时出现,也要注意,他们也有一个执行顺序的规定:
1)静态初始化块只在类第一次创建对象的时候运行一次,后面不会再运行,而类在每次创建对象时,非静态初始化块总是会运行一次。
public class Test{
static {
System.out.println("执行---静态初始化代码块.");
}
{
System.out.println("执行---非静态初始化代码块.");
}
public static void main(String[] args) {
for (int i = 1; i <= 2; i++) {
System.out.println("创建第 " + i + " 个对象");
new Test();
System.out.println();
}
}
}
运行结果:
2)构造器每次创建对象时,构造器必然有执行的机会,此时,非静态初始化块必定也将获得机会并且运行在构造器之前
public class Test{
{
System.out.println("执行---非静态初始化代码块.");
}
public Test() {
System.out.println("执行---构造器.");
}
public static void main(String[] args) {
for (int i = 1; i <= 2; i++) {
System.out.println("创建第 " + i + " 个对象");
new Test();
System.out.println();
}
}
}
运行结果:
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11