我是Java的初学者,我刚刚学习了包和访问限制,所以我想知道是否有可能让一个Java类属于多个包。 我不是指子包。
答案 0 :(得分:0)
不,它不可能。
但是在不同的包中可以有相同名称的类,但在同一个包中没有两个类似命名的类。
答案 1 :(得分:0)
您不能将包声明两次放在同一个类中。 package语句必须是源文件中的第一行。每个源文件中只能有一个package语句,它适用于文件中的所有类型。
但是,您可以在两个包中定义相同的类 - 相同的名称甚至相同的实现,但包名称必须不同。
详细了解包here
答案 2 :(得分:0)
您可以在其他包中声明具有相同名称的类。 这不是设计应用程序的最佳实践。
答案 3 :(得分:0)
从技术上讲,你可以在两个不同的包中拥有相同内容,但是当你在另一个Java类中使用这两个类时,那么在使用任何一个类时你必须非常具体(绝对包名)。 / p>
让我举个例子......
这是类Testing
,它具有完全相同的成员,但是在两个不同的包中定义,即com.overflow.stack
和com.stack.overflow
。
当它们在另一个类Test
中使用时,您必须导入它们并对Testing
类中的至少一个使用绝对包名称,以便Java编译器了解哪个实例是哪个class(或者您可以对Testing类实例使用绝对包名称。)
-
package com.overflow.stack;
public class Testing {
public void whoAmI() {
System.out.println(this.getClass().getCanonicalName());
}
}
-
package com.stack.overflow;
public class Testing {
public void whoAmI() {
System.out.println(this.getClass().getCanonicalName());
}
}
-
package com.stackoverflow;
import com.overflow.stack.Testing;
public class Test {
public static void main(String[] args) {
// not using absolute package name
Testing test1 = new Testing();
test1.whoAmI();
// must use absolute package name if want to use Testing class
// from different package then above.
com.stack.overflow.Testing test2 = new com.stack.overflow.Testing();
test2.whoAmI();
}
}
示例运行:
com.overflow.stack.Testing
com.stack.overflow.Testing
话虽如此,如果您或您的团队或组织是此类的作者,那么您应该避免在不同的包中复制类,因为这会导致冗余的代码重复,并且对于这些类的使用者来说会非常混乱。此外,这些副本很可能会失去同步,并可能导致RuntimeException
难以调试并导致应用程序崩溃。