在没有访问说明符的情况下定义类的访问范围是什么? 例如:
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
}
我问谷歌但是没有得到回复。
答案 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 ...))。即使这样,程序包级别的可见性仍然过于严格,无法方便地应用这些实例化方法。