【问题标题】:Java Packages - refer to a class from a different packageJava 包 - 引用来自不同包的类
【发布时间】:2013-01-13 14:29:32
【问题描述】:

在(默认包)中,我有一个名为“Bird”的类,它有一个名为“dialog”的方法。

我可以在同一个包中创建一个名为 Class1 的类,如下所示:

public class Class1
{
    public static void main(String[] args) 
    {
        Bird b = new Bird("Alexander",true,5);
        b.dialog("tweet!");
    }
}

这确实有效,我实际上可以在控制台中看到tweet!

我的问题是:如果Class1 位于包Fundamental 中(而类Bird 位于“默认包”中),我需要在代码中添加什么? 我收到一个错误:在这种情况下“无法识别鸟类类型”。我可能应该以某种方式指出包裹。

附带问题: 1. 什么是类路径以及如何更改它?我已经看到这个术语在几个与包相关的讨论中被模糊地使用,但没有一个像我刚刚给出的那样有明确的例子。 2. 我多次看到名为 xxx.bla.zzz 的包——这是标准吗?我通常只使用一个通用名称(不是三个用 . 分隔的名称) 我了解包是 Java 替代其他语言的名称空间。如果有几个值得一提的解决方案解决方案,我将不胜感激。谢谢!

【问题讨论】:

  • 停止使用默认包。您必须导入该类或使用该类的完整包名。将 Bird 类移动到 com.blammy 包中,并在 Class1 中添加“import com.blammy.Bird”或在 Class1 中将其引用为 com.blammy.Bird
  • 谢谢戴夫,我检查了你的第一个链接,它类似于我发现不清楚的其他讨论。在我看来,它看起来非常正式且过于理论化。为什么我需要这样的命令行: java -classpath D:\myprogram;D:\myprogram\lib\supportLib.jar org.mypackage.HelloWorld ?为什么不直接在 Class1 中指出我从包 x 中调用类 Bird。如果在一个项目中我有很多这样的事件,我是否将项目搁置并分段运行并停止插入命令行,然后恢复其余的类,等等?
  • 我可能在一个复杂的项目中有 20 个不同的包。我刚刚意识到我还没有测试过如果 Class1 位于主包内的包中会发生什么,甚至还有嵌套包的概念。
  • 非常感谢 DwB,正是我想要的!

标签: java package


【解决方案1】:

你不应该使用默认包,这不是一个好习惯,你不能从默认包中导入类。始终声明您的包结构。

在类Bird的第一行添加:

package animals;

在 Class1.java 的第一行写下你的包名

package foo;

import animals.Bird;

请注意,要使其正常工作,Bird 类和 Class1 类应分别位于文件夹“animals”和文件夹“foo”中

【讨论】:

  • 非常感谢 fmsf 和 Peter!这就是我一直在寻找的。我不知道彼得,我实际上希望有人会触及默认与生成包的情况,因为我很好奇如何引用一个显然没有名称的包(默认包)。很棒的提示,而且我需要的很简单。谢谢。
【解决方案2】:

根据 JLS(第 7.5 章。导入声明 http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.5)无法从默认(未命名)包导入

未命名包中的类型(第 7.4.2 节)没有规范名称,因此每种导入声明中对规范名称的要求意味着(a)无法导入未命名包中的类型, (b) 无法导入未命名包中类型的静态成员。因此,第 7.5.1 节、第 7.5.2 节、第 7.5.3 节和第 7.5.4 节都要求在尝试在未命名的包中导入类型(或其静态成员)时出现编译时错误。 em>

【讨论】:

    【解决方案3】:

    目前提供的解决方案很有帮助,但如果您使用的是 NetBeans,则解决问题要简单得多。转到项目右键单击并选择打开新包。 NetBeans 为您提供了一个用于创建新包的对话框。这就是诀窍所​​在,注意:确保您的新项目名称不以与其他包相同的名称开头,以便新包将被唯一标识。例如,给新包一个不同的名称

    newPackage;
    

    然后您可以在您希望在其中使用包的类文件上使用 import 语句:

    import newPackage.SecondClass;
    

    其实可以使用代码补全 ctr + spaceBar 来保证包的清晰可见。

    我希望这很简单。 check out this screenshot

    【讨论】:

      猜你喜欢
      • 2013-11-16
      • 1970-01-01
      • 2023-03-28
      • 2010-10-06
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      相关资源
      最近更新 更多