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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 会飞De石头 中级黑马   /  2014-6-22 21:24  /  1615 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 会飞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);
    }

17 个回复

倒序浏览
先自个丁丁。。。。
回复 使用道具 举报
没看懂你说啥!!小手一抖黑马币到手
回复 使用道具 举报
本帖最后由 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. }
复制代码

回复 使用道具 举报
q617939894 发表于 2014-6-23 04:01
没看懂你说啥!!小手一抖黑马币到手

如果用构造1创建对象,无论传入什么值 都会是默认值(即对象为null ,基本数据为0或0.0)  
回复 使用道具 举报
无非就是有残构造跟无参构造啊
回复 使用道具 举报
:lol:lol:lol
回复 使用道具 举报
  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:33
9#
板凳 说的没错啊。
回复 使用道具 举报
不知道你想表达什么
回复 使用道具 举报
m313786372 发表于 2014-6-23 04:06
楼主你这里会出问题的是构造函数1啊
原因是

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

这两种写法结果且不一样的原因
回复 使用道具 举报
lindegen 发表于 2014-6-23 13:33
不知道你想表达什么

重新编辑了。这会看看
回复 使用道具 举报
会飞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没有关系。
回复 使用道具 举报
m313786372 发表于 2014-6-23 19:02
……我讲的就是这个问题啊。
你Person(String name){name = name};这一句,是把一个String name字符串传 ...

可不可以这样理解:当有局部变量时,优先使用局部变量,而不参考成员变量???
回复 使用道具 举报
我也没看懂!
回复 使用道具 举报
会飞De石头 发表于 2014-6-24 08:36
可不可以这样理解:当有局部变量时,优先使用局部变量,而不参考成员变量??? ...

我就是这么理解的╮(╯▽╰)╭
回复 使用道具 举报

你可一按构造1的格式创建对象运行一下 ,就会发现吗,无论你传入什么参数,它都不会执行你先前传入的参数
回复 使用道具 举报
m313786372 发表于 2014-6-24 08:45
我就是这么理解的╮(╯▽╰)╭

想知道内存变化{:3_52:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马