黑马程序员技术交流社区

标题: 关于构造代码块的疑问。 [打印本页]

作者: lxww    时间: 2013-3-19 00:49
标题: 关于构造代码块的疑问。
本帖最后由 kingdom_202 于 2013-3-19 19:12 编辑

class Test4
{
        
        public static void main(String[] args)
        {
                Test4 d1=new Test4(10);
                Test4 d2=new Test4();

        }
        Test4(){
                System.out.println("构造函数");
        }
        Test4(int i){
                System.out.println("有参构造函数");
        }
        {
                System.out.println("构造代码块");
        }
}

以上代码的运行结果怎么是:

构造代码块
有参构造方法
构造代码块
构造方法

为什么不是:

构造代码块
有参构造方法
构造方法

而是要多出一个呢?新手求解、前两天把概念弄懂一些。现在自己动手写。问题一堆。各种不知道。
作者: 李尧    时间: 2013-3-19 01:27
构造代码块和构造函数一样,是为对象进行初始.
区别:构造代码块要优先于构造函数执行,同时,构造代码块是给所有对象进行统一的初始化,而构造函数则是给对应的对象进行初始化
你new了两个对象,所以构造代码块一共了执行两次.
作者: HM李超    时间: 2013-3-19 01:37
      构造代码块的作用是给对象进行初始化,对象一建立就运行,而且优先于构造函数执行;和构造函数的区别是构造代码块是给所有对象进行统一初始化,而构造函数时给对应的对象初始化。构造代码块中定义的是不同对象共性的初始化内容。
      演示代码:
  1. class Person
  2. {
  3.      private int age;
  4.      private String name;
  5.      //定义构造代码块
  6.     {
  7.       System.out.println("构造代码块run...");
  8.      }
  9. Person()
  10. {
  11.       System.out.println("空构造函数...");
  12. }
  13. Person(int n,String a)
  14. {
  15.       this.age = n;
  16.       this.name = a;
  17.       System.out.println("name = "+name+", age = "+age);
  18. }
  19. }
  20. class TestPerson
  21. {
  22.      public static void main(String[] args)
  23.      {
  24.           new Person();
  25.           new Person(15,"lili");
  26.      }
  27. }
复制代码
结果是:
          构造代码块run...
          空构造函数...
          构造代码块run...
          name = lili,age = 15
说明:构造代码块在每次建立一个对象时都运行了一次,执行内容相同;构造代码块和构造函数都同属于对象,
        构造代码块的作用是给对象进行初始化,对象一建立就运行,而且优先于构造函数执行;和构造函数的区别是构造代码块是给所有对象进行统一初始化,而构造函数时给对应的对象初始化。构造代码块中定义的是不同对象共性的初始化内容。
        关于你预想的那种结果,请明确构造代码是属于对象的,每个对象都有,创建一次执行一次,不是属于类的,只有static才属于类,要注意区分!Do you 明白?
         


作者: 聂斌    时间: 2013-3-19 02:19

class Test4
{

        public static void main(String[] args)
        {
                Test4 d1=new Test4(10);
                Test4 d2=new Test4();

        }

        Test4(){
                System.out.println("构造函数");
        }

        Test4(int i){
                System.out.println("有参构造函数");
        }


        /**
        构造代码块也是一种初始化方式,
        作用:给对象进行初始化。
        对象一建立就运行,而且优先于构造函数执行。

        和构造函数的区别:
        构造代码块是给所有对象进行统一初始化,无论创建哪个对象时都得首先执行构造代码块,然后再执行对应的构造函数
        而构造函数是给对应的对象初始化。
        构造代码快中定义的是不同对象共性的初始化内容。比如每个构造函数里都有cry()方法,,,可以单独提取出来放到构造代码块里

        */
        {
                System.out.println("构造代码块");
        }
}


d1,d2都能运行.当建立这个new Test4(10);对象的时候时先执行构造代码块,再执行Test4(int i)有参构造函数,之后建立new Test4()对象的时候,这个对象就到Test4()构造函数来初始化,步骤也是先执行构造代码块再执行Test4()构造函数,,,构造函数是给不同的对象进行分别初始化的,无论创建哪个对象都得首先执行构造代码块

结论:先执行构造代码块再执行构造函数,无论调用哪个构造函数都得先执行构造代码块


作者: 小路飞    时间: 2013-3-19 07:51
理解问题,构造代码块和静态代码块的区别和作用,其他的楼上说的都很透彻了!
作者: lxww    时间: 2013-3-19 19:11
HM李超 发表于 2013-3-19 01:37
构造代码块的作用是给对象进行初始化,对象一建立就运行,而且优先于构造函数执行;和构造函数的区别 ...

讲的很清楚。还有举例。很好。完全理解了。谢谢。呵呵
作者: lxww    时间: 2013-3-19 19:14
聂斌 发表于 2013-3-19 02:19
class Test4
{

讲的很细致、谢谢啦、、
作者: 聂斌    时间: 2013-3-19 22:55
kingdom_202 发表于 2013-3-19 19:14
讲的很细致、谢谢啦、、

呵呵以后都是同学了一起进步




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