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

Ala*_*an2 72 java

我对这两个术语感到很困惑.我检查了stackoverflow,对于C++有一个类似的问题,但对于java则没有.

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

aio*_*obe 89

概念上的区别很简单:

  • 声明:您声明存在某些内容,例如类,函数或变量.你不说任何事情什么是类或函数的样子,你刚才说,它的存在.

  • 定义:您定义的东西是如何实现的,如类,函数或变量,也就是你说的是什么,它实际上是.

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

  • :Java并不像C/C++那样真正地分隔声明和定义(在头文件和cpp文件中).您可以在声明它们的位置定义它们.

  • 函数:当您编写接口(或抽象类)时,您可以说您正在声明一个函数,而不是定义它.但是,普通函数总是在声明它们的地方定义.如果您愿意,请将函数体看作其定义.

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

    int x;
    
    Run Code Online (Sandbox Code Playgroud)

    (如果它是局部变量或成员字段,则表示变量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;                    // /                         |
                                          //                           |
    }                                     //                           |
}                                         //                          /
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,JLS 不支持这一点。根据 JLS,类声明包括类的主体。这同样适用于方法和构造函数。 (2认同)

Ste*_*n C 25

Java语言规范广泛地指定和使用术语"声明",但除了作为普通英语单词之外,它不使用"定义".

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

因此,当您看到有人在Java的上下文中使用"定义"一词时,他们要么是在非技术意义上使用它,要么是他们的术语草率.

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


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


JLS规范中Java中未使用"定义"术语的原因是它不需要.

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

(Java中唯一可能使用声明与定义的地方是抽象方法.除非他们已经完成,否则必须将常规方法声明作为定义引用...以保持一致性......会让人感到困惑.所以他们只是将"抽象"子句称为抽象方法的声明.)

C和C++不同的方式处理这些事情,因此需要独特的"宣言",并在其技术说明"定义"条款.我对"太阳词汇表"定义的看法是它们是C/C++中心的.


Jai*_*dra 5

来自Sun词汇表的定义:

声明: 建立标识符并将属性与其关联的语句,无需保留其存储(用于数据)或提供实现(用于方法).

定义: 保留存储(用于数据)或提供实现(用于方法)的声明.

我阅读Sun词汇表的方式如下:

List i;              // declaration - variable on the stack  
i = new ArrayList(); // definition - gives variable a reference
Run Code Online (Sandbox Code Playgroud)

  • 1)JLS不使用术语"定义"来描述第二个陈述.从语法上讲,它是一个赋值.从语义上讲,它被描述为"初始化"变量.2)第二个陈述不是声明,因此它不能是一个定义......*"定义:声明......"*.3)链接坏了...... (2认同)