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"了啊?
谢谢。
----------------解决方案--------------------------------------------------------
你这个程序是不是应该写成this(name,"");
才能有用
----------------解决方案--------------------------------------------------------
楼上正解
----------------解决方案--------------------------------------------------------
二楼的已经解释得很清楚了
----------------解决方案--------------------------------------------------------
你这个程序是不是应该写成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,"");
才能有用"是什么意思?
看不懂。
希望能解释的详细一点。
谢谢。
----------------解决方案--------------------------------------------------------
调用另一个构造器也只生成了一个对象,不是说这个构造器生成一个对象,然后调用另一个构造器再生成一个对象。
意思是:你想用本构造器来生成一个对象,好,我的最终结果就是给你一个对象,至于我怎么生成的,你不用管。我再调用另一个构造器,让他替我生成一个,这是我自己的事。我只要最终给你一个对象就行了。
----------------解决方案--------------------------------------------------------
你的意思是不是说类内调用
public Student(String name)
{
this("s", "");
}
并没有生成新的对象,而是用("s", "")给这个对象Student tom = new Student("Tom")重新赋值?
----------------解决方案--------------------------------------------------------
public Student(String name)
{
this("s", "");
}
你的这句根本没用到name 所以new Student("Tom")这句建的对象的那个"Tom"根本没有用
建的对象是new Student("s","")
所以tom.toString()输出的是"s"了
----------------解决方案--------------------------------------------------------
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");
的值吗?
是不是矛盾的呀?还是理解上有什么不对的地方?
实在是不大明白。真诚的盼望赐教。
谢谢。
----------------解决方案--------------------------------------------------------
你那句并没有改变 只是调用了另一个构造方法创建的对象
----------------解决方案--------------------------------------------------------