Java中的声明和定义有什么区别?

2022-08-31 11:51:09

我对这两个术语感到非常困惑。我检查了stackoverflow,C++有一个类似的问题,但不是java。

有人可以解释java的两个术语之间的区别吗?


答案 1

概念上的区别很简单:

  • 声明:您正在声明某些内容存在,例如类、函数或变量。你没有说任何关于这个类或函数是什么样子的,你只是说它存在。

  • 定义:你定义一些东西是如何实现的,比如一个类、一个函数或变量,也就是说,你说出它到底是什么

在Java中,两者之间几乎没有区别,正式地说,声明不仅包括标识符,还包括它的定义。以下是我个人对这些术语的详细解释:

  • :Java并不像C++那样真正分离声明和定义(在头文件和cpp文件中)。您可以在声明它们时定义它们。

  • 函数:当你编写一个接口(或一个抽象类)时,你可以说你正在声明一个函数,而不定义它。但是,普通函数始终在声明它们的位置定义。如果您愿意,请参阅函数的主体作为其定义。

  • 变量:变量声明可能如下所示:

      int x;
    

(您正在声明变量存在并且具有类型 ),如果它是局部变量或成员字段。在Java中,除了它可能要包含的值之外,没有关于定义的信息,这些值由对它的赋值决定。xintx

以下是我如何使用这些术语的粗略摘要:

abstract class SomeClass {                // class decl.
                                          //                           \
    int x;                                // variable decl.            |
                                          //                           |
    public abstract void someMethod();    // function decl.            |
                                          //                           |
    public int someOtherMethod() {        // function decl.            |
                                          //                           | class
        if (Math.random() > .5)           // \                         | def.
            return x;                     //  |  function definition   |
        else                              //  |                        |
            return -x;                    // /                         |
                                          //                           |
    }                                     //                           |
}                                         //                          /

答案 2

Java语言规范广泛地指定并使用术语“声明”,但它不使用“定义”,除非作为一个普通的英语单词。

我的证据表明,术语“声明”在JLS目录索引中多次出现。相比之下,“定义”一词也没有出现在其中。

因此,当你看到有人在Java的上下文中使用“定义”这个词时,他们要么是在非技术意义上使用它,要么是他们的术语草率。

在后一种情况下,它们的含义可能与技术术语“声明”相同,或者它们可能意味着其他含义。如果他们的意思是别的,你需要问他们他们是什么意思。如果他们定义了它...很公平,但它不是标准术语。


声明“定义”是指变量初始化点的答案是特别不支持的......在Java的上下文中。在Java中,变量的初始化要么发生在声明点,要么在以后的赋值中发生。在后一种情况下,没有使用特殊术语...或需要...除了分配和/或初始化。没有为变量分配存储的指定点。实际上,变量本身的空间很可能在到达声明之前分配。


在JLS规范的Java中不使用“定义”术语的原因是不需要它。

  • 由于Java允许成员以任何顺序声明,因此不需要“前向声明”。这就是有必要区分这两个概念的背景。
  • 在 Java 中,变量所需的堆栈空间是编译时常量,因此堆栈偏移计算在编译时进行。(请记住,在Java中,数组是对堆对象的引用...并且只有引用保存在堆栈帧中。
  • Java 处理字段或变量的“不初始化定义”的方式不需要单个“声明”点。如果需要初始化变量,则可能会在源代码中的多个点发生。

(在Java中,他们可能使用声明与定义的唯一地方是在抽象方法中。除了如果他们这样做了,他们将不得不参考常规方法声明作为定义......为了保持一致性...那会令人困惑。所以他们只是将“抽象”子案例称为抽象方法的声明。

C和C++以不同的方式处理这些事情,因此在其技术描述中确实需要不同的“声明”和“定义”术语。我对“太阳术语表”定义的看法是,它们是以C / C++为中心的。


推荐