Đối tượng chưa được khởi tạo so với Đối tượng được khởi tạo thành NULL


93

Tôi đang làm việc trong Java.

Tôi thường thiết lập một số đối tượng như:

public class Foo {
    private SomeObject someName;

    // do stuff

    public void someMethod() {
        if (this.someName != null) {
            // do some stuff
        }
    }
}

Câu hỏi đặt ra là: Có phải someNametrong ví dụ này tương đương với null, như trong tôi có thể reliably for all objectscho rằng các đối tượng chưa được khởi tạo bằng cách kiểm tra null sẽ chính xác không?

Câu trả lời:


115

Đúng, cả thành viên tĩnh và thể hiện của kiểu tham chiếu không được khởi tạo rõ ràng đều được nullJava đặt thành . Quy tắc tương tự áp dụng cho các thành viên mảng.

Từ Đặc tả ngôn ngữ Java , phần 4.12.5:

Giá trị ban đầu của các biến

Mọi biến trong chương trình phải có giá trị trước khi giá trị của nó được sử dụng:

Mỗi biến lớp, biến thể hiện hoặc thành phần mảng được khởi tạo với giá trị mặc định khi nó được tạo

[...] Đối với tất cả các loại tham chiếu, giá trị mặc định là null.

Lưu ý rằng quy tắc trên loại trừ các biến cục bộ: chúng phải được khởi tạo rõ ràng, nếu không chương trình sẽ không biên dịch.


làm thế nào để điều này áp dụng, chẳng hạn char,? Tôi có thể làm char test;nhưng khôngchar test = null;
xorinzor

1
@xorinzor Bạn không thể gán nullcho charvì nó là kiểu nguyên thủy. Ngoài ra, bạn không thể thực hiện char test;bên trong một phương thức mà không chỉ định testsau này. Bạn có thể thực hiện char test='a'nếu muốn hoặc để nguyên như char test;trong khai báo thành viên để lấy giá trị mặc định là '\0'.
dasblinkenlight

14

Nếu một Objecttham chiếu đã được khai báo nhưng không được khởi tạo, giá trị của nó là null.


8
Chỉ như một trường thể hiện của một lớp.
Sotirios Delimanolis

1
@SotiriosDelimanolis bạn có thể giải thích thêm được không? Tôi đang cố gắng học :)
SnakeDoc

5
@SnakeDoc Nếu bạn khai báo một Đối tượng trong thân phương thức, bạn sẽ gặp lỗi biên dịch nếu bạn cố gắng sử dụng nó mà không khởi tạo nó trước.
Sotirios Delimanolis

9
Điều đáng nói ở đây là chính xác - bạn không bao giờ khai báo một đối tượng. Bạn khai báo một biến . Chúng không giống nhau.
Jon Skeet

7
@SotiriosDelimanolis rất tiếc khi đưa ra một cuộc thảo luận thực sự cũ, nhưng bạn có tình cờ có tài liệu tham khảo về lý do tại sao họ quyết định nó gây ra lỗi biên dịch, thay vì chỉ làm cho nó khởi tạo nullgiống như một trường cá thể không?
childofsoong

-1
namespace Design
     {
              class Program
              {

                static void Main(string[] args)
                {
                  Logger obj1;   // By Default, the value of obj1 is null
                  Logger obj2 = new Logger();  // By Default the value of obj2 is 
                                               // Design.Logger which is not null
                  Console.WriteLine(obj2); 
                  Console.Read();
                }
              }

     class Logger
           {
             public Logger()
              {
                 Console.writeline("Called");
              }   
            }
        }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.