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:
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版)