关于空间两点之间距离的java程序之分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TopWilling/article/details/55126120

关于程序:

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 了名为pPoint对象;

New 了名为p1Point对象;

要调用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的值也会被回收.

 

这就是以上的流程.

内存分析很重要.后面牵涉到 常量池和集合,单例等等都是需要这些知识来协助掌握.

猜你喜欢

转载自blog.csdn.net/TopWilling/article/details/55126120