1

没有访问说明符定义的类的访问范围是什么?例如:

package com.foo.bar;

class MyFoo{
     // All Class definition
}

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

package com.foo.bar;

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

我已经问过谷歌,但无法从那里得到回复。

4

4 回答 4

1

这意味着该类可用于同一包的元素。您绝对可以通过import语句访问它,因为您不能直接从任何地方访问它(意味着没有导入),就像您可以使用public class.You 一样。您必须添加import语句。

import pack1.pack2.MyClass;
于 2015-01-12T14:22:55.010 回答
1

您的第一个类是包私有的,这意味着它对同一包中的其他类可见,因此您的示例应该全部编译。这是有关 Java 访问规则的规范教程链接

当类在同一个包中时,应该没有必要!import ...

有什么错误?

干杯,

于 2015-01-12T14:23:21.700 回答
0

来自控制对类成员的访问的 Java™ 教程

... 如果一个类没有修饰符(默认值,也称为包私有),则它仅在其自己的包中可见(包被命名为相关类的组 - 您将在后面的课程中了解它们。)

于 2015-01-12T14:32:37.840 回答
0

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

客户端类只会声明使用接口类型化的变量或集合或方法,因此依赖于多态方法。然后具体类可以是包私有的(但请参阅下面的实例化点),因为客户端类只需要通常是公共的接口。声明一组包私有的具体类的好处是它有助于防止向它们引入粗心的依赖关系。

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

于 2018-10-16T15:26:48.583 回答