點擊查看:2015計算機等級考試二級Java入門教程章節(jié)匯總
點擊查看:2015計算機等級考試二級Java入門教程第五章匯總
5.7 使用對象
讓我們建立一個例子來實現(xiàn)一些簡單的二維圖形,這將會給我們一個使用更多類的機會。我們定義兩個類;一個是點對象類,另一個是線對象類,然后使用這兩個類確定線的交點。我們將稱此例子為TryGenmetry,因此你要將程序文件存儲在該名字的目錄或文件夾下。該例子中包括了大量的代碼行,我們將逐步地把它們集中在一起,并且試著理解每段代碼的執(zhí)行過程。
試試看--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()
}
}
應(yīng)該將Point.java保存到目錄TryGeometry中。
如何操作
這是一個簡單的類,它僅有兩個實例變量x和Y,作為Point對象的坐標(biāo)。在此,我們有兩個構(gòu)造函數(shù):一個是通過自變量傳遞一對數(shù)值來建立一個點;另一個是根據(jù)一個己存在的點來建立一個新的Point對象。
在類中包含有三個方法。第一個是move方法,它可以為每個坐標(biāo)值加上一個增量來將Point移動到另一個位置上。另一個是distance()方法,它可以計算從當(dāng)前的Point對象到自變量傳入的Point對象之間的距離。這個方法應(yīng)用勾股定理計算距離,如下圖所示。
最后一個是toString()方法,它可以返回一個描述當(dāng)前點坐標(biāo)的字符串。如果一個類定義了toString)方法,那么這個類的對象就可以作為字符串連接運算符十的一個操作數(shù),因此,你可以在任何類中實現(xiàn)這個方法,并使對象按照這種方式應(yīng)用。在必要的時候,編譯器將自動地插入一個對toString()的調(diào)用。例如,假定thePoint是一個Point類型的對象,我們編寫語句
system.put.println(The point is at +thePoint);
taString()方法將被自動地調(diào)用來把thePoint型轉(zhuǎn)換為String型。其結(jié)果將被追加到String文字中。我們己經(jīng)把taString()方法說明為public,在這里要讓這個類能夠通過編譯,這樣處理是必要的。我們將在本章稍后解釋其原因。
注意,我們是如何使用定義在類Double中的靜態(tài)toStringf( )方法,將x的值轉(zhuǎn)換成String型的。編譯器將為"+"操作左面的操作數(shù)y自動地插入一個對相同方法的調(diào)用,來把它轉(zhuǎn)換成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
通常你應(yīng)該避免在兩個對象之間存在這種隱含地依賴關(guān)系。
在Line類的toStrins方法中,我們可以在一個Line對象的String表示形式中直接地使用Point對象,這是因為Point類也定義了toString方法。
我們現(xiàn)在已經(jīng)定義了兩個類。在這些類定義中,包括了定義每個類對象的基本數(shù)據(jù)。我們還定義了一些被認(rèn)為很有用的方法,并且增加了幾個有不同輸入?yún)?shù)的構(gòu)造函數(shù)。注意,在Line類的定義中是如何應(yīng)用Point類的。用兩個Point對象來定義一條線是非常自然的,這要比完全用單獨的x和Y坐標(biāo)來定義Line類更加簡單、更易于理解。為了進一步說明類如何相互作用,如何直接地利用類來解決問題,讓我們設(shè)計一個方法,用它來計算兩個Line對象的相交點。
由兩條直線建立一個點
我們可以把這個方法增加到Line類中。下面的示意圖說明了數(shù)學(xué)運算的操作過程。
如果你愿意的話,可以忽略這個數(shù)學(xué)運算的過程,因為它并不是本例中最主要的內(nèi)容。如果你不希望對這個新的構(gòu)造函數(shù)中的代碼進行深究的話,就可以側(cè)隨下面的"試試看".換句話說,如果你對高中所學(xué)過的知識還比較熟悉的話,就不會感覺太困難。
獲得兩條直線交點的一種方法,是使用上圖額度那些方程式。他們之所以被稱作參數(shù)方程式,是因為他們使用了一個參數(shù)值(s和t)作為決定每條直線上點的變量。參數(shù)s和t早0到1之間變化,用他們給出位于定義的起點和終點之間的直線上點。當(dāng)一個參數(shù)s或t為0時,方程式給出了每條直線起點的坐標(biāo);為1時,給出終點的坐標(biāo)。
在直線的交叉位置,直線方程式一定會產(chǎn)生相同的(x,y)的坐標(biāo)值,所以,在這點上,兩條直線方程式右面的x值一定會相等,同理y值也一定相等。這就給出了兩個關(guān)于s和t的方程式。使用代數(shù)代換,你可以除去s而只保留所示的t方程式,然后可以用定義的linel方程式替代t,從而得到交點x和y的坐標(biāo)。
試試看--計算兩條直線的交點
我們可以利用這些結(jié)果為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類在與它相關(guān)的其他類無效時是不能被編譯的。在你編譯Line類時,編譯器也將編譯其他的類。
如何操作
intersects()方法在一個Lure對象中被調(diào)用,并以另一個Line對象作為自變量。在代碼中,局部變量num和denam是示意圖中t表達式的分子和分母。然后我們使用這些值來計算交點x和y的坐標(biāo)。
假如兩條直線是平行的,t表達式中的分母就為0,所以你一定要在代碼中檢查這個值,現(xiàn)在,我們先忽略它,若發(fā)生這種情況,我們就以Infinity(無窮大)結(jié)合。
注意我們是如何獲得定義直線的Point對象的坐標(biāo)值的。當(dāng)你想引用一個成員的成員時,只要重復(fù)使用點標(biāo)記引用對象成員即可。例如,對于對象line1,表達式line1.start引用直線的開始端Point對象。因此,linel.start.x引用它的x坐標(biāo),而linel.start.y則存取它的y坐標(biāo)。
現(xiàn)在,我們有一個Line類,可以計算兩個Line對象的交點。我們需要一個程序來測試這段代碼。
試試看--TryGeometry類
我們可以在main( )方法中用下列語句演示一下已經(jīng)定義的兩個類:
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));
}
。
程序產(chǎn)生的輸出為:
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()方法被自動地用來產(chǎn)生每個Point對象的String表示形式。
依據(jù)兩個點建立line 1之后,我們使用Line類中的另一個構(gòu)造函數(shù),根據(jù)兩對坐標(biāo)建立Line2然后顯示這兩條直線。這里line類的tostring()成員被調(diào)用來建立每個Line.對象的String表示形式,這個方法中又依次使用Point類中的toString()方法。
下一條語句用line2調(diào)用intersects()方法,并且返回兩條直線line 1和line2交點的Poitlt對象,然后將該Paint對象作為println()方法的自變量顯示輸出。正像你看到的,我們得到這個Point對象時,并沒有強迫保存它,這里我們僅用它來建立被顯示的字符串。
我們使用類Point中的move()方法來修改。end對象的坐標(biāo),利用這個對象建立line 1,然后再獲得兩條直線的交點,這次要用linel調(diào)用intersects(}方法。輸出的結(jié)果表明line 1不依賴于對象end,因此,移動這個點不會對交點產(chǎn)生影響。
如果你把Line類的構(gòu)造函數(shù)改成以前的版本,定義直線時不建立新的Point對象,你可以再次運行這個例子來看看結(jié)果。結(jié)果輸出為:
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
現(xiàn)在,改變end對象就變換了這條直線,所以在移動end點之后,我們就得到了兩條直線的一個不同交點。這是因為Line型對象line 1中包括對定義在main()中的Point對象的引用,而不獨立于Point對象。
相關(guān)推薦:
2015計算機等級考試二級Java入門教程章節(jié)匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |