1. 包

包内包含有一组类,它们在单一的名字空间下被组织到一起。例如Java标准发布中有一个工具库,它被组织在java.util名字空间之下。Java.util中有一个ArrayList类,使用它可以用其全名,例如:

public class Test {
  public static void main(String[] args) {
    java.util.ArrayList list = new java.util.ArrayList();
  }
}

这个语句使程序变得很冗长,因此可以转而使用import关键字,如果想导入单个类,可以在import语句中命名该类,例如:

import java.util.ArrayList;
public class Test {
  public static void main(String[] args) {
    ArrayList list = new ArrayList();
  }
}

如果想导入其中所有的类,只需要使用"*",例如:

import java.util.*;

之所以要使用导入,就是要提供一个管理名字空间的机制。由于类名之间存在潜在冲突,在Java中对名称空间进行完全控制并为每个类创建唯一的标识符组合就成为非常重要的事情。

当编写一个Java源代码文件时,此文件通常被称为编译单元,它们都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件的名称相同(包括大小写,但不包括后缀名),每个编译单元只能有一个public类。

当编译一个.java文件时,文件中的每个类都会有一个输出文件,而该输出文件的名称与文件中每个类的名称相同,只是多了一个后缀名.class。Java可运行程序是一组可以打包并压缩为一个Java文档文件(JAR文件)的.class文件。Java解释器负责这些文件的查找、装载和解释。

类库实际上是一组类文件,其中每个文件都有一个public类,以及任意数量的非public类,因此每个文件都有一个构件,如果希望这些构件从属于同一个群组,就可以使用关键字package,并且它必须是文件中除注释外的第一句程序代码,例如:

package access.mypackage;
public class MyClass {
}

如果有人想用MyClass,必须使用import关键字来使access中的名称可用,例如:

import access.mypackage.*;
public class Test {
  public static void main(String[] args) {
    MyClass m = new MyClass();
  }
}


2. 访问权限修饰

Java访问权限修饰词包括public、protected和private,置于类中每个成员的定义之前,每个访问权限修饰词仅控制它所修饰的特定定义的访问权。如果不提供任何访问权限修饰词,则意味着它是包访问权限。包访问权限意味着当前包中的所有其他类对那个成员都有访问权限,但对于这个包之外的所有类,这个成员却是private。

类控制着哪些代码有权访问自己的成员,取得对某成员的访问权的方法是,要么使该成员成为public,要么通过不加访问权限修饰词并将其他类放置于同一个包内赋予访问权,另外,继承而来的类即可以访问public成员,也可以访问protected成员。

使用关键字public,意味着public之后紧跟着的成员声明自己对每个人都是可用的,例如:

class Test {
  public void SayHello() {
    System.out.println("Hello World!");
  }
}
public class Main {
  public static void main(String[] args) {
    Test t = new Test();
    t.SayHello();
  }
}

关键字private的意思是,除了包含该成员的类之外,其他任何类都无法访问这个成员,例如:

class Test {
  private Test() {}
  static Test makeTest() {
    return new Test();
  }
}
public class Main {
  public static void main(String[] args) {
    Test t = Test.makeTest();
  }
}

关键字protected处理的是继承的概念,通过继承可以利用一个现有类,为了从现有类中继承,需要声明新类exntends一个现有类,例如:

class SubTest extends Test {
}

基类的创建者如果希望特定成员对它的访问权限赋予派生类而不是所有类,就需要protected来完成,protected也提供包访问权限,也就是说,相同包内的其他类可以访问protected元素,例如:

class Test {
  protected void sayHello() {
    System.out.println("Hello World!");
  }
}
public class Main {
  public static void main(String[] args) {
    Test t = new Test();
    t.sayHello();
  }
}


3. 类访问权限

在Java中,访问权限修饰词也可以用于确定库中的哪些类对于该库的使用者是可用的,如果希望某个类可以被使用,可以通过把关键字public作用于整个类的定义来达到目的,例如:

public class Test {
}

然而,还有一些额外的限制,每个编译单元都只能有一个public类,这表示每个编译单元都有单一的公共接口,用public类来表现。public类的名称必须与含有该编译单元的文件名相匹配,包括大小写。此外编译单元内不带public类也是可以的,不带权限修饰词的类拥有包访问权限,即该类只可以用于该包之中。

需要注意的是,类即不可以是private的,也不可以是protected的,所以对于类的访问权限,权有两个选择:包访问权限或public。如果不希望其他任何人对该类拥有访问权限,可以把所有的构造器都指定为private,从而阻止任何人创建该类的对象,只有一个例外,即在该类的static成员内部创建。