点击查看:2015计算机等级考试二级Java入门教程章节汇总
点击查看:2015计算机等级考试二级Java入门教程第五章汇总
5.10 控制对类成员的访问
我们还没有讨论类成员如何才能在类外进行访问。你知道在一个静态的类方法内可以引用任何静态的类成员,一个非静态的方法可以引用类的任何成员。在一个类中,可以被其他类访问的变量和方法的限制要显得复杂些。它取决于你为类成员指定的访问属性(accessattributes)以及类是否在同一个包中。这也就是我们必须首先了解包的原因。
使用访问属性
让我们先从同一个包中的类开始考虑。在一个给定的包中,任何类都可以直接地访问其他的类名,例如,为了声明变量或者指定方法参数的类型你可以使用类名,但是,这些变量和方法如果是其他类的成员,就不一定可以访问。这些成员的可访问性由访问属性控制。在为一个类成员指定访问属性时,包括迄今为止我们在例子中已经使用过的,你可以有四种选择。要么什么都不指定;要么指定一种,每种访问属性都有完全不同的效果。你可用来为类中变量或方法指定可访问性的选项有:
这张列表显示了你为类成员设置的访问属性是如何决定你可以从Java环境中的哪个部分访问它们。在下一章中我们将讨论子类,所以现在不用考虑它。后面我们将返回来介绍怎样以及何时使用protected属性。注意,public. private和protected都是关键字。把一个成员指定为pubic,则它就完全可访问。而另外一个极端,一个private成员将仅局限于同类中的成员可以进行访问。
听起来比实际情况更复杂。请看下一张示意图,它显示了同一个包中类之间允许的访问情况。
在一个包内,比如packagel,只是类classl的private成员,不能由同一个包中另一个类的方法直接地访问。把类的成员声明为priVaLe,就限制了它只可在同一个类的方法中使用。
Java2入门经典在线教程完整版
我们以前看到过,一个类定义必须有一个public的访问属性才能从包外访问它下一张示意图显示了位于不同包中的类,请求访问一个公有类成员的情况。
这里的访问受到了更多的限制。只有Class 1中被说明为public的那些成员才能被另一个包中的普通类Class2访问。要记住,类Class 1还必须被定义为public属性。在另一个包中的Classl子类,若Class 1的成员没有访问属性,则不能被得到,并且对于private成员,在任何环境下都不能从外部访问。
指定访问属性
从我们刚刚看到的示意图中大概推测一下,要为一个类成员指定访问属性,你只在声明的开始处增加一个关键字即可。这里是你在以前看到的Point类,然而,现在我们为它的每个成员定义了访问属性:
试试看--访问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成员位于最后。你应该按照它们的访问属性把类成员排列成一个统一的顺序,这样会使代码更加容易跟踪。最常见的顺序是访问频率高的成员在前面,访问频率低的成员在后面,但是统一的排列顺序要比你选择的特定顺序更重要。
如何操作
现在,实例变量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文件。然后,你可以用下面的命令执行这个程序:
java -classpath C:\Packages TryPackages
当程序执行时,你会看到下述输出结果:
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的外面访问。显而易见,一个嵌套类应该与包含它的类有一些特殊的联系。任意地将一个类嵌入到另一个类中是不明智的。这里的类被称作顶层类(top-level class).顶层类是一个包含嵌套类而它自己并没有被嵌套到其他类中的类。
相关推荐:
北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |