黑马程序员技术交流社区

标题: 构造函数变量传递问题 [打印本页]

作者: 朱东方    时间: 2012-7-3 01:45
标题: 构造函数变量传递问题
本帖最后由 朱东方 于 2012-7-4 22:47 编辑

class Person
{
        private String name;
        private int age;
        /*
        person(String name)//输出为name=null
        {
                name = name;
        }
        */

        person(String n)//输出为name=lisi
        {
                name = n;
        }
        person(String n, int a)
        {
                name = n;
                age = a;
        }

        public void speak()
        {
                System.out.println("name="+name"....age="+age);
        }

}

class personDemo
{
        public static void main(String[] args)
        {
                Person p = new Person("lisi");
                p.speak();
        }
}

谁能帮我详细的解释下lisi的传递问题。有点懵呢。
作者: 贾飞雨    时间: 2012-7-3 02:00
哥们啊  ,我说你构造方法的的首字母怎么不大写呢?
,大哥麻烦你问问题有点诚意行不,编译都不编译就直接扔上来
还有这的   System.out.println("name="+name"....age="+age);还少了个加号,

作者: 朱东方    时间: 2012-7-3 02:18
yufeiant 发表于 2012-7-3 02:00
哥们啊  ,我说你构造方法的的首字母怎么不大写呢?
,大哥麻烦你问问题有点诚意行不,编译都不编译就直接 ...

我问的问题和编译通过与否有什么关系,这只是随便弄的,不过我记下了。呵呵

看重点。。。
作者: 黑马-李勇    时间: 2012-7-3 02:31
个人观点:
1.person(String name)
理解为person(String lisi)中name=name是本类中的name(name初始为null)所以可以解释为name=null,并没有用到传进来的那个lisi即this.name
2.person(String n)
person(String lisi)中n=lisi,是本类中的name(name初始为null)所以可以解释为name=lisi,speak中调用本类中的name输出就是lisi了
作者: 金龙    时间: 2012-7-3 02:38
Person p = new Person("lisi");  这句的意思是创建变量名为P的Person对象,而创建对象需要Person类中的构造方法。由于你的括号里传了个“lisi”,所以是去Person类中去找参数为String类型的构造函数,于是,“lisi”给了n,n又赋值给了name,就是这么个流程啊。
作者: 孙飞    时间: 2012-7-3 07:21
class Person
{
        private String name;
        private int age;
        /*
        person(String name)//输出为name=null
        {
                name = name;//因为这里你的参数name和要赋的name一样,所以它会默认的把name赋给本方法中的name也就
        }     //是自身的name,所以名字相同时应该在前面的name前加上this.来表示把参数赋给对象
        */
        Person(String n)//输出为name=lisi
        {
                name = n;//把n的值lisi赋给name
        }
        Person(String n, int a)
        {
                name = n;
                age = a;
        }
        public void speak()
        {
                System.out.println("name="+name+"....age="+age);
        }
}
class PersonDemo
{
        public static void main(String[] args)
        {
                Person p = new Person("lisi");//这里new一个Person类的对象,Person中两个构造函数重载,程序会根据
          //参数自动选择,因为你new的时候初始化了name所以选择了Person(string n)
                p.speak();
        }
}

作者: 邵阳    时间: 2012-7-3 09:04
class Person
{
        private String name;
        private int age;
        /*
       Person(String name)//输出为name=null
        {
                name = name;
        }
        */

        Person(String n)//输出为name=lisi
        {
                name = n;
        }
       Person(String n, int a)
        {
                name = n;
                age = a;
        }

        public void speak()
        {
                System.out.println("name="+name+"....age="+age);
        }

}

class personDemo
{
        public static void main(String[] args)
        {
                Person p = new Person("lisi");
                p.speak();
        }
}

楼主代码错误有很多:我用红颜色标出,并且帮你改正。
1:构造函数应该与类名一致,你的person那个p小写啦。
2:你忘写了一个+号。
然后根据改过之后的我给解答。
1:如果用
Person(String name)//输出为name=null
        {
                name = name;
        }
成员变量也是name,构造函数里面的变量也是name。此时name = name;两个name就代表构造函数里面的变量,与成员变量无关,这里面的两个name都是代表传入的数,比如传入9,就相当于9=9。没有给对象中的name赋值,成员变量的默认值String是null。如果要能够使传递给成员变量name。name前加this.就表示成员变量name。
Person(String name)//输出为name=null
        {
                this.name = name;
        }
2:Person(String n)//输出为name=lisi
        {
                name = n;
        }
这个很容易看,name代表成员变量,而n代表传入的数,因为他们名称不同,name就不需要加this.。给n传lisi就传给了成员变量name。打印出的自然是lisi。

作者: 朱东方    时间: 2012-7-4 22:38
邵阳 发表于 2012-7-3 09:04
class Person
{
        private String name;

嗯,自学呢,很多方面都没注意到,所以错误很多。写的很详细。谢谢啦




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