关闭

Java对象与内存管理

发表于:2013-4-01 09:11

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:小学徒V    来源:51Testing软件测试网采编

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

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

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

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

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

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

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

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

  1. int num = num2 + 3;    //非法前向引用,会报错 
  2. int num2 = 2

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

  1. static int num = num2 + 3;    //非法前向引用,会报错 
  2. tatic int num2 = 2

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

  1. int num = num2 + 3;    //正确使用 
  2. static int num2 = 2;

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

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

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

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

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

  1. public class Test{ 
  2.      static { 
  3.          System.out.println("执行---静态初始化代码块."); 
  4.      } 
  5.       
  6.      { 
  7.          System.out.println("执行---非静态初始化代码块."); 
  8.      } 
  9.       
  10.      public static void main(String[] args) { 
  11.          for (int i = 1; i <= 2; i++) { 
  12.              System.out.println("创建第 " + i + " 个对象");  
  13.              new Test(); 
  14.              System.out.println(); 
  15.          } 
  16.      } 
  17.  }

  运行结果:

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

  1. public class Test{ 
  2.   
  3.      { 
  4.          System.out.println("执行---非静态初始化代码块."); 
  5.      } 
  6.       
  7.      public Test() { 
  8.          System.out.println("执行---构造器."); 
  9.      } 
  10.       
  11.      public static void main(String[] args) { 
  12.          for (int i = 1; i <= 2; i++) { 
  13.              System.out.println("创建第 " + i + " 个对象");  
  14.              new Test(); 
  15.              System.out.println(); 
  16.          } 
  17.      } 
  18.  }

  运行结果:

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号