关于clone和equals的一个问题?
来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/17 22:12:23
关于clone和equals的一个问题?
————————————————————————————————————————————————————————————————————————————————————————————————
书上所教也即我所理解的clone方法是这样的:
已知:对象x
对象y=x.clone();
将对象x复制到新的地址空间,并且将新的对象引用传回给y.--------知识点来自清华大学出版社《java程序设计》
_________________________________________________________________________________________________
我的推论:既然新的地址空间,是不是可以理解为这个y和x引用的对象不是同一个了
——————————————————————————————————————————————————————————————————————————————————————————————————
1 java的api中定义:
Object 类的 equals 对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true.
2 在java.lang.Object的clone中有这么一句:
x.clone().equals(x)将为 true
由1和2可以推出x和y引用同一个对象 这和我的推论矛盾了
反推,那是否就可以推出“同一个对象这个概念和地址无关”,也就是张三照镜子,不管是在镜子里和外,他还是他.额.
其中是不是哪里推错了,刚接触java,也许我问的挺幼稚,希望各位不惜赐教.
————————————————————————————————————————————————————————————————————————————————————————————————
书上所教也即我所理解的clone方法是这样的:
已知:对象x
对象y=x.clone();
将对象x复制到新的地址空间,并且将新的对象引用传回给y.--------知识点来自清华大学出版社《java程序设计》
_________________________________________________________________________________________________
我的推论:既然新的地址空间,是不是可以理解为这个y和x引用的对象不是同一个了
——————————————————————————————————————————————————————————————————————————————————————————————————
1 java的api中定义:
Object 类的 equals 对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true.
2 在java.lang.Object的clone中有这么一句:
x.clone().equals(x)将为 true
由1和2可以推出x和y引用同一个对象 这和我的推论矛盾了
反推,那是否就可以推出“同一个对象这个概念和地址无关”,也就是张三照镜子,不管是在镜子里和外,他还是他.额.
其中是不是哪里推错了,刚接触java,也许我问的挺幼稚,希望各位不惜赐教.
楼主问题很好.
首先这两种说法都是对的.
具体地说:
clone确实是为了产生一个相同的副本,这样在内存中就有两个不同的内存区域放了两个内容相同的对象,然后分别用x,y指向它们.
楼主关于Obeject的equals函数的说法也是对的,在JAVA里面Object的equals 函数确实就是用==来比较的,楼主说 x.clone().equals(x)将为 true,API里同时也说了this is not an absolute requirement,也就是说不是强制必须这样.事实上,我们用的对象(比如我们自己定义了Person类)都是继承自Object,需要比较时,需要自己重写equals函数,这样的话,就跟引用无关了,可以理解为:Object的equals函数这样定义是因为Object本身没有具体意义,不知道怎么比较,具体的程序员写的类的equals函数需要自己定义,往往是比较类的成员变量(比如比较年龄、姓名等成员变量),与引用没什么关系了.
楼主可以查一下String的equals函数,这样就明白了.
首先这两种说法都是对的.
具体地说:
clone确实是为了产生一个相同的副本,这样在内存中就有两个不同的内存区域放了两个内容相同的对象,然后分别用x,y指向它们.
楼主关于Obeject的equals函数的说法也是对的,在JAVA里面Object的equals 函数确实就是用==来比较的,楼主说 x.clone().equals(x)将为 true,API里同时也说了this is not an absolute requirement,也就是说不是强制必须这样.事实上,我们用的对象(比如我们自己定义了Person类)都是继承自Object,需要比较时,需要自己重写equals函数,这样的话,就跟引用无关了,可以理解为:Object的equals函数这样定义是因为Object本身没有具体意义,不知道怎么比较,具体的程序员写的类的equals函数需要自己定义,往往是比较类的成员变量(比如比较年龄、姓名等成员变量),与引用没什么关系了.
楼主可以查一下String的equals函数,这样就明白了.