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