6、访问控制权限
通过Java提供访问权限修饰词,以供类库开发人员向客户端程序员指明哪些时可用的,哪些是不可用的。
权限从大到小依次为:
(1)public
(2)protect
(3)包访问权限(没有关键词)
(4)private
6.1 包:库单元
包中有很多的类,这些类属于同一名字空间。
例如:java.util是名字空间,java.util中有ArrayList的类。
java.util.ArrayList list = new java.util.ArrayList();
这样会显得冗长,所以可以使用import关键字
import java.util.ArrayList;
class ...
main ...
ArrayList list = new ArrayList();
导入包中所有的类
import java.util.*;
每一个Java源代码都称为一个编译单元(转译单元)。每个编译单元的后缀为java。
每个编译单元可以有public类,但是类名一定要和文件的名称相同,每个编译单元只有一个public类。
6.1.1 代码组织
编译.java文件时会出现同名的.class文件。
一组Java文件可以打包为jar文件。
类库是一组类文件。每个文件都有一个public类,以及任意数量的非public类。类库的关键字package
使用package语句,必须在除了注释外的第一行。
package access
通过package表明该编译单元是access类库的一部分。
6.1.2 创建独一无二的包名
为了解决包名重复的问题,一般来说就是将域名倒过来写。
Java解释器的运行过程
(1)找出环境变量CLASSPATH。 CLASSPATH包含一个或者多个目录,作为查找class文件的根目录。
(2)将这些根目录相连接,得到相关联的class文件
6.1.3 定制工具库
重新写Print
package net.mindview.util;
import java.io.*;
public class Print{
public static void print(Object obj){
System.out.println(obj);
}
public static void print(){
System.out.println();
}
public static void printnb(Object obj){
System.out.print(obj);
}
}
6.1.4 用import改变行为
Java中没有条件编译功能。
6.1.5 对使用包的忠告
务必记住,无论何时创建包,都已经在给定包的名称时隐含了指定的目录结构。
6.2 Java访问权限修饰词
public、protected、private需要指定在属性和方法之前。
如果默认指定,则默认为包访问权限。
6.2.1 包访问权限
不写任何关键字时默认为包访问权限。
包访问权限允许彼此之间可以相互作用。
想要让其他包能够访问本包里的方法
(1) 使该成员成为public
(2)将其放在通过一包里
(3)使用继承技术,可以访问protected以上的数据
(4)使用get/set方法
默认包:如果你没有package指定包名,那么就都在默认包中,在默认包中的数据可以是可以相互访问的。
6.2.2 public:接口访问权限
使用关键字public,即对所有的包都是可用的。
如果你的CLASSPATH中没有.(点)。那么就意味着java编译器不会从当前文件夹开始寻找,这就会造成错误。
6.2.3 private:你无法访问
只能在类内部访问。
在多线程中,private非常的重要。
私有构造方法
class Sundae{
private Sundae(){}
static Sundae makeSundae(){
return new Sundae();
}
}
public class Test{
public static void main(String[] args){
Sundae x = new Sundae();//报错
Sundae x = Sundae.makeSundae();//可以执行
}
}
通过私有构造方法,使得用户不能new对象,只能通过特定的方法获取对象。
6.2.4 protected:继承访问权限
本包 和 其他包的子类可以访问
6.3 接口和实现
把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。
接口是不能实现的,就像一个纲领性文件,它只规定了原则性要求,并没有强调具体的实现。
使用接口的类,都需要具体实现这些原则性要求。
6.4 类的访问权限
如果要让这个类能够在包外访问,那么就需要声明public
关于public的限制
(1)每个编译单元(java文件)只能有一个public类
(2)public类的名字必须和编译单元(java文件)的名字一样
(3)每个编译单元(java文件)可以没有public类
6.5 总结
控制对成员的访问权限的原因
(1)使用户不要碰到那些不该碰到的部分
(2)为了让类库设计者可以更改类的内部工作方式。