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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朱新根 初级黑马   /  2012-3-15 11:43  /  2228 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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还会执行吗?

6 个回复

倒序浏览
你这语句就不对
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) 调用第一个构造方法, 就实现了构造方法中调用构造方法

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
赵孟恩 发表于 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吗?
回复 使用道具 举报
楼主其实弄混了,对象创建是new,new才会开辟对象空间,而不是调用构造函数,构造函数也仅仅是函数,所以可以被调用。
在创建对象的时候,是根据参数列表(构造函数之间只有这点区别)来选择构造函数的,比如new A(3,4)选择了2参构造函数,
运行这个构造函数时调用this(3),并不是创建对象。连空间都没有分配,怎么会有对象呢。
至于为什么这里一定是this(a)而不能像一般函数一样使用名称调用,构造函数只有关键字new才能调用,你不能在非new的情况下调用它,
否则编译无法通过,错误提示是找不到符号。加上this就好像说把this(a)本来要创建的内容去掉壳,直接创建在new A(3,4)中了。
水平有限,深入的机制我也没有接触过。~~~

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
嗯,写错了,我想请教的是在主函数中A(int c,int d)的话,再调用了this(c)后还会执行this.b=d吗?

要执行的,你说的b=0就是初始化而已,后面有赋值怎么会不允许。
回复 使用道具 举报
许圣建 发表于 2012-3-15 12:51
要执行的,你说的b=0就是初始化而已,后面有赋值怎么会不允许。

明白了,谢谢
回复 使用道具 举报
可见 中级黑马 2012-3-15 13:12:48
7#
Person p = new Person("zhangsan",20);

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

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马