点击查看:2015计算机等级考试二级Java入门教程章节汇总
点击查看:2015计算机等级考试二级Java入门教程第五章汇总
5.7 使用对象
让我们建立一个例子来实现一些简单的二维图形,这将会给我们一个使用更多类的机会。我们定义两个类;一个是点对象类,另一个是线对象类,然后使用这两个类确定线的交点。我们将称此例子为TryGenmetry,因此你要将程序文件存储在该名字的目录或文件夹下。该例子中包括了大量的代码行,我们将逐步地把它们集中在一起,并且试着理解每段代码的执行过程。
试试看--Point类
我们首先为点对象定义一个很基本的类:
class Point
{
//Coordinates of the point
double x;
double y;
//Create a point from coordinates
point (double xVal,double,yVal)
{
x=xVal;
y=yVal;
}
//Create a point from another Point object
Point(final Point oldPoint)
(
x=oldPoint.x; //Copy x coordinate
y=oldPoint.y; //Copy y coordinate
}
//Move a point
void move (double xDelta,double yDelto)
{
//Parameter values are increments to the current coordinates
x+=xDelte;
y+=yDelte;
}
//Calculate the discance to another poine
double distance(fina) Point aPoint
{
return
(x-aPoint.x)*(x-aPoint.x)+(y + aPoint.y)*(y-apoint,y);
}
//Convert a point to a string
public string tostring ( )
{
rsturn Double.tostring()
}
}
应该将Point.java保存到目录TryGeometry中。
如何操作
这是一个简单的类,它仅有两个实例变量x和Y,作为Point对象的坐标。在此,我们有两个构造函数:一个是通过自变量传递一对数值来建立一个点;另一个是根据一个己存在的点来建立一个新的Point对象。
在类中包含有三个方法。第一个是move方法,它可以为每个坐标值加上一个增量来将Point移动到另一个位置上。另一个是distance()方法,它可以计算从当前的Point对象到自变量传入的Point对象之间的距离。这个方法应用勾股定理计算距离,如下图所示。
最后一个是toString()方法,它可以返回一个描述当前点坐标的字符串。如果一个类定义了toString)方法,那么这个类的对象就可以作为字符串连接运算符十的一个操作数,因此,你可以在任何类中实现这个方法,并使对象按照这种方式应用。在必要的时候,编译器将自动地插入一个对toString()的调用。例如,假定thePoint是一个Point类型的对象,我们编写语句
system.put.println(The point is at +thePoint);
taString()方法将被自动地调用来把thePoint型转换为String型。其结果将被追加到String文字中。我们己经把taString()方法说明为public,在这里要让这个类能够通过编译,这样处理是必要的。我们将在本章稍后解释其原因。
注意,我们是如何使用定义在类Double中的静态toStringf( )方法,将x的值转换成String型的。编译器将为"+"操作左面的操作数y自动地插入一个对相同方法的调用,来把它转换成String对象。
试试看--Line类
我们可以在Line类中定义使用Point对象:
Class Line
{
point start //Start point of line
point end //End point of line
//Create a line from two points
line(final Point start,final Point end)
(
this.start =new Point(Start);
this.end=new point(end);
)
//Create a line form two coordinate pairs
Line(double xStart.double ystart,double xEnd,double y End)
{
start=new point(xStart,ystart); //Create the start point
通常你应该避免在两个对象之间存在这种隐含地依赖关系。
在Line类的toStrins方法中,我们可以在一个Line对象的String表示形式中直接地使用Point对象,这是因为Point类也定义了toString方法。
我们现在已经定义了两个类。在这些类定义中,包括了定义每个类对象的基本数据。我们还定义了一些被认为很有用的方法,并且增加了几个有不同输入参数的构造函数。注意,在Line类的定义中是如何应用Point类的。用两个Point对象来定义一条线是非常自然的,这要比完全用单独的x和Y坐标来定义Line类更加简单、更易于理解。为了进一步说明类如何相互作用,如何直接地利用类来解决问题,让我们设计一个方法,用它来计算两个Line对象的相交点。
由两条直线建立一个点
我们可以把这个方法增加到Line类中。下面的示意图说明了数学运算的操作过程。
如果你愿意的话,可以忽略这个数学运算的过程,因为它并不是本例中最主要的内容。如果你不希望对这个新的构造函数中的代码进行深究的话,就可以侧随下面的"试试看".换句话说,如果你对高中所学过的知识还比较熟悉的话,就不会感觉太困难。
获得两条直线交点的一种方法,是使用上图额度那些方程式。他们之所以被称作参数方程式,是因为他们使用了一个参数值(s和t)作为决定每条直线上点的变量。参数s和t早0到1之间变化,用他们给出位于定义的起点和终点之间的直线上点。当一个参数s或t为0时,方程式给出了每条直线起点的坐标;为1时,给出终点的坐标。
在直线的交叉位置,直线方程式一定会产生相同的(x,y)的坐标值,所以,在这点上,两条直线方程式右面的x值一定会相等,同理y值也一定相等。这就给出了两个关于s和t的方程式。使用代数代换,你可以除去s而只保留所示的t方程式,然后可以用定义的linel方程式替代t,从而得到交点x和y的坐标。
试试看--计算两条直线的交点
我们可以利用这些结果为Line类编写其他的方法。把下列代码添加到Line.java的定义中:
// Return a point as the intersection of two Lines- called form a line object
Point intersecta(final line line)
{
Point localPoint=new Point(0,0);
double num=
(this.end.y=this.start.y)*(this.start.x-line1.start.x)
(this.end.x=this.start.x)*(this.start.y-line1.start.y)
double denom =
(this.end.y=this.start.y)*(this.start.x-line1.start.x)*num/denom;
(this.end.x=this.start.x)*(this.start.y-line1.start.y)*num/denom;
return localPoint;
}
由于在Line类定义中引用了Point类,所以Line类在与它相关的其他类无效时是不能被编译的。在你编译Line类时,编译器也将编译其他的类。
如何操作
intersects()方法在一个Lure对象中被调用,并以另一个Line对象作为自变量。在代码中,局部变量num和denam是示意图中t表达式的分子和分母。然后我们使用这些值来计算交点x和y的坐标。
假如两条直线是平行的,t表达式中的分母就为0,所以你一定要在代码中检查这个值,现在,我们先忽略它,若发生这种情况,我们就以Infinity(无穷大)结合。
注意我们是如何获得定义直线的Point对象的坐标值的。当你想引用一个成员的成员时,只要重复使用点标记引用对象成员即可。例如,对于对象line1,表达式line1.start引用直线的开始端Point对象。因此,linel.start.x引用它的x坐标,而linel.start.y则存取它的y坐标。
现在,我们有一个Line类,可以计算两个Line对象的交点。我们需要一个程序来测试这段代码。
试试看--TryGeometry类
我们可以在main( )方法中用下列语句演示一下已经定义的两个类:
public class TryGeometry
{
public static void main(string[ ] args)
(
//Create two points and display them
Point start=new Point(0.0,1.0);
Piont end=new Point(5.0,6.0);
System.out.Println(Points created are + start +and +and);
//Create two lines and display them
Line line1=new Line(start,end);
Line line2=new Line(0.0,3.0,3.0,0.0);
system.out.println(Lines oreated are + linel + and + line2);
//Display the intersection
system.out.println("Intersection is + line2.intersects(line1);
//Now move the end point of linel and show the new intersection
endmove(1.0-5.0);
system.out.println(Intersection is + linel.intersects(line2));
}
}
程序产生的输出为:
Points created are 0.0.1.0 and 5.0,6.0
Lines created are(0.0.1.0):(5.0,6.0)and (0.0.3.0):(3.0.0.0)
Intersection is 1.0.2.0
Intersection is 1.0.2.0
如何操作
我们首先建立两个Point对象,这两个对象将在后面建立对象line 1的时候使用,然后使用Println()方法显示这两个点。我们在Point类中定义的touring()方法被自动地用来产生每个Point对象的String表示形式。
依据两个点建立line 1之后,我们使用Line类中的另一个构造函数,根据两对坐标建立Line2然后显示这两条直线。这里line类的tostring()成员被调用来建立每个Line.对象的String表示形式,这个方法中又依次使用Point类中的toString()方法。
下一条语句用line2调用intersects()方法,并且返回两条直线line 1和line2交点的Poitlt对象,然后将该Paint对象作为println()方法的自变量显示输出。正像你看到的,我们得到这个Point对象时,并没有强迫保存它,这里我们仅用它来建立被显示的字符串。
我们使用类Point中的move()方法来修改。end对象的坐标,利用这个对象建立line 1,然后再获得两条直线的交点,这次要用linel调用intersects(}方法。输出的结果表明line 1不依赖于对象end,因此,移动这个点不会对交点产生影响。
如果你把Line类的构造函数改成以前的版本,定义直线时不建立新的Point对象,你可以再次运行这个例子来看看结果。结果输出为:
Ponts created are 0.0.1.0 and 5.0,6.0
Lines created are(0.0.1.0):(5.0.6.0)and(0.0.3.0):(3.0.0.0)
Intersection is1.0.2.0
Intersection is2.0.1.0
现在,改变end对象就变换了这条直线,所以在移动end点之后,我们就得到了两条直线的一个不同交点。这是因为Line型对象line 1中包括对定义在main()中的Point对象的引用,而不独立于Point对象。
相关推荐:
北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |