2012-11-03 6 views
7

Trong một bài báo về cách đối tượng được khởi tạo trong Java có một đoạn được đưa ra dưới đây:Tại sao nó cần thiết mà các biến phải được khởi tạo giá trị mặc định trong Java

Vào đầu cuộc sống của một đối tượng, máy ảo Java (JVM) phân bổ đủ bộ nhớ trên heap để chứa các biến đối tượng của đối tượng. Khi bộ nhớ đó được cấp phát lần đầu tiên, tuy nhiên, dữ liệu nó chứa là không thể đoán trước. Nếu bộ nhớ được sử dụng, hành vi của đối tượng cũng sẽ không thể đoán trước được. Để bảo vệ chống lại một trường hợp như vậy, Java đảm bảo rằng bộ nhớ được khởi tạo, tại ít nhất là các giá trị mặc định có thể dự đoán trước khi nó được sử dụng bởi bất kỳ mã nào.

Bất cứ ai vui lòng giải thích rằng điều này có nghĩa là unpredictable dataunpredictable behavior tại đây. Cảm ơn trước

Trả lời

5

Bất kỳ ai cũng có thể giải thích rằng dữ liệu không thể đoán trước và hành vi không thể đoán trước ở đây.

Nếu bạn lập trình trong C/C++, bạn sẽ thấy rằng biến chưa được khởi tạo mang một số giá trị rác, có trong vị trí bộ nhớ được phân bổ, được hiểu theo kiểu dữ liệu của biến. Trình biên dịch không phàn nàn về các biến như vậy và nếu nhà phát triển quên khởi tạo chúng đúng cách, các giá trị rác được sử dụng, dẫn đến hành vi không mong muốn của chương trình. Trong Java, JVM khởi tạo tất cả các biến thành viên thành các giá trị mặc định dựa trên kiểu dữ liệu của biến và than phiền về biến cục bộ không được khởi tạo trong quá trình biên dịch, để tránh các hành vi không mong muốn và làm cho nhà phát triển luôn sử dụng các biến được khởi tạo .

4

Bởi vì nếu bạn không khởi tạo biến thì JVM sẽ không hiểu điều gì sẽ gán và sẽ lấy bất kỳ giá trị nào dẫn đến dữ liệu không thể đoán trước.

Trình biên dịch không bao giờ gán giá trị mặc định cho biến cục bộ chưa được khởi tạo.

Từ Wikipedia:

Java không có các biến chưa được khởi tạo. Các trường của các lớp và các đối tượng không có bộ khởi tạo rõ ràng và các phần tử của mảng được tự động khởi tạo với giá trị mặc định cho kiểu của chúng (false cho boolean, 0 cho tất cả các kiểu số, null cho tất cả các kiểu tham chiếu). chắc chắn được gán trước khi chúng được truy cập hoặc đó là lỗi biên dịch.

4

Tính không thể tiên đoán này có thể được trải nghiệm trong C hoặc C++, nơi ngôn ngữ thực hiện không tự động khởi tạo biến số. Dưới đây là một ví dụ từ wikipedia:

void count(void) 
{ 
    int k, i; 
    for (i = 0; i < 10; i++) 
    { 
     k = k + 1; 
    } 
    printf("%d", k); 
} 

http://en.wikipedia.org/wiki/Uninitialized_variable

Chúng tôi không biết k bởi vì chúng ta không biết những gì giá trị của nó được tổ chức ban đầu. Giá trị ban đầu là bất kỳ thứ gì là đã chứa trong phân bổ khối bộ nhớ: 0x0A4C1330 hoặc 0x00000000 hoặc 0x00FF3333, v.v.Kết quả là, dữ liệu không thể đoán trước mang lại (tất cả các loại) hành vi không thể đoán trước.

4

Trong C và các ngôn ngữ khác được biên dịch thành mã gốc và chạy trong môi trường không được kiểm soát, biến không được khởi tạo có thể chứa bất kỳ giá trị ngẫu nhiên nào. Đây chính xác là thuật ngữ "không thể đoán trước" có nghĩa là gì. Hãy suy nghĩ về con trỏ trỏ đến một số vị trí không xác định trong bộ nhớ. Nếu chương trình của bạn do nhầm lẫn, hãy bắt đầu sử dụng con trỏ này ít nhất là hành xử không thể đoán trước nếu giá trị này được sử dụng để đọc, nó có thể sụp đổ vì ví dụ như đúc giá trị nằm ở ô nhớ ngẫu nhiên đó không thể chuyển thành kiểu được viết bằng mã hoặc thậm chí gây tham nhũng hệ thống nếu một chương trình ghi thông tin vào vùng bộ nhớ thuộc về một chương trình khác.