一、克隆对象
(一)在基本数据类型中,直接将对象 A 的值赋给对象 B,当更改对象 B 的时候,对象 A 的值保持不变。例如:
java
public static void main(String[] args)
{
int a=5;
int b=a; //将a的值赋给b
b=6; //更改b的值
System.out.println(b); //b的值为6
System.out.println(a); //a的值仍然为5
}
(二)但是在对象引用的情况中,直接将对象 A 的值赋给对象 B,当更改对象 B 的时候,对象 A 的值也会随之改变。例如:
java
public class Student
{
String name;
public Student(String name)
{
this.name = name; //构造方法
}
public String getName()
{
return name; //get方法
}
public void setName(String name)
{
this.name = name; //set方法
}
public static void main(String[] args)
{
Student st1=new Student("Tom");
Student st2=st1;
st2.setName("Jerry");
System.out.println(st2.getName()); //st2的name变为jerry
System.out.println(st1.getName()); //st1的name随之变为jerry
}
}
在本案例中,由于 Student 类不是基本类型,当把 st1 赋给 st2 的时候,st1 和 st2 实际指向同一个对象 Tom,此时不论更改 st1 还是 st2 中的任何一个,另一个都会随之更改。
(三)如果在对象引用的过程中,要实现更改 B 的时候,A 的值不随之改变,就要通过克隆。
方法:
① 该对象的类要实现 cloneable 接口;
② 在该对象的类中对父类 Object 的 clone() 方法进行重写。
java
public class Student implements Cloneable
{
String name;
public Student(String name)
{
this.name = name; //构造方法
}
public String getName()
{
return name; //get方法
}
public void setName(String name)
{
this.name = name; //set方法
}
public Student clone() throws CloneNotSupportedException
{
Student stu=(Student)super.clone(); //重写父类的clone()方法
return stu;
}
public static void main(String[] args)
{
Student st1=new Student("Tom");
Student st2=st1.clone();
st2.setName("Jerry");
System.out.println(st2.getName()); //st2的name变为jerry
System.out.println(st1.getName()); //st1的name仍为tom
}
}
在本案例中,使用 st2=st1.clone(),实质上等于 st1 和 st2 指向两个 Tom,此时不论更改其中任何一个,都不会影响另一个的值。
二、枚举
枚举实际上就是提前实例化好的对象,外部可以直接调用。并且枚举不支持在外部进行实例化创建,也就是说只有枚举的那几个常量。
java
public enum Week
{
Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday;
public void run()
{
switch (this)
{
case Monday:
case Tuesday:
case Wednesday:
case Thursday:
case Friday:
System.out.println("go to work");break;
case Saturday:
case Sunday:
System.out.println("have a break");break;
}
}
}
public class TT
{
public static void main(String[] args)
{
Week.Monday.run();
Week.Sunday.run();
}
}