| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1742 人关注过本帖
标题:类内调用另一个构造器的问题
只看楼主 加入收藏
chengsencs
Rank: 1
等 级:新手上路
帖 子:109
专家分:0
注 册:2006-7-24
收藏
 问题点数:0 回复次数:14 
类内调用另一个构造器的问题

public class StudentOverloading
{

public static void main(String[] args)
{
Student tom = new Student("Tom");
tom.setStudentSex("man");
tom.setStudentAddress("America");
System.out.println(tom.toString());
}
}

class Student
{
private String strName = "";//学生姓名
private String strNumber = "";//学号
private String strSex = "";//性别
private String strBirthday = "";//出生年月
private String strSpeciality = "";//专业
private String strAddress = "";//地址

public Student()
{}

public Student(String name)
{
this("s", "");
}

public Student(String name, String number)
{
strName = name;
strNumber = number;
}

public String getStudentName()
{
return strName;
}

public String getStudentNumber()
{
return strNumber;
}

public void setStudentSex(String sex)
{
strSex = sex;
}

public String getStudentSex()
{
return strSex;
}

public String getStudentBirthday()
{
return strBirthday;
}

public void setStudentBirthday(String birthday)
{
strBirthday = birthday;
}

public String getStudentSpeciality()
{
return strSpeciality;
}

public void setStudentSpeciality(String speciality)
{
strSpeciality = speciality;
}

public String getStudentAddress()
{
return strAddress;
}

public void setStudentAddress(String address)
{
strAddress = address;
}

public String toString()
{
String information = "学生姓名=" + strName + ", 学号=" + strNumber;
if( !strSex.equals("") )
information += ", 性别=" + strSex;
if( !strBirthday.equals(""))
information += ", 出生年月=" + strBirthday;
if( !strSpeciality.equals("") )
information += ", 专业=" + strSpeciality;
if( !strAddress.equals("") )
information += ", 籍贯=" + strAddress;
return information;
}
}
请问一下:类内用this调用另一个构造器,是不是要生成与被调用构造器方法参数相对应的一个新的对象?
如果是为什么用句柄tom.调用toString()输出的是名字是"s"呢?
明明初始化是命名为"Tom"了啊?
谢谢。

搜索更多相关主题的帖子: 构造器 
2006-08-23 23:26
无理取闹
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:53
帖 子:4264
专家分:0
注 册:2006-7-26
收藏
得分:0 
你这个程序是不是应该写成this(name,"");
才能有用

win32汇编
病毒 加密
目前兴趣所在
2006-08-24 09:06
sunnyxue
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2004-12-13
收藏
得分:0 
楼上正解

2006-08-24 09:31
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
二楼的已经解释得很清楚了

可惜不是你,陪我到最后
2006-08-24 09:44
chengsencs
Rank: 1
等 级:新手上路
帖 子:109
专家分:0
注 册:2006-7-24
收藏
得分:0 
以下是引用韩峰在2006-8-24 9:06:27的发言:
你这个程序是不是应该写成this(name,"");
才能有用


看不懂。如果name改成"s",最后输出的名字就是"s",如果仍用name,最后输出的就是Tom.
这是为什么呀?
书上说“构造器总是同newyi一起使用,每使用一次,就会生成一个新的对象,给相应的实例字段赋值。”
这里既然调用了
public Student(String name)
{
this("s", "");
}
就又生成一个新的对象,对不对?
可是句柄tom是和初始化为Tom的对象关联的呀,为什么
System.out.println(tom.toString());
会输出"s"呢?
因为构造器不能给已经赋值的对象字段改变值,所以我想调用不应该是把初始化为Tom的对象的字段值给更改了吧?

还有不知道韩大哥说的"写成this(name,"");
才能有用"是什么意思?
看不懂。
希望能解释的详细一点。
谢谢。
2006-08-24 10:15
sunnyxue
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2004-12-13
收藏
得分:0 
调用另一个构造器也只生成了一个对象,不是说这个构造器生成一个对象,然后调用另一个构造器再生成一个对象。
意思是:你想用本构造器来生成一个对象,好,我的最终结果就是给你一个对象,至于我怎么生成的,你不用管。我再调用另一个构造器,让他替我生成一个,这是我自己的事。我只要最终给你一个对象就行了。

2006-08-24 10:23
chengsencs
Rank: 1
等 级:新手上路
帖 子:109
专家分:0
注 册:2006-7-24
收藏
得分:0 
你的意思是不是说类内调用
public Student(String name)
{
this("s", "");
}
并没有生成新的对象,而是用("s", "")给这个对象Student tom = new Student("Tom")重新赋值?
2006-08-24 19:25
无理取闹
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:53
帖 子:4264
专家分:0
注 册:2006-7-26
收藏
得分:0 
public Student(String name)
{
this("s", "");
}
你的这句根本没用到name 所以new Student("Tom")这句建的对象的那个"Tom"根本没有用
建的对象是new Student("s","")
所以tom.toString()输出的是"s"了

win32汇编
病毒 加密
目前兴趣所在
2006-08-24 19:32
chengsencs
Rank: 1
等 级:新手上路
帖 子:109
专家分:0
注 册:2006-7-24
收藏
得分:0 
以下是引用韩峰在2006-8-24 19:32:35的发言:
public Student(String name)
{
this("s", "");
}
你的这句根本没用到name 所以new Student("Tom")这句建的对象的那个"Tom"根本没有用
建的对象是new Student("s","")
所以tom.toString()输出的是"s"了

书上说构造器不能给已经存在的对象重新设置实例字段的值。例如:
Student tom= new Student("Tom","22");
tom.Student("TOM","33");//这是错误的

如果按你的说法,一楼的程序不是用public Student(String name)
{
this("s", "");
}

改变了Student tom= new Student("Tom");
的值吗?
是不是矛盾的呀?还是理解上有什么不对的地方?
实在是不大明白。真诚的盼望赐教。
谢谢。

2006-08-25 01:10
无理取闹
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:53
帖 子:4264
专家分:0
注 册:2006-7-26
收藏
得分:0 
你那句并没有改变 只是调用了另一个构造方法创建的对象

win32汇编
病毒 加密
目前兴趣所在
2006-08-25 08:48
快速回复:类内调用另一个构造器的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026892 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved