class StringTest
{
public static void main(String[] args)
{
Professor p=new Professor("wangwu",50);
Student s1=new Student("zhangsan",18,p);
Student s2=(Student)s1.clone();
s2.p.name="lisi";
s2.p.age=30;
System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
}
}class Professor implements Cloneable
{
String name;
int age;
Professor(String name,int age)
{
this.name=name;
this.age=age;
}
}
}
class Student implements Cloneable
{
String name;
int age;
Professor p;
Student(String name,int age,Professor p)
{
this.name=name;
this.age=age;
this.p=p;
}
public Object clone()
{
Object o=null;
try
{
o=(Student)super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
return o;
}
}
class Point
{
int x,y;
public String toString()
{
return "x="+x+","+"y="+y;
}
}以上是代码``我想问,为什么用clone()方法的时候,s2.age和s2.name的值为什么不发生变化?而s2.p.name和s2.p.age会发生变化呢?s2.age是int型所以copy的是值这个我知道,但是s2.name和s2.p.name,s2.p.age是引用类型,应该都会发生变化呀``不明白,网上给出的答案就是s2.name是string类型,相当于一个常量,所以不发生变化``但是我不太明白``请大家指点一下``
{
public static void main(String[] args)
{
Professor p=new Professor("wangwu",50);
Student s1=new Student("zhangsan",18,p);
Student s2=(Student)s1.clone();
s2.p.name="lisi";
s2.p.age=30;
System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
}
}class Professor implements Cloneable
{
String name;
int age;
Professor(String name,int age)
{
this.name=name;
this.age=age;
}
}
}
class Student implements Cloneable
{
String name;
int age;
Professor p;
Student(String name,int age,Professor p)
{
this.name=name;
this.age=age;
this.p=p;
}
public Object clone()
{
Object o=null;
try
{
o=(Student)super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
return o;
}
}
class Point
{
int x,y;
public String toString()
{
return "x="+x+","+"y="+y;
}
}以上是代码``我想问,为什么用clone()方法的时候,s2.age和s2.name的值为什么不发生变化?而s2.p.name和s2.p.age会发生变化呢?s2.age是int型所以copy的是值这个我知道,但是s2.name和s2.p.name,s2.p.age是引用类型,应该都会发生变化呀``不明白,网上给出的答案就是s2.name是string类型,相当于一个常量,所以不发生变化``但是我不太明白``请大家指点一下``
{
public static void main(String[] args)
{
Professor p=new Professor("wangwu",50);
Student s1=new Student("zhangsan",18,p);
Student s2=(Student)s1.clone();
s2.p.name="lisi";
s2.p.age=30;
System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
}
}
class Professor
{
String name;
int age;
Professor(String name,int age)
{
this.name=name;
this.age=age;
}
}
class Student implements Cloneable
{
String name;
int age;
Professor p;
Student(String name,int age,Professor p)
{
this.name=name;
this.age=age;
this.p=p;
}
public Object clone()
{
Object o=null;
try
{
o=super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
return o;
}
}
class Point
{
int x,y;
public String toString()
{
return "x="+x+","+"y="+y;
}
} 这才是完整代码上面代码有错`不好意思``
s1.name和s2.name是不同的对像.虽然它们的值相同.
s1里的name和s2里的name是不同的对像,它们的值(都是地址值,这个地址值指向的内存地址里是字符值)相等.不知道你能明白吗?我猜测当你构造的时候用
Student s1=new Student(new String("zhangsan"),18,p);再通过s1.name="AAA"后s2.name应该也是=="AAA";
Student s1=new Student(new String("zhangsan"),18,p);再通过s1.name="AAA"后s2.name应该也是=="AAA";
根本不成立
public Object clone()
{
Object o=null; o=new Student(this.name,this.age,new Professor(this.p.name,this.p.age) );
return o;
}呵呵...好像我想得有点多余了.