内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
这两个术语之间我很困惑。我检查了stackoverflow,C ++有类似的问题,但不是java。
有人可以解释这两个术语之间的区别吗?
概念上的差异很简单:
在Java中,两者之间几乎没有什么区别,并且从形式上讲,声明不仅包含标识符,还包括定义。以下是我个人详细解释条款的方式:
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; // / |
// |
} // |
} // /
Java语言规范广泛地指定并使用术语“声明”,但它不使用“定义”,除非作为普通的英语单词。
我的证据是,“声明”一词在JLS目录和索引中出现过很多次,但“定义”一词也没有出现。
所以,当你看到有人在Java语境中使用“定义”一词时,他们要么以非技术意义使用它,要么在他们的术语中sl sl不驯。
在后一种情况下,它们可能与技术术语“声明”意思相同,也可能意味着其他意思。如果他们的意思是别的,你需要问他们的意思。如果他们已经定义了......足够公平,但这不是标准术语。
在Java语境中,表示“定义”是指变量被初始化的点的答案是不可支持的。在Java中,变量的初始化要么发生在声明点,要么发生在稍后的赋值。在后一种情况下,除分配和/或初始化之外,不使用特殊术语......或需要......。没有为变量分配存储的指定点。事实上,在声明达到之前,变量本身的空间就被分配了。
JLS规范中没有使用“声明”术语的原因在于它不是必需的。
(Java中唯一可以使用声明和定义的地方是抽象方法,除了如果他们已经完成了,那么就必须将常规方法声明称为定义...以保持一致性......并且会令人困惑,因此他们只是将抽象子表达式称为抽象方法的声明。)
C和C ++处理这些事情的方式不同,因此在其技术描述中确实需要不同的“声明”和“定义”术语。我对“Sun词汇表”的定义是,它们是以C / C ++为中心的。