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();//错误。因为不在同一包中。这和你所说的情况是一样的 } }
我说的不是这个意思,我给段源代码吧. class Student implements Cloneable { String name; int age; Student(String name,int age) { this.name=name; this.age=age; } } 在这个类中实现了Cloneable接口,所以这个类是可以克隆的,但是String不是基本数据类型,而是一个类,所以他的克隆应该和其他的类一样是个浅拷贝才对.但是为什么它和基本数据类型一样,可以实现完全拷?
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();//错误。因为不在同一包中。这和你所说的情况是一样的
}
}
class Student implements Cloneable
{
String name;
int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
}
在这个类中实现了Cloneable接口,所以这个类是可以克隆的,但是String不是基本数据类型,而是一个类,所以他的克隆应该和其他的类一样是个浅拷贝才对.但是为什么它和基本数据类型一样,可以实现完全拷?
{
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的值并没有受到影响, 不过这到底应该理解为深克隆还是浅克隆呢? 我也说不清楚了
{
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
他的定义是FINAL的
而且,他的一些操作符也全都重写过的JAVA的意思就是让你把STRING当作基础变量来用
他的表现和int,long这些基础类型是一样的