A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程金 中级黑马   /  2012-9-15 22:22  /  2506 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 程金 于 2012-9-17 17:25 编辑
  1. public class Test {
  2.         
  3.         public final static Test test1=new Test();
  4.         
  5.         public static void main(String[] args) {
  6.                 Test test=new Test();
  7.                
  8.                 //1.此处要实例化的时候,
  9.                 //会去先初始化Test类对象,而初始化类对象的过程是
  10.                 //先初始化静态变量test1,就需要new一个Test实例对象,而new实例对象却要
  11.                 //先Test1初始化,就还是需要new一个Test实例对象,这流程到底是怎样的?

  12.                
  13.                 //是不是实例化test的时候根本就不关心test1, test1不是实例的成员变量?
  14.            
  15.                  
  16.                
  17.                
  18.                
  19.         }
  20. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
public final static Test test1=new Test(); //注意这是定义的静态的,所以在类new之前就存在的text1
   public static void main(String[] args)

                Test test=new Test(); //这个是类创建后,才会创建的。会覆盖之前存在的text1
回复 使用道具 举报
皮卫凯 发表于 2012-9-15 22:30
public final static Test test1=new Test();  //注意这是定义的静态的,所以在类new之前就存在的text1
    ...

在第一次初始化静态成员变量test1的时候,要new一个Test实例赋值给test1呀,那new Test实例的时候又要先初始化它的静态成员变量test1
回复 使用道具 举报
test1是一个Test类的静态变量,它是一个Test类的对象引用,在编译期就存储到静态区了,但是因为类还没有完成初始化,所以没有指向。
当类完成初始化,在堆中创建一个实例new Test (),然后就会把test1这个引用指向该实例。
回复 使用道具 举报
public final static Test test1=new Test();
静态变量声明语句只执行一次
回复 使用道具 举报
孙岳 发表于 2012-9-15 22:39
test1是一个Test类的静态变量,它是一个Test类的对象引用,在编译期就存储到静态区了,但是因为类还没有完 ...

new实例对象之前你不需要先初始化静态成员变量?换句话说要new实例对象的时候,该实例对象的test1需要先初始化后才能完成实例化,(难道不需要),又怎能完全创建实例后再将它的引用赋给test1.
回复 使用道具 举报
使用final static修饰的量不可以被改变,而且该量是属于类的。final static 经常用于修饰类的静态变量时表示一个常数,其实更多的还是用在接口里,毕竟用在类里面可能会被子类隐藏。
你上边定义的test1是一个Test类的静态变量,其在编译期就存储到静态区了,但是因为类还没有完成初始化,并没有明确的指向,当类完成初始化,在堆中创建一个实例new Test (),然后就会把test1这个引用指向该实例。就是将test指向该实例
回复 使用道具 举报
孙岳 中级黑马 2012-9-16 12:19:49
8#
程金 发表于 2012-9-15 23:06
new实例对象之前你不需要先初始化静态成员变量?换句话说要new实例对象的时候,该实例对象的test1需要先初 ...

public final static Test test1=new Test();
当执行到这句的时候,实际上只是执行了一部分。因为test1
初始化分为两步,第一是Test test1 = NULL;第二步是test1 = new Test();
test1是final static类型的,所以在编译时期就确定了所需内存的大小,然后就存储到静态区了,因为test1中存的是一个地址。也就是在堆中创建的Test()这个对象实例的起始地址,但是Test类完成初始化之前,没有实例,所以test1是没有指向的,也就是只执行第一步,分配内存空间,并赋值为NULL。
然后,程序继续向下执行,完成类的初始化,然后创建实例,并把起始地址赋给test1。这才是第二步,真正完成了静态变量的初始化。
回复 使用道具 举报
程金 中级黑马 2012-9-17 15:02:22
9#
问题我已解决,怎么结贴呀
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马