Java整理笔记之引用类型的参数传值

来源:互联网 发布:mac多余账户删不了 编辑:程序博客网 时间:2024/05/21 15:49

Java的引用型数据有:

1.对象
2.数组

3.接口

当参数是引用类型时,“传值”传递的是变量中存放的“引用”,而不是变量所引用的实体。

例:

Circle.java

public class Circle {double radius;Circle(double r)   //构造函数{radius=r;}double getArea()    //计算面积{     return 3.14*radius*radius;}void setRadius(double r)   //给半径赋值{radius=r;}double getRadius()     //得到半径{return radius;}}

Circular.java

public class Circular {Circle bottom;        //底圆对象double height;Circular(Circle c,double h){bottom=c;height=h;}double getVolme()    //圆锥体积{return bottom.getArea()*height/3.0;}double getBottomRadius()      //获取底圆半径{return bottom.getRadius();}public void setBottomRadius(double r){bottom.setRadius(r);}}

Initial.java

public class Initial {public static void main(String[] args) {Circle circle=new Circle(10);Circular circular=new Circular(circle,20);System.out.println("main方法中circle的引用:"+circle);System.out.println("circular中的bottom的引用:"+circular.bottom);System.out.println("main中的circular的引用:"+circular);System.out.println();System.out.println("圆锥的底面半径:"+circle.radius);System.out.println("圆锥的底面半径:"+circle.getRadius());System.out.println("圆锥的底面半径:"+circular.getBottomRadius());System.out.println();System.out.println("圆锥的而体积:"+circular.getVolme());System.out.println();double r=8888;System.out.println("更改圆锥底面半径为:"+r);circular.setBottomRadius(r);System.out.println("更改后的底面半径:"+circular.getBottomRadius());System.out.println("更改后的底面半径为:"+circle.radius);System.out.println("更改后的底面半径:"+circle.getRadius());System.out.println("更改后的圆锥体积:"+circular.getVolme());System.out.println("更改后的circle引用:"+circle);System.out.println("更改后的bottom引用:"+circular.bottom);System.out.println("更改后的circular引用:"+circular);System.out.println();circle=new Circle(100);System.out.println("第三次circle的引用:"+circle);System.out.println("第三次bottom的引用:"+circular.bottom);System.out.println("第三次circular的引用:"+circular);System.out.println("底面半径:"+circle.radius);System.out.println("底面半径:"+circle.getRadius());System.out.println("底面半径:"+circular.getBottomRadius());}}



1.执行代码1后内存中的对象模型

执行代码1:

Circle circle=new Circle(10);

后,内存中产生了一个circle对象,内存中对象的模型如下图所示:

   circle


2.执行代码2后内存中的对象模型

执行代码2:

Circular circular=new Circular(circle,20);

后,内存中产生了一个circular的对象。执行代码2将circle对象的引用以“传值”方式传递给circular对象的bottom,因此,circular对象的bottom和circle对象就有同样的实体(radius)。内存中对象的模型如下图所示:



3.执行代码3后内存中的对象模型

对于两个同类型的引用型变量,如果具有同样的引用,就会用同样的实体,因此,如果改变参数变量所引用的实体,就会导致原变量的实体产生同样的变化。

执行代码3:

circular.setBottomRadius(r);

使得circular的bottom和circle的实体(radius)发生了同样的变化,如下图所示:


4.执行代码4后内存中的对象模型

执行代码4:

circle=new Circle(100);

使得circle的引用发生变化,重新创建了circle对象,即circle对象将获得新的实体(circle对象的radius的值是100),但circle先前的实体不被释放,因为这些实体还是circular的bottom的实体。最终circle对象的引用是以“传值”方式传递给circular对象的bottom的,所以,circle的引用发生变化并不影响circular的bottom的引用(bottom对象的radius的值仍是8888).对象模型如下图所示:



运行结果:








(整理自Java面向对象程序设计第2版)