关于程序:
class Point
{
double x,y,z;
Point(double _x,double _y,double _z)
{
x= _x;
y=_y;
z=_z;
}
public void getX(double _x)
{
x = _x;
}
public void getY(double _y)
{
y = _y;
}
public void getZ(double _z)
{
z = _z;
}
public void setX(double _x)
{
x = _x;
}
public void setY(double _y)
{
y = _y;
}
public void setZ(double _y)
{
y = _y;
}
double getDistance(Point p)
{
return (x-p.x)*(x-p.x)+(y-p.y)*(y-p.y)+(z-p.z)*(z-p.z);
}
}
定义了一个Point类 ,具有三个double类型的元素,表示空间中某一个点;
并且定义一个方法,getDistance(Point p),需要输入一个Point对象;接下来在主程序中
class TestPoint
{
public static void main(String[] args)
{
System.out.println("Hello World!");
Point p = new Point(1.0,2.0,3.0);
Point p1 = new Point(0.0,0.0,0.0);
System.out.println(p.getDistance(p1));
p.setX(3.0);
System.out.println(p.getDistance(new Point(1.0,1.0,1.0)));
}
}
New 了名为p的Point对象;
New 了名为p1的Point对象;
要调用Point类的方法getDistance(Point p)就必须使用对象来调用!故使用p.getDistance(p1);
;运行这个方法时,因为这个方法有一个形参 p,首先在栈空间中定义一个p对象p,因为输入的对象是p1,所以p的栈地址就是p1的栈地址,p的堆内存变量就是p1的堆内存变量;
然后运行语句:(x-p.x)*(x-p.x)+(y-p.y)*(y-p.y)+(z-p.z)*(z-p.z);
x就是调用getDistance(Point p)的p对象的x!不是上面局部变量的p对象的x!,y,z也是如此.
所以就得出了 需要求出的距离的平方!!运行完这个方法后,这个方法中的局部变量就被内存回收了!所以有了这样的程序语句:p.getDistance(p1);
double getDistance(Point p)
{
return (x-p.x)*(x-p.x)+(y-p.y)*(y-p.y)+(z-p.z)*(z-p.z);
}
针对这句:
p.setX(3.0);
System.out.println(p.getDistance(new Point(1.0,1.0,1.0)));
首先把p对象调用setX(int _x)方法,方法中的局部变量是 _x,在栈空间中顶一个_x,并且赋值为代入其中的3.0;然后执行语句 :x = _x;p对象的堆空间中的x就赋值为了3.0;执行完这个方法后_x就被内存回收了;
接下来:System.out.println(p.getDistance(new Point(1.0,1.0,1.0)));
new Point(1.0,1.0,1.0);在堆空间中定义一个 对象,ta的堆内存变量为x,y,z均为1.0;代入到getDistance方法中时,需要做的是 要在栈中定义一个局部变量p,p对应的堆空间对象就是刚才的匿名的对象.局部变量的p.x就是 匿名对象的x,y就是 匿名对象的y,z就是 匿名对象的z;运行完这个方法,得到了目标的值,然后打印输出.方法运行完成后,局部变量就被回收来了,return的值也会被回收.
这就是以上的流程.
内存分析很重要.后面牵涉到 常量池和集合,单例等等都是需要这些知识来协助掌握.