點擊查看:2015計算機等級考試二級Java入門教程章節(jié)匯總
點擊查看:2015計算機等級考試二級Java入門教程第五章匯總
5.10 控制對類成員的訪問
我們還沒有討論類成員如何才能在類外進行訪問。你知道在一個靜態(tài)的類方法內可以引用任何靜態(tài)的類成員,一個非靜態(tài)的方法可以引用類的任何成員。在一個類中,可以被其他類訪問的變量和方法的限制要顯得復雜些。它取決于你為類成員指定的訪問屬性(accessattributes)以及類是否在同一個包中。這也就是我們必須首先了解包的原因。
使用訪問屬性
讓我們先從同一個包中的類開始考慮。在一個給定的包中,任何類都可以直接地訪問其他的類名,例如,為了聲明變量或者指定方法參數的類型你可以使用類名,但是,這些變量和方法如果是其他類的成員,就不一定可以訪問。這些成員的可訪問性由訪問屬性控制。在為一個類成員指定訪問屬性時,包括迄今為止我們在例子中已經使用過的,你可以有四種選擇。要么什么都不指定;要么指定一種,每種訪問屬性都有完全不同的效果。你可用來為類中變量或方法指定可訪問性的選項有:
這張列表顯示了你為類成員設置的訪問屬性是如何決定你可以從Java環(huán)境中的哪個部分訪問它們。在下一章中我們將討論子類,所以現在不用考慮它。后面我們將返回來介紹怎樣以及何時使用protected屬性。注意,public. private和protected都是關鍵字。把一個成員指定為pubic,則它就完全可訪問。而另外一個極端,一個private成員將僅局限于同類中的成員可以進行訪問。
聽起來比實際情況更復雜。請看下一張示意圖,它顯示了同一個包中類之間允許的訪問情況。
在一個包內,比如packagel,只是類classl的private成員,不能由同一個包中另一個類的方法直接地訪問。把類的成員聲明為priVaLe,就限制了它只可在同一個類的方法中使用。
Java2入門經典在線教程完整版
我們以前看到過,一個類定義必須有一個public的訪問屬性才能從包外訪問它下一張示意圖顯示了位于不同包中的類,請求訪問一個公有類成員的情況。
這里的訪問受到了更多的限制。只有Class 1中被說明為public的那些成員才能被另一個包中的普通類Class2訪問。要記住,類Class 1還必須被定義為public屬性。在另一個包中的Classl子類,若Class 1的成員沒有訪問屬性,則不能被得到,并且對于private成員,在任何環(huán)境下都不能從外部訪問。
指定訪問屬性
從我們剛剛看到的示意圖中大概推測一下,要為一個類成員指定訪問屬性,你只在聲明的開始處增加一個關鍵字即可。這里是你在以前看到的Point類,然而,現在我們?yōu)樗拿總成員定義了訪問屬性:
試試看--訪問Point類
在你的Point類中做如下改變。如果你要把它保存在一個新的目錄中,就要確保Line.Java也被復制到那里。假如它們在名為Geornetx的目錄中,則會對以后很有用。
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;
在類中的成員已經被重新排列,private成員位于最后。你應該按照它們的訪問屬性把類成員排列成一個統(tǒng)一的順序,這樣會使代碼更加容易跟蹤。最常見的順序是訪問頻率高的成員在前面,訪問頻率低的成員在后面,但是統(tǒng)一的排列順序要比你選擇的特定順序更重要。
如何操作
現在,實例變量x和Y不能從類以外的地方訪問或修改,因為它們的訪問屬性private.對它們進行設置或者修改的惟一途徑是通過類中的方法,可以是構造函數,也可以是move方法。如果需要從類以外的地方獲得x和y的值,那么就可以用一個很簡單的函數來完成這項復雜的操作。例如:
//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;
}
注意,我們己經在類中增加了getX{}, getY{),setX{}和setY{)方法,可以使用它們訪問private的數據成員。
Line類也需要被修改成公有方法以及公有類。我們還需要更改它的intersects()方法,讓它可以利用Point類中的setXXX()和getXXX()方法訪問Point型對象的私有數據成員。在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
}
試試看--測試Geometry包
我們可以建立一連串的點,并且依次連接每對相鄰的點以形成一條直線,然后計算直線的總長度。
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);
}
}
你應該在TryPackage目錄中將它保存為TryPackage.java文件。在運行Windows的PC機中,如果你的Geometry路徑為C:1Package\Geometry,則可以用下面的命令編譯這個文件:
java -classpath C:\Packages TryPackages.java
這條命令假定當前目錄包含TryPackage.java文件。然后,你可以用下面的命令執(zhí)行這個程序:
java -classpath C:\Packages TryPackages
當程序執(zhí)行時,你會看到下述輸出結果:
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類的一個公有成員,所以它可從Outside的外面訪問。顯而易見,一個嵌套類應該與包含它的類有一些特殊的聯(lián)系。任意地將一個類嵌入到另一個類中是不明智的。這里的類被稱作頂層類(top-level class).頂層類是一個包含嵌套類而它自己并沒有被嵌套到其他類中的類。
相關推薦:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |