关于String对象的clone方法

domimasi 2007-07-23 09:17:10
String对象也是对象啊,为什么不能象其它对象那样可能呢?
...全文
572 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
beiouwolf 2007-07-26
  • 打赏
  • 举报
回复
STRING类是一个特殊的类
他的定义是FINAL的
而且,他的一些操作符也全都重写过的

JAVA的意思就是让你把STRING当作基础变量来用
他的表现和int,long这些基础类型是一样的
IhaveGotYou 2007-07-25
  • 打赏
  • 举报
回复
class Student implements Cloneable
{
String name;
int age;
public Object clone(){
Student o = null;
try{
o = (Student)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}


//这是浅clone;



class Student implements Cloneable
{
String name;
int age;
public Object clone(){
Student o = null;
try{
o = (Student)super.clone();

}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}


//这是浅clone;


public Object clone(){
Student o = null;
try{
o = (Student)super.clone();
//因为String 类是final的,故没有覆盖clone方法;
//不能这样写:o.name= (String)name.clone();
o.name=name.subString(0,name.length());
//或o.name=new String(name);
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}

//这样就是深clone


yijie1206688 2007-07-25
  • 打赏
  • 举报
回复
你用String str = new String();试试看
domimasi 2007-07-25
  • 打赏
  • 举报
回复
为什么会创建一个新的name呢?既然是个类,那他应该克隆的只是他的应用啊,应该指向同一个内存才对啊.
yyw84 2007-07-25
  • 打赏
  • 举报
回复
class Student implements Cloneable
{
String name;
int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}


=======================
实际上我想这里实现的一样是浅克隆, 不过由于 String 是一个特殊的类, 它是不可见的, 问题就在这里, 假设原来的Student的实例为s1, 再克隆出一个s2出来, 当我们修改s1.name的值时,实际上是创建一个新的name,再赋值给s1.name, 所以s2.name的值并没有受到影响, 不过这到底应该理解为深克隆还是浅克隆呢? 我也说不清楚了
domimasi 2007-07-25
  • 打赏
  • 举报
回复 1
我说的不是这个意思,我给段源代码吧.
class Student implements Cloneable
{
String name;
int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}

在这个类中实现了Cloneable接口,所以这个类是可以克隆的,但是String不是基本数据类型,而是一个类,所以他的克隆应该和其他的类一样是个浅拷贝才对.但是为什么它和基本数据类型一样,可以实现完全拷?
andybogard 2007-07-24
  • 打赏
  • 举报
回复
protected比package权限多一点的地方就在于可以被子类引用。但它同package一样不能被非该包中的其他类引用。
String所在的 包为java.lang.String,而你自己写的类却不在这个包中,所以你不能访问到clone方法。
举个例子:
package com.sina.www;
public class A{
protected void function(){}
}

package com.sina.www;
public class B extends A{}
}

package com.sina.www;
public class AppOne{
public static void main(String[] args){
B b = new B();
b.function();//这是正确的。
}
}

package net.nytimes.www;
public class AppTwo{
public static void main(String[] args){
B b = new B();
b.function();//错误。因为不在同一包中。这和你所说的情况是一样的
}
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