Java取消了指针的概念,但是这只是Java没有明确地提供指针的概念和语法。实质上每个new语句都返回一个指针的引用。
一、对象和引用的区别:
1.1 Java在处理基本数据类型(int、char、double等)时,都是采用按值传递;除此之外的其他类型都是按引用的方式执行。
如:
class Obj{
private String str = "default string";
public String toString() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
public class TestRef {
public Obj obj = new Obj();
public Obj getObj() {
return obj;
}
int aInt = 0;
public int getInt() {
return aInt;
}
public void changeObj(Obj inObj) {
inObj.setStr("change string");
}
public void changeInt(int inInt) {
inInt=1;
// this.aInt=inInt=1; //如果这样就将值改变了
}
public static void main(String[] args) {
TestRef oRef = new TestRef();
System.out.println(oRef.getObj()); //Obj类重载了toString()方法,打印的时候默认调用对象的此方法,所以就输出字符串了
oRef.changeObj(oRef.getObj()); //传递的为引用
System.out.println(oRef.getObj());
System.out.println(oRef.getInt());
oRef.changeInt(oRef.getInt()); //change的变量为inInt
System.out.println(oRef.getInt()); //get的变量为aInt
}
}
1.2 对象除了在函数调用时是引用传递,在使用“=”赋值时也采用引用传递
如:Obj a=new Obj();
Obj b=a; // 传递的引用。
1.3 使用clone()函数返回Object对象的复制,返回的是新对象而不是对象的引用;拷贝对象与原用new操作符返回对象的区别在于这个拷贝已经包含了原对象的一些信息。
使用步骤如下:
1、实现clone的类需要继承Cloneable接口。Cloneable接口实质上是一个标识接口,没有任何接口方法。不继承Cloneable接口会报:CloneNotSupportedException,异常。
2、重写Object的clone()方法,clone()方法调用super.clone()方法,无论clone的结构是什么,super.clone()都会直接或间接调用Object类的clone()方法。
3、把浅复制的引用指向原型对象新的克隆体。
Obj类:
class Obj{
private int anInt=0;
public int getAnInt(){
return anInt;
}
public void setInt(int anInt){
this.anInt=anInt;
}
public void changeInt(){
this.anInt=1;
}
public Object clone(){//重写Object类的clone方法
Object o=null;
try{
o=(Obj)super.clone();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}
}
Test类:
public class TestRef{
public Obj obj = new Obj();
public static void main(String[] args) {
Obj a=new Obj();
Obj b=(Obj)a.clone();
b.changeInt();
System.out.println(a.getAnInt());
System.out.println(b.getAnInt());
}
}