黑马程序员技术交流社区

标题: 静态代码块与构造代码块的问题 [打印本页]

作者: Sinoku    时间: 2014-1-23 17:32
标题: 静态代码块与构造代码块的问题
本帖最后由 Sinoku 于 2014-1-25 21:49 编辑

在看毕老师的静态代码块时忽然想到了一个问题:构造代码块是否可以实现静态代码块的所有功能?
如果这样的话,静态代码块存在的意义又是什么呢?


public class Person {
        //静态代码块
        static{
                System.out.println("hello static code!!");
        }
        //构造代码块
        {
                System.out.println("hello code!!");
                this.age=11;
        }
        
        public int age;
        
}




作者: 心安勿忘    时间: 2014-1-23 21:01
构造方法是以类的名字命名的省略返回值的一个方法,静态代码快就是一个 static关键字引导的{}包围的代码块。
作者: Sinoku    时间: 2014-1-23 21:02
心安勿忘 发表于 2014-1-23 21:01
构造方法是以类的名字命名的省略返回值的一个方法,静态代码快就是一个 static关键字引导的{}包围的代码块。 ...

恩恩,这我知道,我的意思是说既然<构造代码块>可以实现和静态代码块一样的功能,那为什么需要静态代码块呢
作者: 心安勿忘    时间: 2014-1-23 21:03
静态代码块 当且仅当第一次执行的时候才执行,一般用于初始化。
而构造方法 是每次new对象的时候都执行,也是初始化
二者的区别在于 一个是仅执行一次 另一个是每次new对象的时候执行
所以初始化代码 写在那个部分里就要根据具体情况而进行选择
作者: Sinoku    时间: 2014-1-23 21:05
心安勿忘 发表于 2014-1-23 21:03
静态代码块 当且仅当第一次执行的时候才执行,一般用于初始化。
而构造方法 是每次new对象的时候都执行,也 ...

恩恩。但是我说的是构造代码块,而不是构造方法:)
作者: 李程    时间: 2014-1-23 23:05
楼主,你看下这个是毕老师的板书
15,对象初始化过程
Person p = new Person("zhengsan", 20);

(1)首先,因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中
(2)执行该类中的static代码块,如果有的话,给Person.class类进行初始化
(3)在堆内存中开辟空间,分配内存地址
(4)在堆内存中建立对象的特有属性,并进行默认初始化
(5)对属性进行显示初始化
(6)对对象进行构造代码块初始化
(7)对对象进行对应的构造代码(构造函数)初始化
(8)讲内存地址付给栈内存中的p变量


通过这个对象的初始化过程你会发现,在初始化的过程中,静态代码块和构造代码块所处的位置是不同的,如果要执行的代码要在(3)(4)(5)之前,就用静态代码块,如果在(3)(4)(5)之后而在构造函数之前,则用构造代码块。

以上是我的理解,我也不是特别明白,毕竟没有例子。。。
这块儿涉及到内存的相关问题,不好理解啊,遗忘速度太快了

作者: 黄晓鑫    时间: 2014-1-24 21:11
静态代码块先进内存 然后在加载类 你学到类加载器器就知道这个问题




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2