黑马程序员技术交流社区

标题: 构造代码块、构造函数 [打印本页]

作者: 杨华威    时间: 2012-3-16 21:59
标题: 构造代码块、构造函数
构造函数和构造代码块分别是什么作用?他们有什么区别呢?执行顺序是啥?
作者: 马胜平    时间: 2012-3-16 22:06
构造代码块和构造函数都是个用来初始化用的,构造代码块有非静态的和静态,静态的构造代码块在
类初始化时候就开始初始化分配内存空间,非静态的构造代码块和构造函数是对实例变量进行初始化,并且非静态代码块总是在构造函数调用之前先执行。
作者: 叶绍亮    时间: 2012-3-16 22:07
构造函数的作用:可以用于给对象进行初始化。
构造函数的小细节:
当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。

当在类中自定义了构造函数后,默认的构造函数就没有了。
构造代码块。
        作用:给对象进行初始化。
        对象一建立就运行,而且优先于构造函数执行。
        和构造函数的区别:
        构造代码块是给所有对象进行统一初始化,
        而构造函数是给对应的对象初始化。

        构造代码快中定义的是不同对象共性的初始化内容。
作者: 秦超    时间: 2012-3-16 22:11
构造函数是给指定对象初始化用的,谁创建了这个类的对象,构造函数初始化的就是谁
构造代码快是给所有对象初始化用的,无论是谁创建了这个类的对象,他们都被构造代码快初始化了
执行顺序是: 先执行构造代码快,再执行构造函数
作者: 丁佼    时间: 2012-3-16 23:05
构造代码块:即类中一段由大括号包含,但没有包含在函数内,且没有任何名称标识的语句块。
(1)作用:给对象进行初始化。 每次建立对象就会运行,而且优先与构造函数运行。
(2)与构造函数区别:构造代码块给所有对象进行统一属性的初始化;而构造函数是按照new语句传递的参数,对对象特有的数据进行初始化。
(3)使用时机:定义不同对象间共性的初始化内容。
作者: 黑马肖凯骏    时间: 2012-3-17 00:33
总共有三种吧
构造代码块 构造函数 静态构造代码块  三者的初始化顺序是 静态构造代码块-----构造代码块-----构造函数
类初始化时候就开始初始化分配内存空间,静态构造代码块,一直存在于内存中
构造代码块和构造函数是对实例变量进行初始化
作者: 戴振良    时间: 2012-3-17 01:06
        不知道你有没有看黑马网站提供的视频,不过我觉得你的学习方法不对,或者是提问方法不对,我觉得你有疑问首先要自己敲代码试验,然后找出哪里不明白,当然别人指出的时候,因为是自己敲的代码所以也更容易明白。
     你的这个问题我曾经在黑马问过,这里给你Copy过来,希望对你有帮助。

实例一、class aaa
{
        public aaa()
        {
                System.out.println("构造方法");
        }
        static
        {
                 System.out.println("静态代码块");
        }        
}
class bbb
{
        public static void main(String args[])
        {
                new aaa();
        }        
}
//输出结果为:         静态代码块
                                构造方法


下面的代码执行结果是我不明白的
______________________________________________________________________________________________________________

实例二、class ccc
{
        static ccc obj=new ccc();
        static
        {
                 System.out.println("静态代码块");
        }        
        /*************************/
        private ccc()
        {
                System.out.println("构造函数");
        }
        
}
class ddd
{
        public static void main(String args[])
        {
                ccc obj2=ccc.obj;               
        }        
}
//输出结果为:               构造函数
                                       静态代码块

这里先执行了构造函数,这是怎么个原理呢?而当我把语句:“ static ccc obj=new ccc(); ”放到/*****************/的地方,结果就是先输入静态代码块,这又是为什么呢?

如果我把代码改成这样:
实例三、class ccc
{
        static ccc obj=new ccc();
        static
        {
                 System.out.println("静态代码块");
        }        
        /*************************/
        public ccc()   //有修改的地方
        {
                System.out.println("构造函数");
        }
        
}
class ddd
{
        public static void main(String args[])
        {
                new ccc();   //有修改的地方
        }        
}

//输出结果为:    构造函数
                           静态代码块
                           构造函数

2012年1月31日
经过大家的帮助回答,我思考分析后似乎已经明白了,这里补上来,希望对大家也有点收益,我也不知道事实是不是这样,也希望大家指点批评
实例二中的代码:
        static ccc obj=new ccc();    //语句1
        static                               //语句2
        {
                 System.out.println("静态代码块");
        }      
在这两个静态语句:
          1、语句1和语句2在类加载的时候都加载到了内存
           2、因为都是静态,所以按顺序执行
           3、静态代码只能执行一次,而又得按顺序,所以new ccc()的时候,就不会再重复执行语句1和语句2,所以只剩下构造函数可以执行了,接着把整个静态语句1执行完
           4、执行静态代码2

作者: a504079589    时间: 2012-3-17 02:06
构造函数的命名必须和类名完全相同, 构造函数的功能主要用于在类的对象创建时定义初始化的状态.它没有返回值,也不能用void来修饰;
构造代码块同样是用来初始化的, 但静态构造代码块是在类加载的时候就在内存分配空间, 而静态的代码块是给变量进行初始化的, 在构造函数之前执行;
作者: 张润政    时间: 2012-3-17 09:56
构造函数和构造代码块都是在给对象初始化用的。他们的区别是加载顺序不同,当一个类加载进内存,jvm会先从构造代码块执行,然后是构造函数,如果你的类中出现了静态代码块,jvm就会先去加载这个静态的代码块,因为它是给类初始化的。这个顺序应该很清楚了吧。
还有一点就是,我们通常会遇到子父类继承的问题。jvm会先加载父类,再加载子类。他们的执行顺序也是有一定规则的。

如果你写的类中出现了字符类继承关系,并且有代码块的组成,那么执行的顺序应该是 1父类静态代码块 2子类静态代码块 3父类构造代码块 ,4父类方法 5子类构造代码块 6子类方法。




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