包访问级别 class

Package access level to class

class 在没有访问说明符的情况下的访问范围是什么? 例如:

package com.foo.bar;

class MyFoo{
     // All Class definition
}

我知道这样的class被称为package class,与public class相反。所以我的问题是我们可以从哪里访问和使用这样的 class(因为它们似乎无法从任何地方访问)。我可以从同一个包的另一个 public class 访问它吗? 例如:

package com.foo.bar;

public class MyBar{
    MyFoo foo; // Compiler throwing and error at this line
    // Rest of definition
}

我问过 google 但没有得到回复。

这意味着 class 可用于 相同包 的元素。 您绝对可以通过 import 语句访问它,因为您无法从任何地方直接访问它( 意味着无需导入 ),就像您可以使用 public class。您必须添加 import 语句。

import pack1.pack2.MyClass;

你的第一个 class 是 package-private 这意味着它对同一包中的其他 class 是可见的,所以你的例子应该编译。这里是 the canonical tutorial link on Java access rules.

当class在同一个包中时,import ...应该不是 import ...

错误是什么?

干杯,

来自 Java™ 教程 Controlling Access to Members of a Class

… If a class has no modifier (the default, also known as package-private), it is visible only within its own package (packages are named groups of related classes — you will learn about them in a later lesson.)

限制(如果不能避免的话)客户端 类 使用具体 类 并依赖于接口通常是至关重要的。 事实上,这种对具体 类 的依赖使得客户端代码在引入新的同类新具体 类(实现相同的接口)时变得脆弱。

客户端类将只声明变量或集合或接口类型的方法,因此依赖于多态方法。 那么具体 类 可以是 package-private(但请参阅下面关于实例化的要点),因为客户端 类 只需要通常是public。 声明一组 package-private 具体 类 的优点是它有助于防止向它们引入粗心的依赖关系。

然而,一个问题是关于创建具体 类 的实例,因为 new 运算符不是多态的。 因此需要依赖复杂的方法(依赖注入、原型或某些工厂等创建模式,涉及的工具如 Spring 或 Guice ...)。即便如此,包级别的可见性可能过于严格,无法方便地应用这些实例化方法。