【问题标题】:Package access level to class包对类的访问级别
【发布时间】:2015-01-12 14:19:10
【问题描述】:

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

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
}

我已经问过谷歌,但没有得到回复。

【问题讨论】:

  • 你导入了类吗?什么错误?
  • 知道了。正如Task在回答中提到的那样,我缺少导入语句。因此编译器抛出一个错误说cannot find symbol class MyFoo

标签: java access-modifiers


【解决方案1】:

这意味着该类可用于同一个包的元素。 您完全可以通过 import 语句访问它,因为您无法直接从任何地方访问它(意味着不导入),就像您可以使用 public class 那样。您必须添加import声明。

import pack1.pack2.MyClass;

【讨论】:

    【解决方案2】:

    您的第一个类是 package-private,这意味着它对同一包中的其他类可见,因此您的示例应该全部编译。这里是the canonical tutorial link on Java access rules

    当类在同一个包中时,应该不需要import ...

    什么错误?

    干杯,

    【讨论】:

    • 我认为你的意思是导入而不是包含
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        相关资源
        最近更新 更多