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


81

我对这两个词感到非常困惑。我检查了stackoverflow,对于C ++有一个类似的问题,但对于Java没有。

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


2
声明是最低要求,因此其他代码可以调用或引用它。当您编译其他代码时,这是您的最低要求。做某件事需要定义,它只需要编译一次(每个调用者不必编译)
Peter Lawrey

1
可通过以下方式记忆:定界,fin =结束,“完成”;de-clare,clarus = clear,“使其清晰”。声明明确了存在,类型和名称。定义是“实际工作”代码,之后您可以“结束讨论”。它们与语言无关,因此您的问题是Java对这些一般概念的使用。
n611x007 2014年

Answers:


99

概念上的区别很简单:

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

  • 定义:您定义某种事物的实现方式,例如类,函数或变量,即您说的实际的东西。

在Java中,两者之间几乎没有什么区别,从形式上来说,声明不仅包括标识符,还包括其定义。这是我个人详细解释这些术语的方式:

  • :Java并没有像C / C ++那样将声明和定义真正分开(在标头和cpp文件中)。您在声明它们的位置定义它们。

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

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

    int x;
    

    (您声明一个变量x存在并且具有type 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;                    // /                         |
                                          //                           |
    }                                     //                           |
}                                         //                          /

不幸的是,JLS不支持此功能。根据JLS,类声明包含类的主体。方法和构造函数也是如此。
史蒂芬C

对。从形式上来看,我完全同意您的意见(抽象/接口方法除外)。
aioobe

我相信这也适用于javascript,对吗?也许应该添加一个JS标签。
格里芬

根据代码中的标识符javac,类声明似乎是类定义的同义词。考虑一下public void visitClassDef(JCClassDecl tree)
aioobe 2014年

@格里芬-好主意。问题特别是关于Java的。
Stephen C

28

Java语言规范广泛地指定和使用了术语“声明”,但是除作为常规英语单词外,它不使用“定义”。

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

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

在后一种情况下,它们可能与技术术语“声明”具有相同的含义,或者可能具有其他含义。如果它们还有其他含义,则需要询问他们的含义。如果他们已经定义了它……足够公平,但这不是标准术语。


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


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

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

(在Java中,他们可能使用声明或定义的唯一位置是抽象方法。除非这样做了,否则必须将常规方法声明作为定义使用...以获得一致性...并且因此,他们只是将“抽象”子案例称为抽象方法的声明。)

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


6

Sun词汇表的定义中:

声明: 一种声明,用于建立标识符并将其与属性相关联,而不必保留其存储(用于数据)或提供实现(用于方法)。

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

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

List i;              // declaration - variable on the stack  
i = new ArrayList(); // definition - gives variable a reference

4
1)JLS不使用术语“定义”来描述第二条语句。从句法上讲,这是一项任务。语义上被描述为“初始化”变量。2)第二条语句不是声明,因此它不能是定义... “ definition:...的声明”。3)链接已断开...
Stephen C

我建议进行修改以修复链接。问题和答案未提及JLS。
马修·

4

1.声明表示创建一个primitive or Object reference variable,但没有分别分配值或对象。

例如:

          int x;   // declaration of x of type int

          Cat myCat;  //  declaration of myCat an Object of type Cat

2.定义是当我们为它们分配值或对象时。

         int x = 5;

         Cat myCat = new Cat();

3.如果是方法,则如下所示...

public abstract void go();       // Method Declaration (Abstract method)

   public void go(){               // Method Defination

            // Your code      

    }

1
JLS不支持此术语。
斯蒂芬·C

1
@Kumar Vivek Mitra-如果定义为“ int x = 5”,那么定义和初始化之间有什么区别?
可汗

@SSK初始化是确定性的,反之亦然.....您的询问似乎是一个很大的挑战,而不是消除您的疑问...所以下一次,请务必添加“请”
Kumar Vivek Mitra 2012年

是的...请参阅Kathy Sierra和Bert Bates撰写的Head First Java系列
Kumar Vivek Mitra,2012年

2

我想我可以更好地解释这个问题,例如:

考虑以下情形:

您的公司中有一个空缺的软件工程师职位。这意味着您将选择担任该职位的人员将是软件工程师(您不能为此职位选择营销人员)。因此,创建此帖子类似于声明。

现在,当您定义此职位的人可以/不能做什么,他拥有的权限,他的限制是什么时,这就是定义。

所以说

SoftwareEngineer se;

指声明;

class SoftwareEngineer {

// define role and responsibilities
}

表示定义。希望对您有帮助。


2

Java 语言仅定义术语声明而不使用定义。

宣言:

class A{}// class declaration

String str;// variable declaration

0

声明:一种声明,用于建立标识符并将其与属性相关联,而不必保留其存储(用于数据)或提供实现(用于方法)。

         or

         1. Declaration means creating a primitive or Object reference variable, 
         but with no assignment of value or object respectively..

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

        or

         Defination is when we assign values or Object to them.

**Ex:** 
List i;              // declaration - variable on the stack  
i = new ArrayList(); // definition - gives variable a reference

-1
  1. 对于对象或图元

声明:指定对象或原语的类型

定义:指定对象或基元的

  1. 对于方法

声明:指定方法的签名

定义:指定方法的实现

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.