2012-02-12 45 views
15

Tôi có lớp GUI để tôi có thể tạo đối tượng như thế này:Sự khác nhau giữa các tham chiếu và các đối tượng trong java là gì?

GUI g1 = new GUI(); 

và một biến tham chiếu như thế này:

GUI g2; 

Bây giờ nhiều như tôi biết, g2 là một biến tham chiếu mà cung cấp cho tài liệu tham khảo đến lớp GUI và g1 là một đối tượng của lớp GUI. Sự khác biệt giữa g1 và g2 là gì? Tôi có thể sử dụng thuộc tính của lớp GUI với đối tượng nhưng việc sử dụng g2 có thể là gì?

+2

Tôi nghĩ bạn không thể sử dụng g2 trong mã của mình, bởi vì nó chưa được khởi tạo và nó không có giá trị. – evilone

+3

g1 cũng là một tham chiếu! –

+2

Tôi nghĩ câu hỏi này xứng đáng có một câu trả lời hay để giữ lại! – slezica

Trả lời

22

Tài liệu tham khảo là những cái tên. Đối tượng là thứ. Bạn có thể có tên khác nhau cho các công cụ, ngay cả đối với những thứ không thực sự tồn tại.

Bạn có thể khai báo tên, mà không thực sự đem lại cho họ bất kỳ "thực" có nghĩa là, như thế này:

GUI g1; 

Bạn có thể gán ý nghĩa (những thứ thực sự để tham khảo) để tên với toán tử =:

GUI g1 = some_gui; 

Tên có thể thay đổi ý nghĩa của chúng theo thời gian. Cùng một tên có thể đề cập đến những thứ khác nhau tại các điểm khác nhau trong lịch sử.

GUI g1 = some_gui; 

doSomething(); 

g1 = some_other_gui; 

Ngoài ra còn có các từ đồng nghĩa: nhiều tên có thể tham khảo những điều tương tự:

GUI g2 = g1; 

Đó là khá nhiều những gì tài liệu tham khảo làm. Họ là những cái tên có nghĩa là để đề cập đến công cụ.

Stuff thể được tạo ra:

new GUI(); 

Stuff thể được tạo ra và đặt tên ngay tại chỗ để tham khảo sau (theo nghĩa đen!):

GUI g1 = new GUI(); 

Và thứ có thể được gọi, sử dụng tên gọi của nó (hoặc bất kỳ tên nào của nó!):

g1.doSomething(); 
g2.doSomethingAgain(); 

Các công cụ khác cùng loại (Lớp) có thể được tạo và nam ed cách khác nhau:

GUI g1 = new GUI(); 
GUI g2 = new GUI(); 
GUI g3 = new GUI(); 

GUI g1_synonym = g1; 

:)

+2

Đoạn đầu tiên tuyệt vời. Cách tốt để giới thiệu ý tưởng OOP. –

5

Bạn không thể sử dụng g2 cho đến khi bạn gán một đối tượng để nó, vì hiện nay nó không trỏ đến bất kỳ đối tượng, trong khi g1 đã trỏ tới một đối tượng GUI và bạn có thể sử dụng nó.

này:

GUI g1 = new GUI(); 

là khá nhiều tương đương với:

GUI g1; 
g1 = new GUI(); 
2

Đối tượng giống như bong bóng nổi thông qua một không gian gọi là heap. Biến chỉ đơn thuần là liên kết với các bong bóng này. Biểu thức new GUI() tạo đối tượng và toán tử = liên kết nó với biến g1. g2 cũng là một biến nhưng nó không được liên kết với bất kỳ đối tượng nào. Bạn có thể dễ dàng trao đổi chúng bằng cách viết

g2 = g1; 
g1 = null; 

Bây giờ g2 đề cập đến đối tượng mà g1 đã đề cập đến ở phần đầu, và g1 đề cập đến không có gì. Đối tượng là nguyên vẹn, chỉ có các biến được thay đổi.

0

