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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Sinoku

中级黑马

  • 黑马币:26

  • 帖子:57

  • 精华:0

© Sinoku 中级黑马   /  2014-1-23 17:32  /  1227 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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;
        
}



评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

6 个回复

倒序浏览
构造方法是以类的名字命名的省略返回值的一个方法,静态代码快就是一个 static关键字引导的{}包围的代码块。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
心安勿忘 发表于 2014-1-23 21:01
构造方法是以类的名字命名的省略返回值的一个方法,静态代码快就是一个 static关键字引导的{}包围的代码块。 ...

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

恩恩。但是我说的是构造代码块,而不是构造方法:)
回复 使用道具 举报
楼主,你看下这个是毕老师的板书
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)之后而在构造函数之前,则用构造代码块。

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

评分

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

查看全部评分

回复 使用道具 举报
静态代码块先进内存 然后在加载类 你学到类加载器器就知道这个问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马