1. 包的概念
包内包含一组类,它们被组织在一个单独的命名空间(namespace)下。
eg: 标准 Java 发布中有一个工具库,它被组织在 java.util 命名空间下。java.util 中含有一个类,叫做 ArrayList。使用 ArrayList 的一种方式是用其全名java.util.ArrayList
public class FullQualification {
public static void main(String[] args) {
java.util.ArrayList list =new java.util.ArrayList();
}
}
使用import导入,减少冗余代码
import java.util.ArrayList;
public class SingleImport {
public static void main(String[] args) {
ArrayList list = new ArrayList();
}
}
冲突:
通过 * 导入了两个包含相同名字类名的类库, 比如同时导入了sql包和util包下的Date类,在使用时如果不显示指明是哪个包下的类,而直接使用就会报错
import java.sql.*;
import java.util.*;
public class Main {
public static void main(String[] args) {
Date d=new Date();//编译报错
}
}
修改:
public class Main {
public static void main(String[] args) {
java.util.Date d1=new java.util.Date();
java.sql.Date d2=new java.sql.Date(1000);
}
}
2. 访问权限修饰符
修饰符 | 同一个类中 | 同一个包中(子类和无关类) | 不同包(子类) | 不同包(无关类) |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default(默认权限、包访问权限) | √ | √ | × | × |
public | √ | × | × | × |
- 使用关键字 public,就意味着紧随 public 后声明的成员对于每个人都是可用的
- 关键字 private 意味着除了包含该成员的类,其他任何类都无法访问这个成员(使用private修饰构造器,则外部类不能new出该类的对象—单例模式)
- 默认的包访问权限(default)通常提供了足够的隐藏措施, 使用类的客户端程序员无法访问包访问权限成员
- 继承的类既可以访问 public 成员,也可以访问 protected 成员
在一个具有包访问权限的类中定义一个 public 的构造器并不能真的使这个构造器成为 public,在声明的时候就应该标记为编译时错误
3. 类访问权限
- 每个编译单元(即每个文件)中只能有一个 public 类。这表示,每个编译单元有一个公共的接口用 public 类表示。该接口可以包含许多支持包访问权限的类。一旦一个编译单元中出现一个以上的 public 类,编译就会报错
- public 类的名称必须与含有该编译单元的文件名相同,包括大小写。所以对于 Widget 来说,文件名必须是 Widget.java,不能是 widget.java 或WIDGET.java。再次强调,如果名字不匹配,编译器会报错
- 虽然不是很常见,但是编译单元内没有 public 类也是可能的。这时可以随意命名文件
- 类既不能是 private 的(这样除了该类自身,任何类都不能访问它),也不能是 protected(a包中有一个类A, b包中有一个类B类,B类要想成为A类的子类首先要访问到A类,但是访问A类的前提是成为A类的子类,因此是矛盾的。如果B类也在a包下,使用protected修饰是多余的,效果和default修饰一样) 的。所以对于类的访问权限只有两种选择:包访问权限或者 public