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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lxww 中级黑马   /  2013-3-19 00:49  /  1893 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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 07:57
保持代码格式整齐,请尽量使用代码模版!谢谢  发表于 2013-3-19 01:07

评分

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

查看全部评分

7 个回复

倒序浏览
构造代码块和构造函数一样,是为对象进行初始.
区别:构造代码块要优先于构造函数执行,同时,构造代码块是给所有对象进行统一的初始化,而构造函数则是给对应的对象进行初始化
你new了两个对象,所以构造代码块一共了执行两次.

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
      构造代码块的作用是给对象进行初始化,对象一建立就运行,而且优先于构造函数执行;和构造函数的区别是构造代码块是给所有对象进行统一初始化,而构造函数时给对应的对象初始化。构造代码块中定义的是不同对象共性的初始化内容。
      演示代码:
  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 明白?
         

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报

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()构造函数,,,构造函数是给不同的对象进行分别初始化的,无论创建哪个对象都得首先执行构造代码块

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

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
小路飞 来自手机 中级黑马 2013-3-19 07:51:08
报纸
理解问题,构造代码块和静态代码块的区别和作用,其他的楼上说的都很透彻了!
回复 使用道具 举报
HM李超 发表于 2013-3-19 01:37
构造代码块的作用是给对象进行初始化,对象一建立就运行,而且优先于构造函数执行;和构造函数的区别 ...

讲的很清楚。还有举例。很好。完全理解了。谢谢。呵呵
回复 使用道具 举报
lxww 中级黑马 2013-3-19 19:14:41
7#
聂斌 发表于 2013-3-19 02:19
class Test4
{

讲的很细致、谢谢啦、、
回复 使用道具 举报
聂斌 中级黑马 2013-3-19 22:55:37
8#
kingdom_202 发表于 2013-3-19 19:14
讲的很细致、谢谢啦、、

呵呵以后都是同学了一起进步
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马