此实验是为了练习和巩固java中类和对象的使用等知识点。通过这个例子,我们可以更加熟练的掌握如何创建对象,如何创建类,如何创建类的构造方法。如何重载构造方法来实现对象初始化的不同种方式,以及在类的包含关系设计上进行更深入的练习。
实验要求如下:
实现一个Point类,该类包含表示坐标的两个int型变量x、y,构造方法Point()和Point(int xx, int yy),返回x值和y值的int getX()和int getY()方法,设置x值和y值的void setX(int xx)和void setY(int yy)方法,计算两点间距离的double distance(Point p)方法。
首先第一步我们要在Point类中创建 Point类的构造方法,构造方法是专门为类的对象初始化进行设置的,通过类的构造函数,可以进行对新建的本类对象进行初值的自定义,下面举一个例子
Point的成员变量有
int x;
int y;
point类的构造函数:
Point()
{
x=0;
y=0;
}
这就是一个point类的构造方法,这个函数可以为空,不过为了以后的程序的稳定性,我们把它赋予一个初值,我这里用0赋值,
我们可以利用这个构造方法进行简单的初始化如
Point p0=new Point();
这时候p0 这个对象的x和y初值就变成了0和0.
让我们如何将类的对象在初始化时就赋值成我们自己想要的值呢,而不是在初始化之后再次进行手动的初始化。
这时候就要用上我们的重载构造方法了,没错,重载构造方法的方法名字还是和类名一样,可是形式参数的数量和类型发生变化,形成重载。
Point(int xx,int yy)
{
x=xx;
y=yy;
}
这时候我们就可以通过重载的构造方法对新建的对象进行初始化赋值,
Point p1=new Point(1,1);
Point p2=new Point(0,0);
其他的类的方法都和c语言几乎相同,具体实现不再赘述。
计算两点间距离的double distance(Point p)方法值得注意,仔细观察可以发现,函数的参数只有一个值,这个值是一个Point类的对象,如何通过这一个参数,实现两个点,也就是两个point类对象之间距离的计算呢?
通过了解面向对象设计语言的特点我们可以发现,distance方法是通过一个对象来调用的,如
p0.distance(p1)
通过使用对象p0调用distance方法,参数传递的是另一个点,总体也就是两个参数,只不过是以方法调用者的方式出现的。
如何区分上面这段代码的p0和p1呢?
p0是当前方法的调用者,所以p0的成员变量在表示的时候前面要加上this
point类的实现:
public class Point
{
int x;
int y;
Point()
{
x=0;
y=0;
}
Point(int xx,int yy)
{
x=xx;
y=yy;
}
int getX()
{
return x;
}
int getY()
{
return y;
}
void setX(int xx)
{
x=xx;
}
void setY(int yy)
{
y=yy;
}
double distance(Point p)
{
return Math.sqrt((p.x-this.x)*(p.x-this.x)+(p.y-this.y)*(p.y-this.y));
}
//-----------------测试Point的功能---------------
/*public static void main(String[] args)
{
Point p1=new Point(1,1);
Point p2=new Point(0,0);
System.out.println(p1.distance(p2));
}*/
}
下面创建Circle类
该类包含表示圆心的Point型变量center,表示半径的int radius变量,以及构造方法Circle()、Circle(int xx,int yy,int r)、Circle(Point c,int r),返回周长和面积的int perimeter()、double area()方法,返回两个圆是否为同一个圆(返回0)、同心圆(返回1)、相交的圆(返回2)、分离的圆(返回3)、包含的圆(返回4)等关系的int relation(Circle c)等方法。PI值可以用Math.PI常量。
如上所述,Circle类的构造和Point类异曲同工,只不过Circle类只中包含了一些Point类的成员变量,在初始化Circle的对象时,蕴含着初始化Point类的步骤,容易出错,需要我们注意一下。
Circle()
{
center=new Point();
radius=0;
}
Circle(int xx,int yy,int r)
{
center=new Point(xx,yy);
radius=r;
}
Circle(Point c,int r)
{
center=c;
radius=r;
}
接下来我们要实现int relation(Circle c)去判断两个圆的位置关系,relation方法中主要要注意在计算距离时需要使用到Point类中的distance()方法,在参数的传递中要小心谨慎
首先我们创建几个Point 和Circle 类的对象
public static Point p0=new Point(1,0);
public static Point p1=new Point(3,0);
public static Point p2=new Point(4,0);
public static Point p3=new Point(4,4);
public static Point p4=new Point(4,4);
public static Point p5=new Point(3,0);
public static Circle c0=new Circle(p0,1);
public static Circle c1=new Circle(p1,2);
public static Circle c2=new Circle(p2,1);
public static Circle c3=new Circle(p3,2);
public static Circle c4=new Circle(p4,2);
public static Circle c5=new Circle(p5,1);
relation()方法是判断圆的位置关系的,所以传送的参数一定是Circle类的对象。
c0.relation(c1)
在relation中调用distance方法求距离的时候要注意传递的是Point类型的参数
double d=this.center.distance(c.center);
在这个基础上判断圆的关系就变得很简单了
相离的圆:d>R+r
相等的圆:center相同。半径radius相同
同心圆:center相同
相交的圆:R-r<d<R+r
包含的圆:d<R-r
两个圆的半径相减的结果我们使用绝对值来表示。
Math.abs()
下面是源代码
Point类
public class Point
{
int x;
int y;
Point()
{
x=0;
y=0;
}
Point(int xx,int yy)
{
x=xx;
y=yy;
}
int getX()
{
return x;
}
int getY()
{
return y;
}
void setX(int xx)
{
x=xx;
}
void setY(int yy)
{
y=yy;
}
double distance(Point p)
{
return Math.sqrt((p.x-this.x)*(p.x-this.x)+(p.y-this.y)*(p.y-this.y));
}
//-----------------测试Point的功能---------------
/*public static void main(String[] args)
{
Point p1=new Point(1,1);
Point p2=new Point(0,0);
System.out.println(p1.distance(p2));
}*/
}
Circle类
public class Circle
{
Point center;
int radius;
Circle()
{
center=new Point();
radius=0;
}
Circle(int xx,int yy,int r)
{
center=new Point(xx,yy);
radius=r;
}
Circle(Point c,int r)
{
center=c;
radius=r;
}
double perimeter()
{
return this.radius*2*Math.PI;
}
double area()
{
return this.radius*this.radius*Math.PI;
}
int relation(Circle c)
{
double d=this.center.distance(c.center);
//是否是同一个圆
if(this.radius==c.radius&&this.center.x==c.center.x&&this.center.y==c.center.y)
{
System.out.print("同一个圆");
return 0;
}
//是否是同心圆
else if(this.center==c.center)
{
System.out.print("同心圆");
return 1;
}
else if(d>Math.abs(this.radius-c.radius)&&d<this.radius+c.radius)
{
System.out.print("相交的圆");
return 2;
}
else if(d>this.radius+c.radius)
{
System.out.print("分离的圆");
return 3;
}
else if(d<=Math.abs(this.radius-c.radius))
{
System.out.print("包含的圆");
return 4;
}
return 5;
}
}
ClassTest 类
public class ClassTest
{
public static Point p0=new Point(1,0);
public static Point p1=new Point(3,0);
public static Point p2=new Point(4,0);
public static Point p3=new Point(4,4);
public static Point p4=new Point(4,4);
public static Point p5=new Point(3,0);
public static Circle c0=new Circle(p0,1);
public static Circle c1=new Circle(p1,2);
public static Circle c2=new Circle(p2,1);
public static Circle c3=new Circle(p3,2);
public static Circle c4=new Circle(p4,2);
public static Circle c5=new Circle(p5,1);
public static void main(String []args)
{
System.out.println(c0.area());//测试面积
System.out.println(c0.perimeter());//测试周长
System.out.println(c0.relation(c1));
System.out.println(c1.relation(c2));
System.out.println(c2.relation(c3));
System.out.println(c3.relation(c4));
System.out.println(c1.relation(c3));
System.out.println(c2.relation(c5));
}
}
测试结果为
图片.png如果这篇文档对您有帮助的话,请给我点个赞吧。
阐述中难免有纰漏之处,希望大家多多批评和指正
谢谢大家。
网友评论