2010-04-10 17 views
32

Tôi tìm thấy vòng tròn defs, các đối tượng được xác định bởi động từ của chúng nhưng động từ không xác định! Vậy làm thế nào để bạn xác định chúng?Java: xác định thuật ngữ khởi tạo, khai báo và gán

Thông tư Định nghĩa

khởi: để khởi tạo một biến. Nó có thể được thực hiện tại thời điểm khai báo .

gán: để gán giá trị cho biến. Nó có thể được thực hiện bất cứ nơi nào, chỉ một lần với định danh cuối cùng.

khai báo: để khai báo giá trị cho biến.

[cập nhật, cố gắng tìm hiểu các chủ đề với lambda calc]

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? 
+1

[Khai báo] (https://docs.oracle.com/javase/tutorial/java/javaOO/variables.html), [Khởi tạo] (https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html) và [Assignment] (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op1.html) đều được bao gồm trong The Java Tutorials Trail : [Học ngôn ngữ Java] (https://docs.oracle.com/javase/tutorial/java/TOC.html). – jaco0646

Trả lời

56

assi gnment: vứt bỏ giá trị cũ của một biến và thay thế giá trị cũ bằng một biến mới và thay thế giá trị đó bằng một biến mới

initialization: đó là loại chuyển nhượng đặc biệt. Trước các đối tượng khởi tạo có null loại giá trị và nguyên thủy có giá trị mặc định như 0 hoặc false. Có thể được thực hiện kết hợp với khai báo.

khai báo: tuyên bố nêu rõ loại biến, cùng với tên của biến. Một biến có thể được khai báo chỉ một lần. Nó được trình biên dịch sử dụng để giúp các lập trình viên tránh được các lỗi như gán các giá trị chuỗi cho các biến số nguyên. Trước khi đọc hoặc gán một biến, biến đó phải được khai báo.

+2

TÓM TẮT? Khởi tạo là một sự thay đổi từ một giá trị bắt đầu. Tuyên bố là ghi nhãn với tên và loại. Nhiệm vụ là một thay đổi tổng quát hơn về giá trị, khởi tạo một loại nhiệm vụ đặc biệt. – hhh

+1

chính xác. Khởi tạo là đặc biệt chỉ vì nó là nhiệm vụ đầu tiên của một biến –

+2

Tôi không nghĩ rằng nguyên thủy giữ giá trị '0' hoặc' false' trước khi khởi tạo, với thực tế là khi bạn cố in một biến chưa được khởi tạo, nó tạo ra một biên dịch lỗi thời gian nói rằng biến có thể không được khởi tạo, thay vì in giá trị của chúng. –

3

khai: bất cứ khi nào bạn định nghĩa một biến mới với loại của nó

phân: bất cứ khi nào bạn thay đổi giá trị của một biến bằng cách cho nó một giá trị mới

ban đầu ization: một bài tập được thực hiện cùng với khai báo, hoặc trong bất kỳ trường hợp bài tập đầu tiên nào được thực hiện với một biến, thường là lời gọi hàm tạo cho một đối tượng hoặc một phép gán đơn giản cho biến số

+0

Tôi không thể hiểu được sự khai báo và khởi tạo btw khác biệt. – hhh

+0

initialization = declaration + assignment? – hhh

+0

nó giống như khởi tạo = nhiệm vụ đầu tiên (có thể được ngầm định cho các lĩnh vực lớp học, nhưng phải rõ ràng cho các biến địa phương) – pablochan

6

Tuyên bố không khai báo "giá trị" cho một biến; đó là khai báo loại của biến.

Nhiệm vụ chỉ đơn giản là lưu trữ giá trị vào một biến.

Việc khởi tạo là gán giá trị cho biến số tại thời điểm khai báo.

Các định nghĩa này cũng áp dụng cho các trường.

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 

Tuy nhiên, nó nên được đề cập rằng "khởi tạo" cũng có một nét thoải mái hơn về "sự phân công đầu tiên cho một biến", bất kể nơi nó xảy ra.

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 

này, tuy nhiên, biên dịch:

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

Đây i có thể được "khởi tạo" từ hai địa điểm có thể, bởi nhiệm vụ đơn giản. Do đó, nếu i là một mảng, bạn không thể sử dụng cú pháp viết tắt của trình khởi tạo mảng đặc biệt với cấu trúc này.

Vì vậy, về cơ bản "khởi tạo" có hai nghĩa có thể, tùy thuộc vào bối cảnh:

  • Ở dạng hẹp nhất, đó là khi chuyển nhượng được comboed với tuyên bố.
    • Nó cho phép, trong số những thứ khác, đặc biệt mảng viết tắt initializer cú pháp
  • Tổng quát hơn, đó là khi chuyển nhượng là lần đầu tiên thực hiện cho một biến.
    • Nó cho phép, trong số những thứ khác, gán cho một biến số final ở nhiều nơi.
      • Trình biên dịch sẽ làm hết sức mình để đảm bảo rằng chính xác là một trong những nhiệm vụ có thể xảy ra, do đó "khởi tạo" các final biến

Ngoài ra còn có lớp JVM ngữ cảnh và khởi tạo đối tượng, khởi tạo đối tượng OOP-context, v.v.

+0

"int [] arr = {1, 2, 3};" được khai báo là arr và {1,2,3} -assignment. Nó ngụ ý khởi tạo. Đúng? – hhh

+0

Vâng, đó là một ví dụ về cú pháp khởi tạo mảng đặc biệt đang được sử dụng, do đó, nó được khởi tạo. – polygenelubricants

57
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 
+7

"Mã tốt nhất là tự giải thích /" –

0

Tôi đến từ nền C/C++, nhưng ý tưởng phải giống nhau.

Tuyên bố - Khi biến được khai báo, nó yêu cầu trình biên dịch đặt sang một bên bộ nhớ và liên kết tên (và loại biến) với nó. Trong C/C++ nó có thể trông như thế này:

int x; 

Trình biên dịch thấy điều này và dành riêng một vị trí địa chỉ cho x và biết những gì các phương pháp đó nên sử dụng để thực hiện các hoạt động trên x (loại biến khác nhau sẽ sử dụng các hoạt động truy cập khác nhau). Bằng cách này, khi trình biên dịch chạy vào dòng

x = 3 + 5; 

Nó biết đặt giá trị nguyên 8 (không phải là giá trị dấu phẩy động 8) vào vị trí bộ nhớ còn được gọi là 'x'.

Bài tập - Đây là khi bạn thêm một giá trị vào biến được khai báo trước đó.Nhiệm vụ được liên kết với 'dấu bằng'. Trong ví dụ trước, biến 'x' được gán giá trị 8.

Khởi tạo - Đây là khi biến được đặt trước với giá trị. Không có gì đảm bảo rằng một biến sẽ được đặt thành một số giá trị mặc định trong quá trình khai báo biến (trừ khi bạn thực hiện một cách rõ ràng). Có thể lập luận rằng việc khởi tạo là nhiệm vụ đầu tiên của một biến, nhưng điều này không hoàn toàn đúng, vì tôi sẽ giải thích ngay. Một khởi điển hình là một sự pha trộn của các khai báo biến với một bài tập như sau:

int x = 6; 

Sự khác biệt giữa khởi và phân công trở nên quan trọng hơn khi giao dịch với các hằng số, như thế này ...

const int c = 15; 

Khi xử lý các hằng số, bạn chỉ được gán giá trị của chúng tại thời điểm khai báo/khởi tạo. Nếu không, họ không thể chạm vào được. Điều này là do các hằng số thường nằm trong bộ nhớ chương trình so với bộ nhớ dữ liệu và việc gán thực tế của chúng được thực hiện tại thời gian biên dịch so với thời gian chạy.

0

Bước 1: Tuyên bố: int a;

Bước 2: Khởi tạo: a = 5;

Bước 3: Bài tập: a = b; (ví dụ: int b = 10; bây giờ trở thành 10)

3

Đây là giải thích ngắn gọn với một số ví dụ.

Tuyên bố: Tuyên bố là khi bạn khai báo biến có tên và biến chỉ có thể được khai báo một lần.

Ví dụ: int x;, String myName;, Boolean myCondition;

khởi: khởi là khi chúng tôi đặt một giá trị trong một biến, điều này xảy ra trong khi chúng ta khai báo một biến.

Ví dụ: int x = 7;, String myName = "Emi";, Boolean myCondition = false;

Bài tập: Chuyển nhượng là khi chúng ta đã khai báo hoặc khởi tạo một biến, và chúng tôi đang thay đổi giá trị. Bạn có thể thay đổi giá trị của biến số bao nhiêu lần bạn muốn hoặc bạn cần.

Ví dụ:

int x = 7; x = 12; ....... Chúng tôi vừa thay đổi giá trị.

String myName = "Emi"; myName = "John" ....... Chúng tôi vừa thay đổi giá trị.

Boolean myCondition = false; myCondition = true; ....... Chúng tôi vừa thay đổi giá trị.

Lưu ý: Trong bộ nhớ sẽ được lưu giá trị cuối cùng mà chúng tôi đặt.