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呢?求解,在线等。stringobjectnullclassexception

解决方案 »

  1.   

    首先为什么用clone,一般来说,= (赋值)对于值传递是相当于赋值的;而对于引用类型,“=”是将实例的地址传到新的变量中。
    //a和b是两个不同的对象,a,b互不影响。
    int a = 10;
    int b = a;
    //a和b是两个不同的变量,但它们指向同一个对象,意味着修改a,b也会改变。
    Port a = new Port();
    Port b = a;第二,在java中每当建立一个变量时,都要初始化(即为它分配地址空间),
    Short s;//表示建立了一个Short类的实例对象s,如果不进行初始化,接下来使用s时程序不知道去哪找s变量;如果你确实认为s还没有确定的值,就将s表示为一个null值,java中每个变量必须初始化。第三 每个实例对象不是指向类本身而是指向实例内容储存的地址。
    类和实例的关系就好像人类和姚明(姚明是人这个类的一个实例),而不进行初始化,那就是某个人。变量只是实例的一个名字。就好像“姚明”这个名字和他本人的关系。
    类 (class)         变量 (valrible)       实例(instance)
    Port          a    =  new Port();
    人类       明明    =  new 人类();
      

  2.   

    首先为什么用clone,一般来说,= (赋值)对于值传递是相当于赋值的;而对于引用类型,“=”是将实例的地址传到新的变量中。
    //a和b是两个不同的对象,a,b互不影响。
    int a = 10;
    int b = a;
    //a和b是两个不同的变量,但它们指向同一个对象,意味着修改a,b也会改变。
    Port a = new Port();
    Port b = a;这一段写的好,谢谢了,虽然还是没懂,我明天结贴给你分。
    也就是说我理解的全错了?
      

  3.   


    我在仔细说一下:
    这个要了解值传递和引用传递的区别,用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一样。