黑马程序员技术交流社区

标题: 关于对象和构造函数的问题 [打印本页]

作者: 黄基焜    时间: 2012-8-27 20:17
标题: 关于对象和构造函数的问题
class person
{
        private String name;
        private int age;
        private static String country = "CN";
        //构造代码块
        {
                System.out.println("cry.......");
        }

        person(String name,int age)//构造函数
        {
                name =name;
                age = age;
                System.out.println("name="+name+"  age="+age);
                cry();
        }
        public void setName(String name)
        {
                this.name = name;//this应用

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

        public void cry()
        {
                System.out.println("cry.......");
        }


}


class persondemo
{
        public static void main(String[] args)
        {
                person p = new person("may",20);
                p.setName("jack");
                p.getName();
        }
}


输出后p.getName();输出是的值是name=may   age=0
p.setName("jack");这句只改了对象name的值,并没有改age的值,为什么age的值从20变成0了?
作者: 杨鹏鹏    时间: 2012-8-27 20:32
本帖最后由 杨鹏鹏 于 2012-8-27 20:34 编辑

class person
{
        private String name;
        private int age;
        private static String country = "CN";
        //构造代码块
        {
                System.out.println("cry.......");
        }

        person(String name,int age,String gaga)//  随便加个参数。构造函数
        {
                 没有把传来的参数赋值给对象中的属性,this.name=name;
                   gaga=gaga;//没报错
                    this.gaga=gaga;// 报错:gaga cannot be resolved or is not a field

                name =name;
                age = age;
                System.out.println("name="+name+"  age="+age);
                cry();
        }
        public void setName(String name)
        {
                this.name = name;//this应用

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

        public void cry()
        {
                System.out.println("cry.......");
        }


}


public class persondemo
{
        public static void main(String[] args)
        {
                person p = new person("may",20,"凑数的");
                p.setName("jack");
                p.getName();
        }
}

作者: 夏天    时间: 2012-8-27 20:34
person(String name,int age)//构造函数
        {
                name =name;
                age = age;
                System.out.println("name="+name+"  age="+age);
                cry();
        }
这里面没有赋成功。应该是this.age=age;
this.name=name;
作者: 夏天    时间: 2012-8-27 20:34
person(String name,int age)//构造函数
        {
                name =name;
                age = age;
                System.out.println("name="+name+"  age="+age);
                cry();
        }
这里面没有赋成功。应该是this.age=age;
this.name=name;
作者: 黄基焜    时间: 2012-8-27 20:47
person(String name,int age)//构造函数
        {
                name =name;
                age = age;
                System.out.println("name="+name+"  age="+age);
                cry();
        }
是赋值成功的啊~我构造函数里面有句输出语句System.out.println("name="+name+"  age="+age); 这句输出的是name=jack  age=20的啊
作者: 黄基焜    时间: 2012-8-27 20:48
class person
{
        private String name;
        private int age;
        private static String country = "CN";
        //构造代码块
        {
                System.out.println("cry.......");
        }

        person(String name,int age)//构造函数
        {
                name =name;
                age = age;
                System.out.println("name="+name+"  age="+age);
                cry();
        }
        public void setName(String name)
        {
                this.name = name;//this应用

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

        public void cry()
        {
                System.out.println("cry.......");
        }


}


class persondemo
{
        public static void main(String[] args)
        {
                person p = new person("may",20);
                p.setName("jack");
                p.getName();
        }
}


输出是:
cry.......
name=may   age=20
cry.......
name=jack   age=0
作者: 任文杰    时间: 2012-8-27 20:50
person(String name,int age)//构造函数
        {
                name =name;
                age = age;
                System.out.println("name="+name+"  age="+age);
                cry();
        }

这个构造里面的赋值语句的问题,应改为下面这种形式:
person(String name,int age)//构造函数
        {
                this.name =name;
                this.age = age;
                System.out.println("name="+name+"  age="+age);
                cry();
        }

关键字this,代表当前对象,即对当前对象的属性赋值,如果构造函数形参的参数名与类的属性名相同,为了加以区分,要用关键字this进行区分。如果不用,首先会造成程序代码结构比较混乱,不易阅读。另外,容易产生一些低级bug。
作者: 黄基焜    时间: 2012-8-27 21:00
我知道加了就没问题~但是还是不明白为什么,不加this的话,name=name age=age分别代表什么,在哪个内存里面,是成员变量还是局部变量?
作者: 黄基焜    时间: 2012-8-27 21:05
不加this的话,我构造函数的初始化赋值赋到哪了
作者: 夏天    时间: 2012-8-27 21:08
不加 都代表 局部变量 在栈内存  
当 局部变量和 成员变量重名时  会优先使用 局部变量
this代表调用该方法的对象
作者: 唐见    时间: 2012-8-27 21:09
class person
{
        private String name;
        private int age;
        private static String country = "CN";
        //构造代码块
        {
                System.out.println("cry.......");
        }
        
