黑马程序员技术交流社区

标题: 关于this关键字在构造函数间的调用 [打印本页]

作者: amen0205    时间: 2013-3-3 18:39
标题: 关于this关键字在构造函数间的调用
本帖最后由 门文通 于 2013-3-4 11:00 编辑

class Person
{
        private String name;
        private int age;
        Person(String name)
        {
                this.name=name;
        }
        Person(String name,int age)
        {
                this(name);
                this.age=age;
        }
}

总感觉 this(name);  这种格式不能能理解,谁能帮我解释下? 谢谢
作者: 陈圳    时间: 2013-3-3 18:47
this(name);
很容易理解.如果有两个重载函数,一个是一个参数,另一个是两个,直接调用另一个己实现的功能,然后实现重载两个参数的功能.
这一句相当于:
Person(String name)
        {
                this.name=name;
        }
this(name);把第二个构造函数的第一个参数,当作第一个构造函数的形参使用.可能俩个名称都是一样,这个this不是代表调用的对象吗?就如同函数调用一样的.
作者: 肖明凯    时间: 2013-3-3 18:50
java中this有两种用法:
1、代表当前类
public class Dog{
     private String name;
     private float age;
     public setName(String name){
           this.name = name;
     }
    .......
}
这里的this就代表的当前的这个Dog类。this.name可以理解为dog.name,只是理解,不是等于。
之所以要用this.name = name;这种语法,这是java所提倡的写法,如果你的方法参数与类属性的名称不同,this大可不必要,但是java提倡构造方法参数与类属性名称相同的作法。
2、在构造函数中的使用
public class Dog{
     private String name;
     private int age;
     //有一个参数的构造函数
     public Dog(String name){
          this.name = name;
     }
     public Dog(String name,int age){
           this.name = name;
           this.age = age;
     }
     //这个无参构造方法里调用的有两个参数的构造方法,这个也就是this的第二种用法了!
     public Dog(){
           this("nihao",20);
     }
}

this(参数); 就相当于一个函数。
作者: amen0205    时间: 2013-3-3 18:53
陈圳 发表于 2013-3-3 18:47
this(name);
很容易理解.如果有两个重载函数,一个是一个参数,另一个是两个,直接调用另一个己实现的功能,然 ...

你说的重载函数我了解 , 那是在一个函数中直接调用一个函数。但这里this不是指代函数,而是对象。
作者: 陈圳    时间: 2013-3-3 18:56
门文通 发表于 2013-3-3 18:53
你说的重载函数我了解 , 那是在一个函数中直接调用一个函数。但这里this不是指代函数,而是对象。 ...

我上面回复的难道说this不是指对象么...
作者: amen0205    时间: 2013-3-3 18:58
陈圳 发表于 2013-3-3 18:56
我上面回复的难道说this不是指对象么...

我的意思是函数可以这样用,对象也可以吗?  这种形式不是很怪?  可以类比吗
作者: 徐升2013    时间: 2013-3-3 19:13
本帖最后由 起航 于 2013-3-3 19:27 编辑

其实很简单,这是两个构造方法,并且重载了,参数列表不同。
你问的this(name)其实就是在调用上面的构造方法而已,将name传给person类的一个参数的构造方法而已。
这里的this = 当前对象了,谁调用就是谁了。

举例你在下面主方法中新建了一个对象,person p
你用p.person("zhangsan",20)这时 p就将参数传了第二个构造方法,而第二个构造方法中,又调用了第一个构造方法this(name):这里将张三传给NAME,而p就是引用了new person在内存中的地址值,即可以理解为person的对象,既然建立person的对象了自然就要初始化,所以要用到构造方法,而你只传入了一个NAME所以符合第一个构造方法的参数格式,所以就调用了第一个构造方法初始化。这样说明白了么?
也就是毕老师所说的谁调用俺就是谁  哦了。
作者: 陈圳    时间: 2013-3-3 19:19
不怪的...对于新知识我们都只能接受,了解并掌握的.咋能觉得怪呢.这个函数调用的方式和意思你知道,其实这个方式和正常的对象调用方法我感觉是一样的,只不过加了一个通用的使用者代替关键字this.我演示一下:
Person p=new Person()
p这个对象可以用this代替这个你懂的
  public Dog(){
           this("nihao",20);
     }
这里的执行语句this("nihao",20);P使用时不就把this替换成了p对象么.你最不能理解的这句this(name),写明白了就是p(name)这个构造函数也就是在调用第一个构造函数的方法呀.
作者: 施家雄    时间: 2013-3-3 19:27
Person类中有两个构造函数,并实现了重载。前面一个构造函数已经this.name=name了,这个属性和下一个重载函数的name属性是一样的。this代表对当前类的引用。this.name就代表了当前类Person的属性name。而由于前面的构造函数已经声名过了。后面的重载函数就只要调用就可以了。
作者: 克零岚    时间: 2013-3-3 20:41
小弟知道,希望能帮到楼主,嘻嘻!
this()的一个用法就是在构造函数中调用参数个数等于this的参数个数相同的构造函数 ,this 调用的这个类本身的构造方法,不是超类的构造方法,这个和this的另外一个用法要区分开 ,只有在构造函数中才有这种用法 ,而且不能和super()一起用哟
亲爱滴,求分哟!
作者: amen0205    时间: 2013-3-3 21:13
克零岚 发表于 2013-3-3 20:41
小弟知道,希望能帮到楼主,嘻嘻!
this()的一个用法就是在构造函数中调用参数个数等于this的参数个数相同 ...

真的  分不是我定的 是版主   我知道this在构造函数间调用这种方式记住就行了   OK了
作者: 杨博    时间: 2013-3-3 21:23
其实七楼已经说的比较明白了
class Person
{
        private String name;
        private int age;
        Person(String name)
        {
                this.name=name;
        }
        Person(String name,int age)
        {
                this(name);
                this.age=age;
        }
}
很明显这里的两个构造函数重载了,那么,当你Person p=new Person()产生一个对象时,比如p.person("lisi",18)这时 p就将参数传了第二个构造方法,,那么,在第二个构造方法中,this(name)又调用了第一个构造函数,这时,就会再将lisi传给第一个的name,调用第一个构造函数,完成整个对象的初始化。
希望这么说对你有帮助
作者: 克零岚    时间: 2013-3-3 22:33
门文通 发表于 2013-3-3 21:13
真的  分不是我定的 是版主   我知道this在构造函数间调用这种方式记住就行了   OK了 ...

呵呵  我知道




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