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

这两个术语我很困惑。 我检查了stackoverflow,有一个类似的问题的C + +但不是Java。

有人可以解释这两个术语之间的差异?

概念上的差别很简单:

  • 声明 :你正在声明存在的东西,比如类,函数或variables。 你不会说什么类或函数看起来像什么,你只是说它存在。

  • 定义 :你定义了如何实现某些东西,例如类,函数或variables,也就是说你说的实际的东西。

在Java中 ,两者之间几乎没有什么区别,从forms上讲,声明不仅包含标识符,还包括定义。 以下是我个人如何详细解释条款:

  • :Java并没有像C / C ++那样真正地分离声明和定义(在头文件和cpp文件中)。 你在声明它们的地方定义它们。

  • 函数 :当你正在编写一个接口(或一个抽象类)时,你可以说你正在声明一个函数,而没有定义它。 然而,普通函数总是在声明的地方被定义。 如果你喜欢,可以看看函数的主体。

  • variables :variables声明可能如下所示:

    int x; 

    (你声明variablesx存在,并且具有typesint ),如果它是一个局部variables或成员字段。 在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; // / | // | } // | } // / 

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

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

所以,当你看到有人在Java的上下文中使用“definition”这个词时,他们要么用的是非技术意义上的,要么就是用他们的术语来</s> </s>。

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


在Java语境中,“定义”指的是variables被初始化的地方的答案是不可支持的。 在Java中,variables的初始化要么发生在声明点,要么发生在稍后的赋值。 在后一种情况下,除了赋值和/或初始化之外,不使用特殊术语…或需要…。 没有指定存储分配给variables的指定点。 事实上,在声明达成之前 ,variables本身的空间是分配的。


JLS规范中没有在Java中使用“声明”术语的原因是它不是必需的。

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

(Java中唯一可能使用声明和定义的地方是抽象方法,除了如果他们已经完成了,那么就不得不引用常规的方法声明作为定义…来保持一致性。会令人困惑,因此他们只是把“抽象”子expression式称为抽象方法的声明。

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

从太阳词汇表的定义:

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

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

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

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

1.声明意味着创build一个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(); 

在方法的情况下,像这样

 public abstract void go(); // Method Declaration (Abstract method) public void go(){ // Method Defination // Your code } 

我想我可以更好地解释这个问题有些事情是这样的:

考虑以下情况:

贵公司有一个新的软件工程师空缺职位。 这意味着你将select填补这个职位的人将是一名软件工程师(你不能为这个职位select一名营销人员)。 所以创build这个post与声明类似。

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

所以说

 SoftwareEngineer se; 

意味着宣言;

 class SoftwareEngineer { // define role and responsibilities } 

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

Java语言只定义了术语声明不使用定义。

宣言:

 class A{}// class declaration String str;// variable declaration 

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

  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