   /*     person(String name,int age)//构造函数
        //你这里的name和age与Person类中属性成员name和age半毛钱关系都没有,这里的name和age只在构造函数局部有效,此时外面的name被屏蔽掉了,外部的name属性要用this.name表示
        {
                name =name;
                age = age;
                System.out.println("name="+name+"  age="+age);
                cry();
        }
  */
        //下面的代码等价于上面的构造方法,只是将参数名改了
        person(String name1,int age1)//构造函数
        {
                name1 =name1;
                age1 = age1;
                System.out.println("name1="+name1+"  age1="+age1);
                cry();
        }

        public void setName(String name)
        {
                this.name = name;//this应用//这里的this.name所指的就是Person类的属性了。

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

        public void cry()
        {
                System.out.println("cry.......");
        }


}
class persondemo
{
        public static void main(String[] args)
        {
                person p = new person("may",20);
               // p.getName();//加上的这句会输出name=null age=0
                p.setName("jack");
                p.getName();
        }
}
/*
为什么输出是下面这个样子呢?
输出是:
cry.......//这条是构造代码块输出的,构造代码块先与构造函数执行
name=may   age=20//这条是构造函数执行的结果,注意这个时候p对象的name和age属性值还是默认初始值,name=null,age=0
cry.......        //这也是构造函数执行的结果
name=jack   age=0//将p的name属性设置成了jack,所有最后打印的结果是这样的
*/

作者: 黄基焜    时间: 2012-8-27 21:09
额~看来我想通了~不加this的话System.out.println("name="+name+"  age="+age);的输出只是输出构造函数里面的局部变量。
并没有初始化赋值到对象里面

作者: 夏天    时间: 2012-8-27 21:12
输出的不叫 局部变量 是类里面的 属性 的默认值 0
作者: 夏天    时间: 2012-8-27 21:13
希望回答对您有帮助
作者: 唐见    时间: 2012-8-27 21:13
黄基焜 发表于 2012-8-27 21:09
额~看来我想通了~不加this的话System.out.println("name="+name+"  age="+age);的输出只是输出构造函数里面 ...

正确                  
作者: 吴通    时间: 2012-8-27 22:12
楼主,首先你的类名应该大写的Person
class Person
{
        private String name;
        private int age;
        private static String country = "CN";
        //构造代码块
        {
                System.out.println("cry.......");
        }

        Person(String name,int age)//构造函数
        {
                name =name;     //this.name=name;   把调用对象的name赋值给name
                age = age;         //this.age=age;          把调用对象的age赋值给age
                System.out.println("name="+name+"  age="+age);
                cry();
        }
        public void setName(String name)
        {
                this.name = name;//this应用

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

        public void cry()
        {
                System.out.println("cry.......");
        }


}


class Persondemo
{
        public static void main(String[] args)
        {
                Person p = new Person("may",20);   //执行这一句时,创建对象,Person初始化,name=“may”   age=20    打印may  20
                p.setName("jack");                            //执行这一句时,name被改为jack           
                p.getName();                                     //通过getName()方法获取name和age           结果name=“jack”     age=20
        }
}



作者: 梁志冰    时间: 2012-8-27 22:27
1、首先,this代表的是本类对象的引用。
2、 Person(String name,int age)//构造函数
        {
                name =name;    //this.name=name;  需要把构造函数初始化的值赋值给对象的name
                age = age;         //this.age=age;         
                System.out.println("name="+name+"  age="+age);
                cry();
        }
3、你定义在Person构造函数中的局部变量name和类Person中的成员变量name重名;这个时候就需要this.name来区分哪个是对象中的name,哪个是构造函数中的name;
     如果你不加this关键字,java虚拟机就会认为name就是构造函数的局部变量。
     




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