Thực ra trong tên Java của biến của bạn là tham chiếu (ngoại trừ các kiểu nguyên thủy). Bạn không thể sử dụng g2 vì nó chưa được khởi tạo và thậm chí không phải là rỗng. Bạn sẽ nhận được một lỗi thời gian biên dịch cố gắng gọi một phương thức cho g2. Sau GUI g2; g2 không trỏ đến một đối tượng trong bộ nhớ. Nếu bạn đặt g2 thành null như thế này GUI g2 = null; bạn có thể sử dụng nó sau khi khai báo nhưng nếu bạn gọi một phương thức cho g2 bạn sẽ nhận được một thời gian chạy NullPointerException.

0

Cả hai, g1 và g2 đều là tham chiếu. Nhưng g2 không được khởi tạo, vì vậy không thể được sử dụng trong mã.

//Tells that g1 g2 should hold Gui object. Currently they are not holding any object. 
Gui g1; 
Gui g2; 

//Now g1 reference holds object. g2 reference still doesn't point to any object. 
g1 = new GUI(); 
11

Sự khác nhau giữa tham chiếu và đối tượng trong java là gì?

Tham chiếu là một thực thể cung cấp cách truy cập đối tượng thuộc loại của nó. Một đối tượng là một thực thể cung cấp một cách để truy cập vào các thành viên của lớp hoặc loại của nó.

Thông thường, bạn không thể truy cập một đối tượng mà không có tham chiếu đến đối tượng đó.

class GUI 
{ 
    void aMethod() 
    { 
     // some business logic. 
    } 
} 

Bạn có thể gọi aMethod có hoặc không có tham chiếu. nhưng bạn chắc chắn cần một đối tượng.

Nếu không có tham khảo:

new GUI().aMethod(); 
// you can't reuse the object 
// bad way to code. 

Với tham khảo:

GUI aGUIReference = new GUI(); 
aGUIReference.aMethod(); 
// Now, the object can be reused. 
// Preferred way to code 

Bây giờ một chút giải thích cho dòng mã của bạn:

GUI g1 = new GUI(); 
// g1 is a reference to an object of GUI class. 

GUI g2; 
// g2 is a reference that can point to an object of GUI class 
// but currently not pointing to any. 

Sự khác biệt duy b/w g1g2g1 được khởi tạo với một đối tượng nhưng g2 điểm để null

g2 = g1; 
// it means g2 will point to the same object g1 is pointing to 
// only one object but two references. 
+1

Đây là câu trả lời đúng. –

+2

Đây cần phải là câu trả lời được chấp nhận – wfunston

0

Tài liệu tham khảo là những cái tên. Đối tượng là thứ. Bạn có thể có tên khác nhau cho các công cụ, ngay cả đối với những thứ không thực sự tồn tại.

Bạn có thể khai báo tên, mà không thực sự đem lại cho họ bất kỳ "thực" có nghĩa là, như thế này:

GUI g1; 

tên có thể thay đổi ý nghĩa của chúng theo thời gian. Cùng tên có thể tham khảo những điều khác nhau vào những thời điểm khác nhau.

GUI g1 = some_gui; 

doSomething(); 

g1 = some_other_gui; 

Đó là khá nhiều những gì tài liệu tham khảo làm. Họ là những cái tên có nghĩa là để đề cập đến công cụ.

Stuff thể được tạo ra:

new GUI(); 

Stuff thể được tạo ra và đặt tên ngay tại chỗ để tham khảo sau (theo nghĩa đen!):

GUI g1 = new GUI(); 

:)

0

Tham chiếu là "móc", nơi bạn có thể treo một đối tượng trên. Một đối tượng có thể có nhiều hơn một móc.

3

References là loại con trỏ đến một khối bộ nhớ được gọi là objects.

GUI g1 = new GUI(); 

Đối với lời giải thích, hãy để tôi phá vỡ tuyên bố trên.

GUI g1; 
g1 = new GUI(); 

Bước đầu tiên: g1 là biến tham chiếu (con trỏ), chưa trỏ đến bất kỳ vị trí bộ nhớ hợp lệ nào.

Bước thứ hai: Bước thứ hai cấp phát bộ nhớ cho đối tượng lớp GUI và thao tác gán làm biến tham chiếu g1 trỏ đến đối tượng này (vị trí bộ nhớ). Từ khóa new phân bổ bộ nhớ cho đối tượng của lớp GUI.

Các vấn đề liên quan