【问题标题】:How do you #include files in java?你如何在java中#include文件?
【发布时间】:2011-12-05 23:16:54
【问题描述】:

来自 C++ 环境,我习惯于将我需要的许多函数拆分到 funcs.h 文件中,然后执行 #include "funcs.h",然后将函数原型添加到主 .cpp 文件中。现在我开始使用 java(主要是 minecraft ModloeaderMp),我已经制作了一个 funcs.java 文件,其中有一些预制功能(例如一些用于文件复制的功能,提供项目堆栈等)。既然我已经在使用语句Public class mod_mine extends BaseModMp,有没有办法可以导入函数,或者我可以再做一个Public class mod_mine extends funcs吗?

【问题讨论】:

  • C++ 知识不会直接转移到 Java,即使它们相似。确实有许多陷阱和许多不同的方法。有大量专门针对习惯 C++ 的人的教程,但请尝试使用谷歌搜索 java for c++ programmers

标签: java include


【解决方案1】:

在 Java 中你不是 #include,你是 import package.Class。从 Java 6(或者它是 5?)开始,您还可以import static package.Class.staticMethodOfClass,这将实现您想要做的某些形式。

另外,正如@duffymo 所指出的,import 只会使您免于系统地在导入的类名前加上包名,或在导入的静态方法名前加上包名和类名。实际的 #include 语义在 Java 中根本不存在。

也就是说,拥有一个“funcs.java”文件在我看来就像你开始涉足一些反模式......你应该远离这些。

【讨论】:

  • Nitpick:它是 import static package.Class.staticMethodOfClass,如果您忽略静态,它将无法构建。
  • 谢谢,这很有用。
  • import 与 C++ 中的 #include 完全不同。导入所做的只是让您键入 Baz 而不是 foo.bar.Baz。这是一个按键节省设备,仅此而已。
  • @duffymo 我并不是暗示它与包含相同,我可能应该更清楚地说明它。我的核心观点是静态导入,这似乎是 OP 寻找的 - 不知何故。
  • 是的,你应该这样做。我读了它说它是完全等价的。不要担心 OP 正在寻找什么;确保答案正确。
【解决方案2】:

Java 中没有#include

我不希望有一个 funcs.java 存储所有变量的设计。对象是封装在单个组件中的状态和行为。如果你这样做,你就不是在以面向对象的方式进行设计。

好名字很重要。扩展 Stuff2 的名为 Stuff 的类最好只是一个糟糕的例子。

这不是好的 Java。我也不认为它是好的 C++。

【讨论】:

  • 好的,funcs.java 只包含我经常使用的函数,而不是变量。 Stuff 和 Stuff2 只是虚拟示例。我的意思是我已经在做一个类扩展,所以我想知道我是否可以再做一次。
  • 如果代码在 similar 类之间是通用的,那么创建一个基类并将方法放在那里是有意义的。这并不意味着您应该为单个类中可能拥有的任何有用的泛型方法创建一个库并始终对其进行扩展。您可以根据需要多次扩展一个类,也可以扩展一个扩展类,但不能扩展多个类(仅限接口,您使用 implement 而不是 extend)。
  • Java 只支持实现的单一继承,但您可以实现任意数量的接口。我不知道“可以再做一次”是什么意思。听起来您需要阅读大量基本的 Java。
【解决方案3】:

Java 是一种面向对象的编程语言,这是有原因的。

java中没有#include,虽然你可以从其他包中导入类。 使单独的类 func.java 来存储变量可能不是一个好主意,除非它们都是常量。 通过扩展某些类,您可以重用该功能。但是扩展类是否通过了 IS A 测试,如果不是,这可能是个坏主意。

如果从 C++ 迁移,阅读一些好书,例如 Head First java 可能会有很大帮助。

【讨论】:

  • C++ 也是面向对象的;这只是每种语言的糟糕设计。
  • @dyffymo 同意...只是这么说是因为 C++ 也支持没有面向对象方法的编程,而 java 不支持。
【解决方案4】:

听起来您将所有方法放在同一个类中。您应该将它们分开:

实用类

这些应该包含静态方法,例如获取文件内容、显示对话框屏幕或将两个数字相加。它们并不真正属于对象类,它们不需要实例,并且它们在整个程序中被广泛使用。请参阅 java.lang.Math 以获得一个很好的例子。

常量类或配置文件

这可以是包含static final 成员的Constants 类,例如PI = 3.1415。您可以使用Constants.PI 访问它们。

或者,您可以使用配置文件并将它们加载到Configuration 并使用类似config.get("database") 的方式访问配置变量

其他

如果您的代码不适合其中任何一个,您需要将其放入某个类中,以便您的代码适合 object-oriented programming concepts。从您的问题来看,听起来您需要阅读此内容。我会先阅读Head First Java,然后可能会阅读object-oriented programming in Java 上的其他书籍。之后,我会看一些design patterns

【讨论】:

    【解决方案5】:

    java 中没有#include。您可以使用 import 语句使类和接口在您的文件中可用。

    【讨论】:

      【解决方案6】:

      实际上...有一种方法可以具有与 C 的 #include 相同的语义(该关键字后来被 C++ 借用,以看起来更花哨...)。它只是没有用相同的词定义,但它完全符合您的要求。

      首先,让我们看看你用 C++ 中的#include 做了什么来理解这个问题:

      • 包括#defines
      • “转发”函数定义(它们的“主体”在其他地方定义,在类实现中,如果您还记得 Turbo Pascal,您就会明白我的意思),
      • 定义结构,

      差不多就是这样。

      对于结构定义,没有意义,那是老式的 C:在 C++ 中,您已经很久没有定义 struct {},而是使用属性和访问器方法定义 class 结构,在 Java 中也是如此:这里也没有typedef struct {}

      为此,您有“接口”声明,请参阅https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html

      它完全符合您的要求:

          public interface MyDefines {
              final CHAR_SPACE : ' ';               // ugly #define
              int detectSpace(FileInputStream fis); // function declaration
              // and so on
          }
      

      然后,使用:

          public class MyClass extends MyAncestor implements MyDefines {
              ...
              // implementation of detectSpace()
              int detectSpace(FileInputStream fis) {
                  int ret = 0;
                  char Car;
                  if((Car = fis.read()) != -1) && (Car == CHAR_SPACE)) ret++;
                  ...
              }
      

      阅读上面给出的链接,里面有很多有用的案例。

      【讨论】:

        【解决方案7】:

        您可以在 Java 文件上运行 C 预处理器,确保使用 -P 标志来禁用行注释。快速的 Google 搜索确认这已经尝试了至少两次,甚至在流行的 fastutil 库中使用:

        这适用于所有指令(#include、#define、#ifdef 等),并且在语法和语义上都与 C/C++ 中的等效语句相同。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-02
          • 2016-03-08
          • 1970-01-01
          • 1970-01-01
          • 2016-02-27
          • 2015-01-17
          相关资源
          最近更新 更多