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

© 史卜坤 中级黑马   /  2012-7-8 13:49  /  1841 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么this();只能用在构造函数第一行?那this所在构造函数要对已构造函数多次引用呢?形如:
class Person
{
private int age;
private String name;
private String occupation;
Person(String name)
{
this.name=name;
System.out.println(name);
}
Person(String name,int age)
{
this.name=name;
this.age=age;
System.out.println(name+"..."+age);
}
Person(int age,String name,String occupation)
{
this(name);//把两个this();的位置调换两个都报错,问为什么会这样?
this(age);//这儿就报错了,为什么把这句注释掉,把this(name);改为this(name,age);就ok了?
this.occupation=occupation;
System.out.println(name+"..." +age+"..."+occupation);

}

7 个回复

倒序浏览
这个是java语言的强制定义,避免一些潜在问题,比如执行前必需执行一些初始化动作, 这样就避免子类绕开这些初始化动作。
回复 使用道具 举报
本帖最后由 邵阳 于 2012-7-8 15:02 编辑

哥们你的错啦!
class Person
{
private int age;
private String name;
private String occupation;
Person(String name)
{
this.name=name;
System.out.println(name);
}
Person(String name,int age)
{
this.name=name;
this.age=age;
System.out.println(name+"..."+age);
}
Person(int age,String name,String occupation)
{
this(name);//把两个this();的位置调换两个都报错,问为什么会这样?
this(name,age);//这儿就报错了,为什么把这句注释掉,把this(name);改为this(name,age);就ok了?
this.occupation=occupation;
System.out.println(name+"..." +age+"..."+occupation);
}
}
按你的要求改的还是编译失败。请看
D:\java\zuoye\ceshi4>javac  d.java
d.java:299: 错误: 对this的调用必须是构造器中的第一个语句
this(name,age);//这儿就报错了,为什么把这句注释掉,把this(name);改为this(name,ag
e);就ok了?
    ^
1 个错误
不知道楼主怎么会编译成功(把this(name);改为this(name,age);就ok了?
jvm虚拟机说的对,对this的调用必须是构造器中的第一个语句,this(name,age)不是在第一句,所以编译失败。



回复 使用道具 举报
this()是初始化的动作,初始化定义了name=“haha” 你传了一个name="lisi"进去,如果初始化后做,那你取值时不就取了一个"haha",那不晕死了?------你去饭馆点了一个鱼香肉丝,服务员给你上了一盘麻辣鸡丝,你不郁闷死{:soso_e144:}

Person(String name)
{
this.name=name;
System.out.println(name);
}
Person(String name,int age)
{
this(name);
this.age=age;
System.out.println(name+"..."+age);
}
Person(String name,int age,String occupation)
{
this(name,age);
this.occupation=occupation;

我感觉应该是这样的,不对板砖拍我{:soso_e113:}
回复 使用道具 举报
class Person
{
private int age;
private String name;
private String occupation;
Person(String name)
{
this.name=name;
System.out.println(name);
}
Person(String name,int age)
{
this.name=name;
this.age=age;
System.out.println(name+"..."+age);
}
Person(int age,String name,String occupation)
{
//this(name);   //把两个this();的位置调换两个都报错,问为什么会这样?  
//为什么报错,很简单因为这个是正确的引用,下面的根本就是错误语句,如果这个语句变成第二行,这个语句也就报错了!!因为构造函数间的引用必须放在第一行!
//this(age); //这儿就报错了,为什么把这句注释掉,把this(name);改为this(name,age);就ok了?        
//首先告诉你一个坏消息,这个语句是错误的!因为你看看你有person(int age) 这个构造函数吗?
this(name,age);   //如果你想要达成你最开始的目的,这样修改就可以了!!!!
this.occupation=occupation;
System.out.println(name+"..." +age+"..."+occupation);

}

                                         总结:我只是给你做了简单的修改,你的语句还有很大的可能优化的,我现在只是解决你的问题,
                                               至于优化需要你自己去学习然后自己修改,因为只有自己学回了,才是自己的!!!
                                                                                愿楼主离黑马更近一步!!!!~~

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
大家都说的很详细了,楼主只要记得,对this的调用必须是构造器中的第一个语句,super也一样。
注意,super();要写在第一行,是为了防止子类调用父类的东西还没初始化。
this()和super()只能择其一,因为都要放在第一行,这是Java的规定,是语法严谨,而且子类中至少有一个构造函数会去访问父类构造方法。
回复 使用道具 举报
1。 this放在第一行是因为
   初始化要先执行,因为在构造函数间访问的时候,如果其他构造函数已经对特有数据
   有初始化动作了,那么自己就不用再做了,假如还想按照自己的方式初始化。那么可以
   继续初始化,下面是个反例, 看注释的部分
Person(String name)
{
    this.name = "haha";
}
Person(String name, int age)
{
    this.name = name;  //自己的初始化动作 name = "lisi"
    this(name);   //后进行 name ="haha",
}

Classs PersonDemo
{
     public static void main(String[] args)
    {
        Person  p  =  new Person("lisi",20);
    }
}

2. 两个this语句调换会报两个错误是因为
    this(age)找不到对应的构造器,
   而this(name) 正确,但被放在了第二行,所以也报错。
3. 改为this(name,age);正确是因为他会访问对应的构造函数,
   在一个函数中只能 只能引用一个构造方法且必须位于开始!
   

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
this只能放在构造函数的第一行是因为初始化要先执行。this可以用于多个构造函数 但是要注意顺序和各个构造函数中的参数个数。
class Person
{
private int age;
private String name;
private String occupation;
Person(String name)
{
this.name=name;
System.out.println(name);
}
Person(String name,int age)
{
this.name=name;
this.age=age;
System.out.println(name+"..."+age);
}
Person(int age,String name,String occupation)
{
this(name);//这个语句是可以正确执行的,但是this(age)是个不可执行的,调换之后this(name)的this也是错误的
this(age);//这儿就报错了,是因为没有Person(int age)的构造函数 所以会报错 。改成Person(String name,int age)ok 是因为有这个构造函数,所以可以执行如果想让这个语句不报错,那么就在前面写个Person(int age)的构造函数就行了
this.occupation=occupation;
System.out.println(name+"..." +age+"..."+occupation);

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