在异常处理中,常用到一个函数就是toString(),返回一个String类型,描述异常的基本信息。事实上,对于每个类都可以重写toString()函数,比如说,我们定义了一个对象,Student s;
如果想以如下的格式System.out.println(s)打印出我们想要的信息,就必须重写toString()函数,因为系统会自动调用类的toString()函数,前面讲到,所有类都是Object的子类,所以toString()函数事实上是Object类中的一个函数。如果不重写toString()函数,会打印出如下格式的信息:对象名@散列码,散列码是根据内存位置来给出的。写了一段代码,重写了toString()函数。
class Student
{
String name;
int age;
Student(String str,int a)
{
this.name=str;
this.age=a;
}
public String toString()
{
return ("name "+this.name+" age "+this.age);
}
}
class ToStringTest
{
public static void main(String[] args)
{
Student s=new Student("laoyang",20);
System.out.println(s);
}
}
另讲到深浅克隆操作。在某些情况下,将一个对象的赋值给另一个对象时,如果后者发生了改变,则会反应到前者,因为事实上这种赋值是一种地址传递,两个对象指向同样的地址。因此,为了避免这种情况,引入了克隆操作。
深浅克隆的区别在于,深克隆可以完全克隆某个对象包括其中的引用类型如某些自定义的类等,而浅克隆则只能克隆对象中的基本类型。
一个深克隆的代码,这是我最近的代码中比较复杂的一个了,足足调试了两个小时之多,可见我水平之恶劣。代码有点长,关系比较复杂。不过最终在JDK1.5下编译成功。
class Student implements Cloneable
{
String name;
int age;
Student(String n,int a)
{
this.name=n;
this.age=a;
}
public Object clone()
{
Object o=null;
try
{
o=super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
return o;
}
}
class Professor implements Cloneable
{
String name;
int age;
Student s;
Professor(String n,int a,Student s)
{
this.name=n;
this.age=a;
this.s=s;
}
public Object clone()
{
Professor p=null;
try
{
p=(Professor)super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
p.s=(Student)s.clone();
return p;
}
}
class CloneTest
{
public static void main(String[] args)
{
Student s=new Student("yu",20);
Professor p1=new Professor("yang",20,s);
Professor p2=(Professor)p1.clone();
p2.s.name="hello";
p2.s.age=12;
System.out.println("name"+p1.s.name+"age"+p1.s.age);
}
}
如果想以如下的格式System.out.println(s)打印出我们想要的信息,就必须重写toString()函数,因为系统会自动调用类的toString()函数,前面讲到,所有类都是Object的子类,所以toString()函数事实上是Object类中的一个函数。如果不重写toString()函数,会打印出如下格式的信息:对象名@散列码,散列码是根据内存位置来给出的。写了一段代码,重写了toString()函数。
class Student
{
String name;
int age;
Student(String str,int a)
{
this.name=str;
this.age=a;
}
public String toString()
{
return ("name "+this.name+" age "+this.age);
}
}
class ToStringTest
{
public static void main(String[] args)
{
Student s=new Student("laoyang",20);
System.out.println(s);
}
}
另讲到深浅克隆操作。在某些情况下,将一个对象的赋值给另一个对象时,如果后者发生了改变,则会反应到前者,因为事实上这种赋值是一种地址传递,两个对象指向同样的地址。因此,为了避免这种情况,引入了克隆操作。
深浅克隆的区别在于,深克隆可以完全克隆某个对象包括其中的引用类型如某些自定义的类等,而浅克隆则只能克隆对象中的基本类型。
一个深克隆的代码,这是我最近的代码中比较复杂的一个了,足足调试了两个小时之多,可见我水平之恶劣。代码有点长,关系比较复杂。不过最终在JDK1.5下编译成功。
class Student implements Cloneable
{
String name;
int age;
Student(String n,int a)
{
this.name=n;
this.age=a;
}
public Object clone()
{
Object o=null;
try
{
o=super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
return o;
}
}
class Professor implements Cloneable
{
String name;
int age;
Student s;
Professor(String n,int a,Student s)
{
this.name=n;
this.age=a;
this.s=s;
}
public Object clone()
{
Professor p=null;
try
{
p=(Professor)super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(e.toString());
}
p.s=(Student)s.clone();
return p;
}
}
class CloneTest
{
public static void main(String[] args)
{
Student s=new Student("yu",20);
Professor p1=new Professor("yang",20,s);
Professor p2=(Professor)p1.clone();
p2.s.name="hello";
p2.s.age=12;
System.out.println("name"+p1.s.name+"age"+p1.s.age);
}
}