【Java笔记】引用类型的参数传值

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)。内存中对象的模型如下图所示:

【Java笔记】引用类型的参数传值_第1张图片


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

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

执行代码3:

circular.setBottomRadius(r);

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

【Java笔记】引用类型的参数传值_第2张图片

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笔记】引用类型的参数传值_第3张图片



运行结果:

【Java笔记】引用类型的参数传值_第4张图片







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








你可能感兴趣的:(笔记整理,Java)