繁体   English   中英

一个Java类/文件可以属于多个包吗?

[英]Can one java class/file be part of more than one package?

我是Java的相对入门者,我只是在学习软件包和访问限制,因此我想知道是否可能有一个Java类属于多个软件包。 我不是说分包。

不,不可能。

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

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

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

在此处阅读有关软件包的更多信息

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

从技术上讲,您可以在两个不同的包中拥有一个具有相同内容的同一个类,但是,当您在另一个Java类中使用这两个类时,则在使用任何一个类时都必须非常明确(包的绝对名称)。

让我举个例子吧 ...

这是Testing类,具有完全相同的成员,但在两个不同的包(即com.overflow.stackcom.stack.overflow

当它们在另一个Test类中使用时,您必须同时导入这两个类,并为Testing类中的至少一个使用绝对包名,以便Java编译器了解哪个实例是哪个类(或者,您可以对两个实例使用绝对包名。测试类实例)。

-

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 ,这很难调试并且可能使应用程序崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM