日期:2014-05-20  浏览次数:20722 次

clone机制的一些理解,求指教。
class Port
{
void print()
{
Short s1=new Short("guo",19);
Short s2=(Short)s1.clone();
s2.name="huo";
s2.age=18;
System.out.println("name= "+s1.name+"age= "+s1.age);
}
public static void main(String[] args)
{
Port p=new Port();
p.print();
}
}

class Short implements Cloneable
{
String name;
int age;
Short(String name,int age){
this.name=name;
this.age=age;
}
public Object clone(){
Short s=null;
try{
s=(Short)super.clone();
}
catch(Exception e){
e.printStackTrace();
}
return s;
}
}

上面是我自己写的一个代码。我的理解是Short s1=new Short("guo",19);
Short s2=(Short)s1.clone();
s2.name="huo";
s2.age=18;
System.out.println("name= "+s1.name+"age= "+s1.age);
这里,基本数据类型和String常量类型复制的是在栈内存空间没有被分配引用(首地址)的变量s1,
而引用类型复制的是已经在堆内存空间分配了引用(首地址的)的变量s1。
是这样的吗,我学了一天,都没学懂,晕了。
还有Short s=null;这句,s这个变量时不是一直指向OBJECT类。为什么要赋值为Null呢?求解,在线等。
string object null class exception

------解决方案--------------------

我在仔细说一下:
这个要了解值传递和引用传递的区别,用java举例
它的数据储存重要的有三个地方,常量池,栈,堆(都是储存空间)
栈里存放着你声明的变量和变量的地址(有点象C的指针)
常量池存放的各种类型的常量比如int 2、 7; float 2.1 等等。

基础数据类型
当你在一个函数方法内声明   
 int a = 3

   首先在栈里建立一个int变量a,然后编译器会去常量池里找3,假如存在3 ,把常量3的地址赋给a;假如不存在,就在常量池中创建一个常量3 ,并把3的地址赋给a,创建完毕。

    然后你又创建一个变量  
  int b = 3;

在栈里建立一个int变量a,然后编译器会去常量池里找3,发现存在3 ,把常量3的地址赋给a,创建完毕。
这样a和b指向的是同一个地址,但是它和对象的引用在于下面。

    然后你改变了b的值     
   b = 4;

这时编译器会去常量池里找4,假如存在4 ,把常量4的地址赋给b;假如不存在,就在常量池中创建一个常量4 ,并把4的地址赋给b,创建完毕。3的地址没变,a引用的地址没变,只是b的引用地址变成了常量4的地址

引用数据类型

当你在一个函数方法内声明   
 Port s1 = new Port();

   首先在栈里建一个Port变量,然后会在里建立一个Port对象,分配地址空间,最后把对象的地址赋给变量 s1。

 然后又建一个变量         
 Port s2= new Port();

   继续在栈里建一个Port变量,然后会在里建立一个Port对象(跟前一个没有任何关系),分配地址空间,最后把对象的地址赋给变量 s2。

   继续         
 Port s3= s2;
,在这里s2和s3指向的是同一个对象(s2创建的那个);

   如果是      
 Port s3= s2.clone();
,s3 是指向一个新创建的对象,s3对象的各个属性值(name,age)和s2一样。