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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (1)
  • 查看 (350)

这两个术语之间我很困惑。我检查了stackoverflow,C ++有类似的问题,但不是java。

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

提问于
用户回答回答于

概念上的差异很简单:

  • 声明:你声明存在某些东西,例如类,函数或变量。你不说任何事情什么是类或函数的样子,你刚才说,它的存在。
  • 定义:你定义了如何实现某些东西,比如类,函数或变量,也就是说你说的实际的东西。

在Java中,两者之间几乎没有什么区别,并且从形式上讲,声明不仅包含标识符,还包括定义。以下是我个人详细解释条款的方式:

  • :Java并没有像C / C ++那样真正地分离声明和定义(在头文件和cpp文件中)。你在声明它们的地方定义它们。
  • 函数:当你编写一个接口(或一个抽象类)时,你可以说你声明了一个函数,而不需要定义它。然而,普通函数总是在声明的地方被定义。如果您喜欢,请参阅函数的主体作为其定义。
  • 变量:变量声明可能如下所示: int x; (你声明变量x存在并且有类型int),如果它是一个局部变量或成员字段。在Java中,除了可能x需要定义的值之外,没有可定义的信息,这些值由其赋值决定。

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

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;                    // /                         |
                                          //                           |
    }                                     //                           |
}                                         //                          /
用户回答回答于

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

我的证据是,“声明”一词在JLS目录和索引中出现过很多次,但“定义”一词也没有出现。

所以,当你看到有人在Java语境中使用“定义”一词时,他们要么以非技术意义使用它,要么在他们的术语中sl sl不驯。

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

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

JLS规范中没有使用“声明”术语的原因在于它不是必需的。

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

(Java中唯一可以使用声明和定义的地方是抽象方法,除了如果他们已经完成了,那么就必须将常规方法声明称为定义...以保持一致性......并且会令人困惑,因此他们只是将抽象子表达式称为抽象方法的声明。)

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

扫码关注云+社区