Java的内存分析

看看下面的程序:

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);
    }
}

 

看看上面的,看你能分析清楚吗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值