84

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

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

4

7 回答 7

106

概念上的区别很简单:

  • 声明:您声明存在某些东西,例如类、函数或变量。你没有说那个类或函数是什么样子的,你只是说它存在。

  • 定义:您定义某事物是如何实现的,例如类、函数或变量,即您说它实际上是什么。

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

  • :Java 并没有像 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;                    // /                         |
                                          //                           |
    }                                     //                           |
}                                         //                          /
于 2012-07-30T04:43:33.100 回答
30

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

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

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

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


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


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

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

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

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

于 2012-07-30T04:49:52.320 回答
7

根据太阳词汇表的定义:

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

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

我阅读 Sun 词汇表的方式是这样的:

List i;              // declaration - variable on the stack  
i = new ArrayList(); // definition - gives variable a reference
于 2012-07-30T12:19:08.253 回答
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.如果是Method,它是这样的......

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

   public void go(){               // Method Defination

            // Your code      

    }
于 2012-07-30T04:46:01.633 回答
2

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

宣言:

class A{}// class declaration

String str;// variable declaration
于 2012-07-30T05:25:15.763 回答
1

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

考虑以下场景:

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

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

所以说

SoftwareEngineer se;

指声明;

class SoftwareEngineer {

// define role and responsibilities
}

意味着定义。希望它可以帮助你。

于 2012-07-30T05:21:33.813 回答
1

声明:声明的概念包括通知编译器变量的属性,例如它的名称、它持有的值的类型和初始值(如果有的话)。

变量的定义说明了变量的存储位置。即,变量的内存是在变量定义期间分配的。

 public class JavaDemo{
       public static void main(String args[]){
          int a; // declaration of variable
          a=10; // definition of variable
          functionA(a); // declaration of function
       }
       public static void functionA(int a){
          System.out.println("value of a is " + a); // definition of function
       }
    }
于 2021-10-20T05:35:34.413 回答