一个java程序的分析

来源:互联网 发布:spark 推荐算法 编辑:程序博客网 时间:2024/05/20 05:07

关于程序:

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

    }

}定义了一个Birthday,这个类有三个成员变量day,month,year,写出带有三个参数的构造函数,这个构造函数用于生成目标参数的对象,并且构造三参数的getset方法,并且写一个display方法;

 

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

    }

}

接着定义一个test,并在主方法中new一个test对象,用于调用test类中定义的方法:有三个;

在主方法中new两个d1d2对象,分别带有不同的day,month,year;

在主方法中声明并赋值一个整型常量,date,数值为9;

接着test对象调用chang1方法,将值date作为实参代入该方法如下:

    public void change1(int i){

    i = 1234;

    }

分析该方法:

首先定义了一个整型变量后,即在栈内存中定义了一块空间,命名为date,数值为9;作为基本数据类型,date值只占了一块空间哟;

Change1方法中有一个局部变量i,所以运行整个方法时,在栈空间中创建一个i并给ta一份空间,因为代入i的值是date,所以刚开始i9;接下来运行语句:i = 1234;i被重新赋值为1234;该方法运行结束后,i就被内存回收了;注意:date的值并没有发生变化!

然后运行change2方法;

    public void change2(BirthDate b) {

    b = new BirthDate(22,2,2004);

    }

分析该方法:

Change2方法中有局部变量b,所以在栈内存中定义一个对象b,这是一个引用数据类型;因为代入的bd1对象,所以b对象指向的栈地址是d1的栈地址,指向的堆内存变量是d1的堆内存变量,接下来,运行方法change2,运行语句b = new BirthDate(22,2,2004);此刻在new了一个个新的b对象,并且为这个对象赋值;此刻,b的栈地址不在是d1的栈地址,b的堆内存变量也不在是d1的堆内存变量;接下来该方法运行结束了,方法运行结束后,其局部变量会被内存回收,所以b对象去哪呢,被内存回收了,d1对象发生了变化么?没有!!

接下来运行change3方法

    public void change3(BirthDate b) {

    b.setDay(22);

    }

change3方法中有一个局部变量,b,这个b对象是引用数据类型.刚开始在栈内存中,b的栈地址就是代入该方法的的d2的栈地址,对内存变量就是d2的堆内存变量,接下运行方法,b.setDay(22);此时,b对象的day值重新设为了22;此刻d2day值是否发生了变化呢?发生了变化,因为b对象和d2对象此刻的堆栈地址和变量都是一样的,b发生了改变,所以d2的变量也要发生变化;

接下来执行

 System.out.println("date=" + date);

date 的只没有发生变化,所以date已然为9;

d1.display();输出了d1的个变量值,此刻d1的变量值没有发生变化,所以也不会变化

d2.display();因为d2day值发生了变化,所以d2输出的变量值中day值发生了变化.

以上就是这个程序的分析;内存分析!

        d1.display();

        d2.display();

 

0 0
原创粉丝点击