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

zynd9foi  于 2023-01-04  发布在  Java
关注(0)|答案(8)|浏览(151)

我对这两个术语感到很困惑,我检查了stackoverflow,C++也有类似的问题,但java没有。
有人能解释一下java的两个术语之间的区别吗?

axkjgtzd

axkjgtzd1#

概念上的区别很简单:

    • 声明 *:你是在“声明"某个东西的存在,比如一个类、函数或变量。你没有说任何关于那个类或函数看起来像什么的东西,你只是说它存在。
    • 定义 *:你“定义”某个东西是如何实现的,比如一个类、函数或变量,也就是说,你说它实际上是什么。
      在Java中,这两者几乎没有区别,从形式上讲,声明不仅包括标识符,还包括它的定义。下面是我个人对这些术语的详细解释:
      *课程:Java并不像C++那样将声明和定义分开(在头文件和cpp文件中),而是在声明它们的地方定义它们。
      *功能:当你写一个接口(或抽象类)时,你可以说你在声明一个函数,而不是定义它。然而,普通的函数总是在它们被声明的地方被定义。如果你喜欢,可以把函数的主体看作它的定义。
      *变量:变量 * 声明 * 可能如下所示:
int x;

(you声明变量x存在,并且类型为int),无论它是局部变量还是成员字段。在Java中,没有关于x的任何信息留给 define,除了可能的值,这是由它的赋值决定的。
以下是我如何使用这些术语的粗略总结:

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;                    // /                         |
                                          //                           |
    }                                     //                           |
}                                         //                          /
flseospp

flseospp2#

Java语言规范广泛地指定和使用了术语“声明”,但是除了作为一个普通的英语单词之外,它没有使用“定义”。
我的证据是术语“declaration”在JLS目录和索引中出现了很多次,相反,单词“definition”在目录或索引中都没有出现。
因此,当您看到有人在Java上下文中使用“定义”一词时,他们要么是在非技术意义上使用它,要么是在使用术语时过于草率。
在后一种情况下,它们 * 可能 * 意味着与技术术语“声明”相同的东西,或者它们可能意味着其他东西。如果它们意味着其他东西,你需要问他们他们意味着什么。如果他们已经定义了它...很公平,但它不是标准术语。
声明“definition”指变量初始化的点的答案
不受Java语言规范支持**。在Java中,变量的初始化要么发生在声明点,要么发生在后面的赋值中。在后一种情况下,除了赋值和/或初始化之外,不使用......或不需要......任何特殊术语。2不存在为变量分配存储空间的指定点。3实际上,有可能在到达声明之前**分配了变量本身的空间。
JLS规范中的Java没有使用“定义”术语的原因是不需要它。

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

(The在Java中,他们可能使用声明和定义的唯一地方是抽象方法。除非他们这样做了,否则他们必须引用常规方法声明作为定义......为了一致性......这将是令人困惑的。因此,他们只是将“abstract”子用例称为抽象方法的声明。)
C和C处理这些事情的方式不同,因此在它们的技术描述中 * 不 * 需要不同的“声明”和“定义”术语。我对“Sun词汇表”定义的看法是它们是以C / C为中心的。

33qvvth1

33qvvth13#

根据Sun术语表的定义:

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

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

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

0md85ypi4#

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      

    }
5uzkadbs

5uzkadbs5#

Java只定义术语声明,不使用定义。
声明:

class A{}// class declaration

String str;// variable declaration
kuuvgm7e

kuuvgm7e6#

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

变量的定义表示变量的存储位置,即变量的内存在变量定义期间分配。

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
       }
    }
piv4azn7

piv4azn77#

我想我可以这样更好地解释这个问题:
请考虑以下场景:

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

现在当你定义这个职位的人能做什么/不能做什么,他有什么权力,他有什么限制,那么这就是定义。
这么说

SoftwareEngineer se;

指声明;
以及

class SoftwareEngineer {

// define role and responsibilities
}

意思是定义希望对你有帮助。

vmpqdwk3

vmpqdwk38#

我只想重申,@stephen-c的回答非常棒。然而,我认为它需要一个小小的调整。JLS * 确实 * 在一些地方使用了超出其自然语言含义的术语"definition"。我认为这只会混淆规范中原本干净的语言,规范将读者的注意力集中在声明而不是定义上。考虑示例15.12.2的底部- 1.:
如果添加第三个测试定义:

static void test(ColoredPoint p, ColoredPoint q) {
    System.out.println("(ColoredPoint, ColoredPoint)");
}

那么它将比另外两个更具体,并且方法调用将不再是模糊的。
再次,我希望他们没有包括这几个错误的使用定义,这将有助于他们把重点放在声明,而不是定义更明显。
好吧。

相关问题