黑马程序员技术交流社区

标题: 构造函数中的几种写法的不同 [打印本页]

作者: 会飞De石头    时间: 2014-6-22 21:24
标题: 构造函数中的几种写法的不同
本帖最后由 会飞De石头 于 2014-6-23 14:18 编辑

以下三种构造函数,

按构造1创建对象的话,无论传入参数是什么,调用speak()后均是默认值(对象为null,基本类型为0或0.0),按构造2切不会?

想问问是怎么回事?尤其是内存的分布

class Person{
   
    private String name;
    private int age;
   
    //构造函数1
    Person (String name, int age){
        name = name ;
        age = age;
    }
    //构造函数2
    Person (String n, int a){
        name = n;
        age = a;
    }
    //构造函数3
    Person (String name,int age){
        this.age = age;
this.name = name;
    }
   
    public void speak(){
        System.out.println("年龄是="+age);
    }


作者: 会飞De石头    时间: 2014-6-22 21:26
先自个丁丁。。。。
作者: q617939894    时间: 2014-6-23 04:01
没看懂你说啥!!小手一抖黑马币到手
作者: m313786372    时间: 2014-6-23 04:06
本帖最后由 m313786372 于 2014-6-23 04:12 编辑

楼主你这里会出问题的是构造函数1啊
原因是
  1. Person (String name, int age) {
  2.     name = name ;                //左侧的name本意是指Person类的成员变量。但是在这样的写法下(参数名跟成员变量名相同),代码会将这个name理解为传入的参数name来执行。修改为this.name = name;即可实现为Person的成员变量赋值的操作。
  3.     age = age;                 //原理与上一句相同
  4. }
复制代码


作者: 会飞De石头    时间: 2014-6-23 10:34
q617939894 发表于 2014-6-23 04:01
没看懂你说啥!!小手一抖黑马币到手

如果用构造1创建对象,无论传入什么值 都会是默认值(即对象为null ,基本数据为0或0.0)  
作者: pengyu    时间: 2014-6-23 11:31
无非就是有残构造跟无参构造啊
作者: yuZhe_toString    时间: 2014-6-23 12:46
:lol:lol:lol
作者: AuroraAria    时间: 2014-6-23 12:57
  1. Person(String name,int age)
  2.         {
  3.                 this.name = name;
  4.                 this.age = age;
  5.         }
复制代码

这样就没事了,你那种写法,构造内等号两边的name都会被理解为是参数列表中的name。
调用本类的name变量要加this。
作者: hmid    时间: 2014-6-23 12:59
板凳 说的没错啊。
作者: lindegen    时间: 2014-6-23 13:33
不知道你想表达什么
作者: 会飞De石头    时间: 2014-6-23 14:10
m313786372 发表于 2014-6-23 04:06
楼主你这里会出问题的是构造函数1啊
原因是

加 this 后我懂。。。现在不懂的是去掉this的情况下。。
Person(String name){name = name};
Person (String n){name = n};

这两种写法结果且不一样的原因
作者: 会飞De石头    时间: 2014-6-23 14:19
lindegen 发表于 2014-6-23 13:33
不知道你想表达什么

重新编辑了。这会看看
作者: m313786372    时间: 2014-6-23 19:02
会飞De石头 发表于 2014-6-23 14:10
加 this 后我懂。。。现在不懂的是去掉this的情况下。。
Person(String name){name = name};
Person (Str ...

……我讲的就是这个问题啊。
你Person(String name){name = name};这一句,是把一个String name字符串传进来,然后把这个String name字符串的值赋给这个String name字符串,跟你的Person类对象里的name没有关系。
作者: 会飞De石头    时间: 2014-6-24 08:36
m313786372 发表于 2014-6-23 19:02
……我讲的就是这个问题啊。
你Person(String name){name = name};这一句,是把一个String name字符串传 ...

可不可以这样理解:当有局部变量时,优先使用局部变量,而不参考成员变量???
作者: 黄宝宝    时间: 2014-6-24 08:43
我也没看懂!
作者: m313786372    时间: 2014-6-24 08:45
会飞De石头 发表于 2014-6-24 08:36
可不可以这样理解:当有局部变量时,优先使用局部变量,而不参考成员变量??? ...

我就是这么理解的╮(╯▽╰)╭
作者: 会飞De石头    时间: 2014-6-24 08:50
黄宝宝 发表于 2014-6-24 08:43
我也没看懂!

你可一按构造1的格式创建对象运行一下 ,就会发现吗,无论你传入什么参数,它都不会执行你先前传入的参数
作者: 会飞De石头    时间: 2014-6-24 08:56
m313786372 发表于 2014-6-24 08:45
我就是这么理解的╮(╯▽╰)╭

想知道内存变化{:3_52:}




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