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

时间:2012-07-30 04:41:59

标签: java

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

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

8 个答案:

答案 0 :(得分:87)

概念上的区别很简单:

  • 声明:您声明存在某些内容,例如类,函数或变量。你没有说出那个那个类或函数的样子,你只是说它存在。

  • 定义:您定义如何实现某些内容,例如类,函数或变量,即您说是什么它实际上是。

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

  • :Java并没有像C / C ++那样真正地分隔声明和定义(在header和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;                    // /                         |
                                          //                           |
    }                                     //                           |
}                                         //                          /

答案 1 :(得分:24)

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

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

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

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


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


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

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

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

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

答案 2 :(得分:5)

来自Sun glossary's定义:

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

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

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

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

答案 3 :(得分:3)

<强> 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. 如果是Method,就像这样......

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

   public void go(){               // Method Defination

            // Your code      

    }

答案 4 :(得分:2)

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

考虑以下情况:

贵公司的软件工程师有一个新的空缺职位。这意味着您选择填补此职位的人将是一名软件工程师,(您不能选择营销人员为此后)。因此,创建此帖子与声明类似。

现在,当你定义这篇文章的人能够/不能做什么,他有什么权限,他的局限是什么时,这就叫做定义。

所以说

SoftwareEngineer se;

表示声明;

class SoftwareEngineer {

// define role and responsibilities
}

表示定义。 希望它可以帮到你。

答案 5 :(得分:1)

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

声明:

class A{}// class declaration

String str;// variable declaration

答案 6 :(得分:0)

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

         or

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

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

        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

答案 7 :(得分:-1)

  1. 对于对象或图元

声明:指定对象或基本体的类型

定义:指定对象或基元的

  1. 对于方法

声明:指定方法的签名

定义:指定方法的实现