一个java类/文件可以成为多个包的一部分吗?

时间:2017-08-24 02:43:17

标签: java class packages

我是Java的初学者,我刚刚学习了包和访问限制,所以我想知道是否有可能让一个Java类属于多个包。 我不是指子包。

4 个答案:

答案 0 :(得分:0)

不,它不可能。

但是在不同的包中可以有相同名称的类,但在同一个包中没有两个类似命名的类。

答案 1 :(得分:0)

您不能将包声明两次放在同一个类中。 package语句必须是源文件中的第一行。每个源文件中只能有一个package语句,它适用于文件中的所有类型。

但是,您可以在两个包中定义相同的类 - 相同的名称甚至相同的实现,但包名称必须不同。

详细了解包here

答案 2 :(得分:0)

您可以在其他包中声明具有相同名称的类。 这不是设计应用程序的最佳实践。

答案 3 :(得分:0)

从技术上讲,你可以在两个不同的包中拥有相同内容,但是当你在另一个Java类中使用这两个类时,那么在使用任何一个类时你必须非常具体(绝对包名)。 / p>

让我举个例子......

这是类Testing,它具有完全相同的成员,但是在两个不同的包中定义,即com.overflow.stackcom.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难以调试并导致应用程序崩溃。