黑马程序员技术交流社区

标题: 关于构造函数调用构造函数,请教下。 [打印本页]

作者: 朱新根    时间: 2012-3-15 11:43
标题: 关于构造函数调用构造函数,请教下。
class A
{
    private int a;
    private int b;
    A(int c)
  {
      this.a=c;
    }
   
    A(int c,int d)
  {
      A(c);
   this.b=d;
   }
}

请问在A(int c,int d)中调用A(c)后,就已经构造了一个A对象,其中的a=c,b=0,则this.b=d还会执行吗?
作者: 赵孟恩    时间: 2012-3-15 12:01
你这语句就不对
class A
{
     private int a;
     private int b;
     A(int c)
   {
       this.a=c;
     }
     
    A(int c,int d)
   {
       A(c); //  这语法不对 应该是 this(c);  这是构造函数的调用  必须写在第一位置
    this.b=d;
    }
}

构造函数已经重载了
当你创建一个对象时已经调用构造方法  new A(c) ; 执行时直接根据参数调用第一个构造方法  第二个构造方法根本没执行
new A(c,d)  调用的是第二个构造方法  接着在构造方法内在执行this(c) 调用第一个构造方法, 就实现了构造方法中调用构造方法

作者: 朱新根    时间: 2012-3-15 12:29
赵孟恩 发表于 2012-3-15 12:01
你这语句就不对
class A
{

class A
{
    private int a;
    private int b;
    A(int c)
  {
      this.a=c;
    }
   
    A(int c,int d)
  {
      this(c);
   this.b=d;
   }
}

请问在A(int c,int d)中调用A(c)后,就已经构造了一个A对象,其中的a=c,b=0,则this.b=d还会执行吗?

嗯,写错了,我想请教的是在主函数中A(int c,int d)的话,再调用了this(c)后还会执行this.b=d吗?
作者: 许圣建    时间: 2012-3-15 12:49
楼主其实弄混了,对象创建是new,new才会开辟对象空间,而不是调用构造函数,构造函数也仅仅是函数,所以可以被调用。
在创建对象的时候,是根据参数列表(构造函数之间只有这点区别)来选择构造函数的,比如new A(3,4)选择了2参构造函数,
运行这个构造函数时调用this(3),并不是创建对象。连空间都没有分配,怎么会有对象呢。
至于为什么这里一定是this(a)而不能像一般函数一样使用名称调用,构造函数只有关键字new才能调用,你不能在非new的情况下调用它,
否则编译无法通过,错误提示是找不到符号。加上this就好像说把this(a)本来要创建的内容去掉壳,直接创建在new A(3,4)中了。
水平有限,深入的机制我也没有接触过。~~~
作者: 许圣建    时间: 2012-3-15 12:51
嗯,写错了,我想请教的是在主函数中A(int c,int d)的话,再调用了this(c)后还会执行this.b=d吗?

要执行的,你说的b=0就是初始化而已,后面有赋值怎么会不允许。
作者: 朱新根    时间: 2012-3-15 13:09
许圣建 发表于 2012-3-15 12:51
要执行的,你说的b=0就是初始化而已,后面有赋值怎么会不允许。

明白了,谢谢
作者: 可见    时间: 2012-3-15 13:12
Person p = new Person("zhangsan",20);

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




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