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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡遇潮 黑马帝   /  2011-12-25 10:12  /  2189 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 胡遇潮 于 2011-12-25 16:17 编辑

public class Person {


        public Person()
        {
                System.out.println("gaga! ");
        }

        {
                System.out.println("nihao");
        }
        static
        {
                System.out.println("hello");
        }
       
        public static void main(String[] args)
        {
                Person p = null;
                System.out.println("**********");
                p=new Person();
        }
}
麻烦解释下在内存中分配空间的过程,还有运行过程?

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

4 个回复

倒序浏览
李楠 黑马帝 2011-12-25 10:34:27
沙发
java运行时的加载顺序:
1、首先加载要创建对象的类及其直接与间接父类。
2、在类被加载的同时会将静态成员进行加载,主要包括静态成员变量的初始化,静态语句块的执行,在加载时按代码的先后顺序进行。
3、需要的类加载完成后,开始创建对象,首先会加载非静态的成员,主要包括非静态成员变量的初始化,非静态语句块的执行,在加载时按代码的先后顺序进行。
4、最后执行构造器,构造器执行完毕,对象生成。
也就是说  static
        {
                System.out.println("hello");
        }
这部分在程序加载到内存的时候,就执行了。
然后是这一句 Person p = null;这里只是创建了一个类的引用,不调用构造器。
然后是这里 System.out.println("**********");
最后p=new Person();  调用构造器  :
public Person()
        {
                System.out.println("gaga! ");
        }
完成对象的创建过程。


评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
依次执行,静态代码块(给类初始化),主函数,构造代码块(给所有对象初始化),构造函数(给相应的对象初始化)
回复 使用道具 举报
运行顺序依次为:static{}---->main()---->Person()---->{}


以下是内存分配过程:
1、        因為new用到了Person.class文件,所以會先找多Person.class并加載到內存中。
2、        執行該類中的static代碼塊,給Person.class類進行初始化。
3、   執行 System.out.println("**********");語句
4、        在堆內存中開闢空間,分配內存地址。
5、        在堆內存中建立對象的特有屬性,并進行默認初始化。
6、        對屬性進行顯示初始化。
7、        對對象進行構造代碼塊初始化。
8、        對對象進行對應的構造函數初始化。
9、        對類進行代碼塊初始化
10、 將內存地址付給棧內存中的p變量。

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
在java中,我们可以用staic对类进行初始化。对类的初始化,仅在类的第一个实例有效,在创建类的第二个实例时不会生效。另外在继承时,如果发现父类也有static,要先调用父类的static初始化代码,然后再调用本身的static初始化代码。接着调用父类的构造函数,然后再调用本身的构造函数。

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马