點(diǎn)擊查看:2015計(jì)算機(jī)等級(jí)考試二級(jí)Java入門教程章節(jié)匯總
點(diǎn)擊查看:2015計(jì)算機(jī)等級(jí)考試二級(jí)Java入門教程第五章匯總
5.10 控制對(duì)類成員的訪問(wèn)
我們還沒(méi)有討論類成員如何才能在類外進(jìn)行訪問(wèn)。你知道在一個(gè)靜態(tài)的類方法內(nèi)可以引用任何靜態(tài)的類成員,一個(gè)非靜態(tài)的方法可以引用類的任何成員。在一個(gè)類中,可以被其他類訪問(wèn)的變量和方法的限制要顯得復(fù)雜些。它取決于你為類成員指定的訪問(wèn)屬性(accessattributes)以及類是否在同一個(gè)包中。這也就是我們必須首先了解包的原因。
使用訪問(wèn)屬性
讓我們先從同一個(gè)包中的類開始考慮。在一個(gè)給定的包中,任何類都可以直接地訪問(wèn)其他的類名,例如,為了聲明變量或者指定方法參數(shù)的類型你可以使用類名,但是,這些變量和方法如果是其他類的成員,就不一定可以訪問(wèn)。這些成員的可訪問(wèn)性由訪問(wèn)屬性控制。在為一個(gè)類成員指定訪問(wèn)屬性時(shí),包括迄今為止我們?cè)诶又幸呀?jīng)使用過(guò)的,你可以有四種選擇。要么什么都不指定;要么指定一種,每種訪問(wèn)屬性都有完全不同的效果。你可用來(lái)為類中變量或方法指定可訪問(wèn)性的選項(xiàng)有:
這張列表顯示了你為類成員設(shè)置的訪問(wèn)屬性是如何決定你可以從Java環(huán)境中的哪個(gè)部分訪問(wèn)它們。在下一章中我們將討論子類,所以現(xiàn)在不用考慮它。后面我們將返回來(lái)介紹怎樣以及何時(shí)使用protected屬性。注意,public. private和protected都是關(guān)鍵字。把一個(gè)成員指定為pubic,則它就完全可訪問(wèn)。而另外一個(gè)極端,一個(gè)private成員將僅局限于同類中的成員可以進(jìn)行訪問(wèn)。
聽起來(lái)比實(shí)際情況更復(fù)雜。請(qǐng)看下一張示意圖,它顯示了同一個(gè)包中類之間允許的訪問(wèn)情況。
在一個(gè)包內(nèi),比如packagel,只是類classl的private成員,不能由同一個(gè)包中另一個(gè)類的方法直接地訪問(wèn)。把類的成員聲明為priVaLe,就限制了它只可在同一個(gè)類的方法中使用。
Java2入門經(jīng)典在線教程完整版
我們以前看到過(guò),一個(gè)類定義必須有一個(gè)public的訪問(wèn)屬性才能從包外訪問(wèn)它下一張示意圖顯示了位于不同包中的類,請(qǐng)求訪問(wèn)一個(gè)公有類成員的情況。
這里的訪問(wèn)受到了更多的限制。只有Class 1中被說(shuō)明為public的那些成員才能被另一個(gè)包中的普通類Class2訪問(wèn)。要記住,類Class 1還必須被定義為public屬性。在另一個(gè)包中的Classl子類,若Class 1的成員沒(méi)有訪問(wèn)屬性,則不能被得到,并且對(duì)于private成員,在任何環(huán)境下都不能從外部訪問(wèn)。
指定訪問(wèn)屬性
從我們剛剛看到的示意圖中大概推測(cè)一下,要為一個(gè)類成員指定訪問(wèn)屬性,你只在聲明的開始處增加一個(gè)關(guān)鍵字即可。這里是你在以前看到的Point類,然而,現(xiàn)在我們?yōu)樗拿總(gè)成員定義了訪問(wèn)屬性:
試試看--訪問(wèn)Point類
在你的Point類中做如下改變。如果你要把它保存在一個(gè)新的目錄中,就要確保Line.Java也被復(fù)制到那里。假如它們?cè)诿麨镚eornetx的目錄中,則會(huì)對(duì)以后很有用。
pubic class Point
(
//Create a point from Coordonates
public Point (double xVal,double yVal)
{
x=xVal;
y=yVal;
//Create a Point at exisLing Foint object
public Point(final aPoint)
{
x=aPoint.x;
y=aPoint.y;
//Move a point
public void move (double xDelta,double yDolta)
{
//
Parameter values are increments to the current coordinates
x +=xDelta;
y +=yDelta;
}
//Calculate the diatance to another point
public double distance(final pointaPoint)
{
return Math.sqrt(
(x-aPoint.x)*(x-aPoint.x)*(y-aPoint.y)*(y-aPoint.y));
}
//convert a point to a string
public string tostring
{
return Double.tostring(x)+ +y; //As x.y
}
//Coordinates of the point
private double x;
private double y;
在類中的成員已經(jīng)被重新排列,private成員位于最后。你應(yīng)該按照它們的訪問(wèn)屬性把類成員排列成一個(gè)統(tǒng)一的順序,這樣會(huì)使代碼更加容易跟蹤。最常見(jiàn)的順序是訪問(wèn)頻率高的成員在前面,訪問(wèn)頻率低的成員在后面,但是統(tǒng)一的排列順序要比你選擇的特定順序更重要。
如何操作
現(xiàn)在,實(shí)例變量x和Y不能從類以外的地方訪問(wèn)或修改,因?yàn)樗鼈兊脑L問(wèn)屬性private.對(duì)它們進(jìn)行設(shè)置或者修改的惟一途徑是通過(guò)類中的方法,可以是構(gòu)造函數(shù),也可以是move方法。如果需要從類以外的地方獲得x和y的值,那么就可以用一個(gè)很簡(jiǎn)單的函數(shù)來(lái)完成這項(xiàng)復(fù)雜的操作。例如:
//Retrieve the x coordinate
public double getX( )
(return X:)
//Retrieve the y coordinate
public double gety()
(return y)
//Set the x coordinate
public void setx(double inputX)
( x=inputx;)
//Set the y cordinate
public void secy(double inputy)
(y=inputy;)
//Coordinates of the point
private double x;
private double y;
}
注意,我們己經(jīng)在類中增加了getX{}, getY{),setX{}和setY{)方法,可以使用它們?cè)L問(wèn)private的數(shù)據(jù)成員。
Line類也需要被修改成公有方法以及公有類。我們還需要更改它的intersects()方法,讓它可以利用Point類中的setXXX()和getXXX()方法訪問(wèn)Point型對(duì)象的私有數(shù)據(jù)成員。在Line.Java代碼中,更改的地方被突出顯示,其代碼為:
package Geometry;
public class Line
{
//Create a line form two point
public line(final Point start,final Point end)
(
this.start=new Point(start);
this.end=new Point(end);
}
//Create a line from two coordinate paris
public line(double xStart,double ystart,double xEnd,double,double yEnd)
{
start=new Point (xStart,yStart); //Create the start point
end =new Point(xEnd,yEnd); //Create the end point
)
//Caloulate the length of a line
piblic double length()
(
return start.distance(end); //Use the method form the Point class
}
試試看--測(cè)試Geometry包
我們可以建立一連串的點(diǎn),并且依次連接每對(duì)相鄰的點(diǎn)以形成一條直線,然后計(jì)算直線的總長(zhǎng)度。
import Geometry.*; //Import the Piont the and Line classes
public class TryPackage
{
double[ ] [ ]coords=((1.0,0.0),(6.0,0.0),(6.0,10.0),
(10.0,10.0),(10.0,-14.0),(8.0.-14.0)
//create an array of points and fill it with Point objects
Point[ ]points=new Point [coords.length];
for(int i=0;i
points[i]=new Point(coords[i][0].coords[i][l];
//Create an array of lines and fill it using Point pairs
Line[ ] lines=new Line(poins.length-1);
double totalLength=0.0; //store otal line lengh here
for(int i=0;i
{
lines[i]=new Line9points[i],porints[i+1]); //Create a Line
totalLength + lines[i].length(); //Add its length
System.out.println(\nDine + (i+1)+ lines[i]
Length is + lines[i].length());
)
//output the toatal length
system.out.println(/n/nTotal line length=+ totalLength);
}
}
你應(yīng)該在TryPackage目錄中將它保存為TryPackage.java文件。在運(yùn)行Windows的PC機(jī)中,如果你的Geometry路徑為C:1Package\Geometry,則可以用下面的命令編譯這個(gè)文件:
java -classpath C:\Packages TryPackages.java
這條命令假定當(dāng)前目錄包含TryPackage.java文件。然后,你可以用下面的命令執(zhí)行這個(gè)程序:
java -classpath C:\Packages TryPackages
當(dāng)程序執(zhí)行時(shí),你會(huì)看到下述輸出結(jié)果:
Line 1 (1.0,0.0) ; (6.0,0.0) length is 5.0
Line 2 (6.0,0.0) : (6.0,10.0) length is 10.0
//Move members of Outside calss…
}
這里的類Inside嵌套在類Outside中。類Inside聲明為Outside類的一個(gè)公有成員,所以它可從Outside的外面訪問(wèn)。顯而易見(jiàn),一個(gè)嵌套類應(yīng)該與包含它的類有一些特殊的聯(lián)系。任意地將一個(gè)類嵌入到另一個(gè)類中是不明智的。這里的類被稱作頂層類(top-level class).頂層類是一個(gè)包含嵌套類而它自己并沒(méi)有被嵌套到其他類中的類。
相關(guān)推薦:
2015計(jì)算機(jī)等級(jí)考試二級(jí)Java入門教程章節(jié)匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |