Java:定义初始化、声明和赋值这些术语

49

我发现这些定义循环了,主语是由动词定义的,但动词却未被定义!那么如何界定它们呢?

循环定义:

初始化:为变量进行初始化。可以在声明时完成。

赋值:为变量指定值。可以在任何地方完成,并且只能使用最终标识符一次。

声明:为变量声明值。

[更新,尝试用λ演算理解该主题]

D(x type) = (λx.x is declared with type) 
A(y D(x type)) = (λy.y is assigned to D(x type))

%Then after some beta reductions we get initialization.
D(x type) me human                  // "me" declared with type "human"
A(y (D(x type) me human)) asking    // "asking" assigned to the last declaration

%if the last two statemets are valid, an initialization exists. Right?

2
声明,初始化和赋值都包含在Java教程中:学习Java语言的Java教程之路中。其中DeclarationInitializationAssignment均有涉及。 - jaco0646
8个回答

89

赋值: 把变量旧的值丢掉并用新值替换

初始化: 是一种特殊的赋值,是第一个赋值。在初始化之前,对象的值为null,基本数据类型的默认值为0false。可以与声明一起完成。

声明: 声明指定了变量的类型和名称。变量只能被声明一次。编译器使用声明帮助程序员避免将字符串值赋给整数变量等错误。在读取或赋值变量之前,必须先声明该变量。


3
初始化是从一个起始值进行的更改。声明是用名称和类型进行标记。赋值是值的一种更普遍的更改,而初始化是一种特殊类型的赋值。 - hhh
1
初始化是特殊的,因为它是变量的第一个赋值。 - Silvio Donnini
4
我认为原始类型在初始化前没有0false值。如果您尝试打印未初始化的变量,它会产生编译时错误,而不是打印其值,这表明该变量可能尚未被初始化。请注意,这里的"原始类型"指的是编程语言中的基本数据类型,如整数、布尔值等。 - Adit A. Pillai
在Java中,如果没有显式的初始化器,则对象的字段会自动初始化为“空”值(null、零或false)。但是,在代码块中的局部变量不会自动初始化,任何尝试在未先写入值的情况下读取局部变量的值都将导致编译时错误。有关更多信息,请参见《Java语言规范》第16章。 - Daniel Pryden

72
String declaration;
String initialization = "initialization";
declaration = "initialization"; //late initialization - will initialize the variable.
    // Without this, for example, in java, you will get a compile-time error if you try 
    // to use this variable.

declaration = "assignment"; // Normal assignment. 
    // Can be done any number of times for a non-final variable

11
声明不是将“值”声明给变量;它是声明变量的类型。
赋值只是将值存储到变量中。
初始化是在声明时将值分配给变量。
这些定义也适用于字段。
int i;  // simple declaration
i = 42  // simple assignment

int[] arr = { 1, 2, 3 };
// declaration with initialization, allows special shorthand syntax for arrays

arr = { 4, 5, 6 }; // doesn't compile, special initializer syntax invalid here
arr = new int[] { 4, 5, 6 }; // simple assignment, compiles fine

然而,需要提到的是,“初始化”也有一个更加宽松的定义:“变量的第一次赋值”,不管赋值发生在哪里。
int i; // local variable declaration
if (something) i = 42;
System.out.println(i);
  // compile time error: The local variable i may not have been initialized

然而,这段代码可以编译通过:

int i; // the following also compiles if i were declared final
if (something) i = 42;
else i = 666;
System.out.println(i);

在此处,i 可以从两个可能的位置进行“初始化”,通过简单的赋值操作即可实现。因此,如果 i 是一个数组,则无法使用此结构中的特殊数组初始化程序缩写语法。
所以基本上,“初始化”有两个可能的定义,取决于上下文:
- 在最狭义的形式中,当声明与赋值组合时,就可以实现“初始化”。
- 它允许特殊的数组缩写初始化程序语法等。
- 更一般地,当首次对变量进行赋值时,就可以实现“初始化”。
- 它允许在多个位置为 final 变量进行赋值。 - 编译器会尽力确保只有其中一个赋值操作会发生,从而“初始化”final 变量。
此外,还有 JVM 上下文类和实例初始化、OOP 上下文对象初始化等。

"int[] arr = { 1, 2, 3 };" 表示定义了一个名为arr的整型数组,并将{1,2,3}赋值给它。这意味着进行了初始化,对吗? - hhh
是的,那是使用特殊数组初始化语法的示例,因此它是初始化。 - polygenelubricants

6
这里是一些示例的简短说明。
声明: 当您声明一个带有名称的变量时,变量只能声明一次。
例如:int x;、String myName;、Boolean myCondition;
初始化: 初始化是指我们在声明变量时给变量赋值。
例如:int x = 7;、String myName = "Emi";、Boolean myCondition = false;
赋值: 赋值是指我们已经声明或初始化了一个变量,并且正在改变其值。您可以根据需要多次更改变量的值。
例如: int x = 7; x = 12;……我们刚刚更改了值。
String myName = "Emi"; myName = "John"……我们刚刚更改了值。
Boolean myCondition = false; myCondition = true;……我们刚刚更改了值。
注意:内存中将保存我们放入的最后一个值。

3

声明: 每当您使用其类型定义新变量时。

赋值: 每当您通过给变量赋新值来更改变量的值时。

初始化: 与声明一起完成的赋值,或者在任何情况下对变量进行的第一个赋值,通常是对象的构造函数调用或变量的普通赋值。


我无法理解声明和初始化之间的区别。 - hhh
初始化 = 声明 + 赋值? - hhh
这更像是初始化=第一个赋值(对于类字段可以是隐式的,但对于局部变量必须是显式的)。 - pablochan
初始化操作并不依赖于赋值。未被引用的对象可以被初始化。通常情况下,程序员在初始化时就进行赋值操作。初始化是创建新对象的过程。 - Finbarr
2
@Finbarr:我认为你把初始化和实例化混淆了。 - pablochan

1
步骤1: 声明: int a;
步骤2: 初始化: a = 5;
步骤3: 赋值: a = b; (例如:int b = 10; 现在a变成了10)

1
我是一个具有C/C++背景的人,但这些想法应该是相同的。 声明 - 当变量被声明时,它告诉编译器设置一块内存并将名称(和变量类型)与其关联。在C/C++中,它可能看起来像这样:
int x;

编译器看到这一点,为x设置了一个地址位置,并知道应该使用哪些方法来执行对x的操作(不同的变量类型将使用不同的访问操作)。这样,当编译器遇到该行时,它就可以在正确的位置找到x并执行所需的操作。
x = 3 + 5;

它知道将整数值8(而不是浮点数值8)放入内存位置,也称为“x”。

赋值 - 当您将值填入先前声明的变量中时,就会发生这种情况。 赋值与“等于号”相关联。 在上一个示例中,变量“x”被分配了值8。

初始化 - 这是当变量预设值时发生的情况。 不能保证在变量声明期间变量将被设置为某个默认值(除非您明确设置)。 可以争论初始化是变量的第一次赋值,但这并不完全正确,我很快就会解释。 典型的初始化是变量声明和赋值的混合体,如下所示:

int x = 6;

当处理常量时,初始化和赋值之间的区别变得更加重要,例如这个...

const int c = 15;

处理常量时,您只能在声明/初始化时分配它们的值。否则,它们无法被更改。这是因为常量通常位于程序内存而不是数据内存中,并且它们的实际分配发生在编译时而不是运行时。

0
Declaration
When we first create a variable of any Data Type is call Declaration. Example: 

int obj;
String str;

Initialization
When (Declaration is completed) or variable is created the assigned any value to this variable is call Initialization. Example 
    int obj = 10;
    String str = "Azam Khan";

Assignment
Reassign value to that variable that is already initialized is call Assignment. Example
int obj = 15;
obj = 20;       // it print **20** value.
String str = "simple"
str = "Azam Khan"  // it's result or print **Azam Khan** value...

简单程序

class ABC{
public static void main(String args[]){
int obj; // this is **Declaration:**
int  testValue= 12;   // After the **Declaration**, 
testValue is **Initialize**. 
testValue = 25;
System.out.println(textValue);
}
} 
the output result is 25.

它保存了值为25。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接