java的访问控制
java的访问控制,常用于项目的团队开发,合理的访问控制可以提高项目的稳定性,减少项目的耦合度,减少项目的维护成本,
public 和 private
private修饰的成员变量和方法仅仅只能在本类中调用;而public修饰的成员变量和方法可以在任何地方调用。public修饰的内容是对外提供可以被调用的功能,需要相对稳定;private修饰的内容是对内实现的封装,如果“公开”会增加维护的成本。
例如:
public class Point{
private int x;
private int y;
Point(int x, int y){...}
public int distance(Point p){...}
}
... ... ...
Point p1 = new Point(1,2);
Point p2 = new Point(3,4);
p1.x=100;//编译报错,The field Point.x is not visible
int d = p1.distance(p2);
... ... ...
package语句
定义类时需要指定类的名称。但如果仅仅将类名作为类的唯一标示,则不可避免的出现命名冲突的问题。这会给组件复用以及团队间的合作造成很大的麻烦!在Java语言中,用包(package) 的概念来解决命名冲突的问题。在定义一个类时,除了定义类的名称一般还要指定一个包名:
package 包名;
例如:
package test;
class Point{... ... ...}
//package语句必须写在Java源文件的最开始,在类定义之前。例如:下面的语句将为Point类//指定包名"test" :一旦使用的package指定了包名,类的全称应该是"包名.类名"。例如,上述的//Point类的全称是test.Point。 不同的包中可以定义相同的类名,例如test1.Point//和test2.Point是两个截然不同的名称。
包名也可以有层次结构,在一个包中可以包含另外一个包。
可以按照如下方式写package语句:
package 包名1.包名2...包名n;
如果各个公司或开发组织的程序员都随心所欲的命名包名的话,仍然不能从根本上解决命名冲突的问题。因此,在指定包名的时候应该按照一定的规范,例如:
org.apache.commons.lang.StringUtil
StringUtils时类名。而org.apache.commons.lang是多层包名,其含义如下:org.apache表示公司货组织的信息(是这个公司(或组织)域名的反写);common表示项目的名称信息;lang表示模块的名称信息。
import语句
org.whatisjava.core.Point p = new org.whatisjava.core.Point();
//访问一个类时需要使用该类的全称。但这样的书写方式过于繁琐.可以通过
//import语句对类的全称进行声明。例如:
import org.whatisjava.core.Point;
//通过import语句声明了类的全称后,该源文件中就可以直接使用类名来访问了。
//有时,import语句中也可以使用"*",例如
import org.whatisjava.*;
//意味着声明该包中所有类的全称,该源文件中使用所有包名为org.whatisjava的类
//都可以仅仅通过类名访问。需要注意的是,"import 包名.*;" 语句并不包含该包的子包
//中的类。在Eclipse和MyEclipse中,可以使用"Ctrl + Shift + O" ,自动完成import语句。
protected 和 默认访问控制
用protected修饰的成员变量和方法可以被子类及同一个包中的类使用。
默认访问控制即不书写任何访问控制符。默认访问控制的成员变量和方法可以被同一个包中的类调用。
访问控制修饰符的对比
修饰符 本类 同一个包中的类 子类 其他类
public 可以访问 可以访问 可以访问 可以访问
protected 可以访问 可以访问 可以访问 不能访问
默认 可以访问 可以访问 不能访问 不能访问
private 可以访问 不能访问 不能访问 不能访问
//对于类的修饰可以使用public和默认方式。 public 修饰的类可以被任何一个类使用;
//默认访问控制的类只可以被同一个包中的类使用。 protected和private 可以用于修饰内部类。