引用类型的可见性由访问权限控制符决定,指能否在某位置合法使用该类型;public全局可引用,默认仅同包可引用,private/protected不可修饰顶层类,类型可见性与成员可见性相互独立。

引用类型的可见性,本质上是由访问权限控制符决定的——它不是指“能不能看到这个类型的名字”,而是指“能不能在某个位置合法地使用这个类型(声明变量、创建实例、继承、访问成员)”。关键不在类型本身是否存在,而在编译器是否允许你在当前上下文中引用它。
public:全局可引用
被 public 修饰的类、接口或枚举,只要导入了对应包,任何其他类都可以直接引用。例如:java.util.ArrayList 是 public 类,所以你在任意包里写 ArrayList<String> list = new ArrayList<>(); 都能通过编译。
注意:一个源文件中最多只能有一个 public 类,且文件名必须与之完全一致。
默认(包级):仅限同包引用
没有加任何修饰符的类,默认具有包级可见性。它只能被同一个包下的其他类引用。比如你在 com.example.utils 包里定义了一个 StringUtils 类,不加修饰符,那么只有同属 com.example.utils 的类才能声明 StringUtils s = new StringUtils();。
这种限制天然支持模块内协作,也防止外部随意依赖内部实现类。
private / protected 不能修饰顶层类
Java 中,private 和 protected 不能用来修饰普通顶层类(即和文件同名的主类)。它们只适用于内部类:
- private 内部类:只能被其外部类访问,连同包的其他类也不行;
- protected 内部类:可被外部类、同包类、以及外部类的子类(即使跨包)引用。
这说明:引用类型的可见性,不仅取决于类型自身修饰符,还受嵌套层级和继承关系影响。
引用成员时,还要看成员自身的访问符
即使你能成功引用一个类(比如它是 public 的),也不代表你能任意访问它的字段或方法。例如:
-
String是 public 类,但它的内部字段如value是 private 的,你无法写str.value; -
ArrayList的elementData字段是 default(包私有),所以你在自己包里也不能直接访问它,哪怕你继承了ArrayList—— 因为protected才对子类开放跨包访问,而 default 不行。
也就是说,类型可见 ≠ 成员可见;两者由各自声明处的访问控制符独立决定。

















