看看下面的程序:
public class Test{
public static void main(String[] args){
int a[][] = {{1,2,3},{1,2},{3,4,5,8,5}};
int b[][] = new int[3][];
System.arraycopy(a,0,b,0,a.length);
a[0][0] = 99;
for(int i=0;i<b.length;i++){
for(int j=0;j<a[i].length;j++){
System.out.print(a[i][j]+" ");
}
}
}
}
最后的输出的是: 99 2 3 1 2 3 4 5 8 5
为什么执行了System.arraycopy(a,0,b,0,a.length),将a拷贝给了b之后,a改变了,b为什么也跟着变呢?这事因为a和b其实是指向了同一块堆内存的,并且是一直有效持续,当a,b中任意有一个改变的话,另一个也随之改变.这就是Java的内存机制.
不只是在内存的创建时,在对象的创建,方法的调用中,分析清楚Java的内存机制,才能吧问题看的清晰.
class BirthDate {
private int day;
private int month;
private int year;
public BirthDate(int d, int m, int y) {
day = d;
month = m;
year = y;
}
public void setDay(int d) {
day = d;
}
public void setMonth(int m) {
month = m;
}
public void setYear(int y) {
year = y;
}
public int getDay() {
return day;
}
public int getMonth() {
return month;
}
public int getYear() {
return year;
}
public void display() {
System.out.println
(day + " - " + month + " - " + year);
}
}
public class Test{
public static void main(String args[]){
Test test = new Test();
int date = 9;
BirthDate d1= new BirthDate(7,7,1970);
BirthDate d2= new BirthDate(1,1,2000);
test.change1(date);
test.change2(d1);
test.change3(d2);
System.out.println("date=" + date);
d1.display();
d2.display();
}
public void change1(int i){
i = 1234;
}
public void change2(BirthDate b) {
b = new BirthDate(22,2,2004);
}
public void change3(BirthDate b) {
b.setDay(22);
}
}
看看上面的,看你能分析清楚吗