打包到类的访问级别

时间:2015-01-12 14:19:10

标签: java access-modifiers

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

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 个答案:

答案 0 :(得分:1)

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

import pack1.pack2.MyClass;

答案 1 :(得分:1)

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

当类在同一个包中时,import ...

错误是什么?

干杯,

答案 2 :(得分:0)

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

  

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

答案 3 :(得分:0)

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

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

但是

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