Trong Java, new MyClass()
creates a new instance của MyClass
và trả về một tham chiếu đến nó.
Trong khi đó, tuyên bố:
MyClass foo;
định nghĩa một biến foo
có thể lưu trữ một tham chiếu đến một thể hiện của MyClass
, hoặc giá trị đặc biệt null
cho biết sự vắng mặt của một tài liệu tham khảo như vậy. Nếu bạn không đảm bảo bất kỳ tham chiếu nào đến foo
, giá trị mặc định của nó sẽ là null
.
Bạn chắc chắn có thể kết hợp những thứ này, ví dụ: như thế này:
MyClass foo; // define a variable foo that can store an object reference
foo = new MyClass(); // create a new object and assign a reference to it to foo
hay tương đương, như thế này:
MyClass foo = new MyClass(); // combined variable definition and assignment
Nhưng bạn không có để tạo ra một trường hợp mới mỗi khi bạn gán một cái gì đó cho một biến tham khảo. Bạn cũng có thể làm được. này:
MyClass foo, bar; // define two reference variables, foo and bar
foo = new MyClass(); // create a new object and assign a reference to it to foo
bar = foo; // now foo and bar point to the same object
hoặc thậm chí:
MyClass foo = new MyClass(), bar = foo; // same, but shorter
Lưu ý rằng trong Java, như trái ngược với một số ngôn ngữ khác như C++, bạn có thể không bao giờ gán (một bản sao của) một đối tượng thực tế vào một biến. Thay vào đó, các đối tượng Java luôn được truy cập thông qua các tham chiếu đến chúng. Khi ai đó nói về "gán đối tượng cho biến" hoặc "chuyển đối tượng dưới dạng tham số" hoặc "trả về đối tượng từ phương thức" trong Java, ý nghĩa của chúng luôn là gán hoặc chuyển hoặc trả về tham chiếu vật.
Phương thức mà lệnh mã của bạn có thể (và thường làm) cũng trả về tham chiếu đến đối tượng.Ví dụ, nếu lớp học của bạn có một phương pháp như thế này:
private MyClass getSomeObject() {
// ...some code here...
}
bạn có thể gọi nó và lưu lại tài liệu tham khảo nó sẽ trả về vào một biến như thế này:
MyClass foo;
foo = getSomeObject();
hay như thế này:
MyClass foo = getSomeObject();
Chúng tôi có thể biết từ phương thức khai báo rằng getSomeObject()
sẽ luôn trả lại tham chiếu đến một ví dụ MyClass
(hoặc null
), nhưng không phải ở vị trí thứ ví dụ thực sự đến từ. Điều đó hoàn toàn phụ thuộc vào mã bên trong phương thức getSomeObject()
. Mã này luôn có thể tạo một phiên bản MyClass
mới với new MyClass()
mỗi lần được gọi và trả về một tham chiếu đến nó hoặc nó luôn có thể trả lại tham chiếu đến đối tượng cùng một đối tượng. Hoặc, tất nhiên, đôi khi nó có thể trả lại một tham chiếu đến một đối tượng mới và đôi khi là một đối tượng được tạo trước đó.
Lưu ý rằng, nếu bạn chỉ định giá trị mới cho biến, bất kỳ biến nào chứa trước đó sẽ bị lãng quên. Nếu giá trị đã quên xảy ra là tham chiếu cuối cùng đối với một số đối tượng, thì chính đối tượng đó sẽ bị hủy bởi bộ thu gom rác của Java.
Vì vậy, ví dụ, trong khi nó chắc chắn thể để làm một cái gì đó như thế này:
MyClass foo = new MyClass(); // create a new object and assign (a reference to) it to foo
foo = getSomeObject(); // forget the previous content of foo and replace it with whatever getSomeObject() returns
thường làm cho không có ý nghĩa, vì bạn muốn được tạo ra một MyClass
dụ mới chỉ để ngay lập tức vứt bỏ bạn chỉ tham chiếu đến nó và thay thế nó bằng cái gì đó khác. Trong thực tế, các mã trên là chính xác tương đương với:
new MyClass(); // create a new object and throw away(!) the reference to it
MyClass foo = getSomeObject(); // assign whatever getSomeObject() returns to foo
Thời gian duy nhất mà ngay cả từ xa có thể có ý nghĩa sẽ được nếu bạn muốn để tạo ra một MyClass
dụ mới và ngay lập tức để cho nó được thu gom rác thải, ví dụ vì hàm tạo MyClass
có một số tác dụng phụ mà bạn muốn kích hoạt. Nhưng vì nó thường được coi là xấu cho các nhà xây dựng để có bất kỳ tác dụng phụ không tầm thường (hoặc, nói chung, để làm bất cứ điều gì ngoài việc thiết lập các đối tượng mới), bạn không nên có bất kỳ lý do gì để viết mã như vậy.
Làm thế nào để bạn biết một đối tượng đã được tạo chưa? – foobar5512
Khi bạn cố gắng tham khảo nó, nó sẽ là null. Bạn có thể kiểm tra bằng một cái gì đó như (tham khảo cập nhật của tôi) – AedonEtLIRA
Bạn nhận được thông tin này từ tài liệu - hoặc kinh nghiệm. Ví dụ: Người quản lý thường được sử dụng như đơn (hoặc s.th. tương tự), vì vậy chỉ có một ví dụ. Loại lớp bạn không tạo, nhưng có một hàm để truy xuất đối tượng. –