在Java中声明和定义有什么区别?
这两个术语我很困惑。 我检查了stackoverflow,有一个类似的问题的C + +但不是Java。
有人可以解释这两个术语之间的差异?
概念上的差别很简单:
-
声明 :你正在声明存在的东西,比如类,函数或variables。 你不会说什么类或函数看起来像什么,你只是说它存在。
-
定义 :你定义了如何实现某些东西,例如类,函数或variables,也就是说你说的是实际的东西。
在Java中 ,两者之间几乎没有什么区别,从forms上讲,声明不仅包含标识符,还包括定义。 以下是我个人如何详细解释条款:
-
类 :Java并没有像C / C ++那样真正地分离声明和定义(在头文件和cpp文件中)。 你在声明它们的地方定义它们。
-
函数 :当你正在编写一个接口(或一个抽象类)时,你可以说你正在声明一个函数,而没有定义它。 然而,普通函数总是在声明的地方被定义。 如果你喜欢,可以看看函数的主体。
-
variables :variables声明可能如下所示:
int x;
(你声明variables
x
存在,并且具有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