第1题:
写clone()方法时,通常都有一行代码,是什么?
在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。Clone 有缺省行为,super.clone();他负责产生正确大小的空间,并逐位复制。使用clone()来复制一个对象,clone()从Object类继承。所有具有clone功能的类都有一个特性,那就是它直接或间接地实现了Cloneable接口。
protected native Object clone() throws CloneNotSupportedException;
可以看出它是一个protected方法,所以我们不能简单地调用它;关键字native,表明这个方法使用java以外的语言实现。
对于object x,
x.clone() != x
x.clone().getClass() == x.getClass()
x.clone().equals(x)
以上返回的值都为true
要说明的有两点:一是拷贝对象返回的是一个新对象,而不是一个引用。二是拷贝对象与用new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。
1.浅复制与深复制概念
⑴浅复制(浅克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
⑵深复制(深克隆)
被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
public class TestClone1implements Cloneable{
int count;
TestClone1 next;
public TestClone1(int count) {
this.count=count;
if(count>0)
next=new TestClone1(count-1);
}
void add(){
count++;
if(next!=null)
next.count++;
}
public String toString(){
String s=String.valueOf(count)+" ";
if(next!=null)
s+=next.toString();
return s;
}
public Object clone(){
Object o=null;
try{
o=super.clone();//如果没有实现cloneable,将会抛出CloneNotSupported异常
}
catch(CloneNotSupportedException e){
System.err.println("cannot clone");
}
return o;
}
public static void main(String[] args){
TestClone1 t=new TestClone1(1);
System.out.println("t="+t);
TestClone1 t1=(TestClone1)t.clone();
System.out.println("t1="+t1);
t.add();
System.out.println("after added/nt t="+t+"/nt1="+t1)
}
}
在这个例子中创建t相当于两个相连的TestClone1实例,而在调用了t的add方法之后,意想不到的结果出现了:
t=1 0
t1=1 0
after added
t t=2 1
t1=1 1
t1也发生了改变。实际上Object.clone()进行的复制有着"bitwise"原则,也就是逐位复制。对于一个对象中定义的对象,它只是简单的复制这个对象的引用。这也就是常说的浅层拷贝(shallow copy)。想要执行深层拷贝(deep copy),只需要在TestClone1 t1=(TestClone1)t.clone();后面加上t1.next=(TestClone1)t.next.clone();就能得到:
t=1 0
t1=1 0
after added
t t=2 1
t1=1 0
这个正确的结果。
第2题:
相比较于Django内置的模板,Mako模板有哪些优点:()
第3题:
Python使用符号#表示单行注释。
第4题:
如果派生类一行代码也不写,它就不能继承基类的功能。()
第5题:
python中代码跨行时需要在行尾加上哪个符号()
第6题:
Python程序只能在安装了Python环境的计算机上以源代码形式运行。
第7题:
一句语句要在下一行继续写,用_符号作为续行符。
第8题:
下列关于ASP代码的叙述,错误的是()
第9题:
,
:
、
;
第10题:
对
错
第11题:
\
/
∣
-
第12题:
对
错
第13题:
文章的结尾写道:“仿佛是一场山雨的余韵”。“余韵”一词在本文中实写什么?虚写什么?(3分)
第14题:
Python3.x版本的代码完全兼容Python2.x。
第15题:
商务信函结尾如果用祝颂语“此致……敬礼”,其基本格式为()。
第16题:
一个完整的加工程序由哪几部分组成?其开始部分和结束部分常用什么符号及代码表示?
第17题:
python中递归函数的作用()
第18题:
python中,如想对代码进行注释,则使用()符号
第19题:
在一行内写多条语句时,每个语句之间用()符号分隔。
第20题:
第21题:
在ASP代码中,字母不分大小写
使用REM或’符号来标记注释语句
<%和%>符号必须和ASP语句放在一行
ASP语句必须分行,不能把多条ASP语句写在一行
第22题:
#
/
*
!
第23题:
对
错