2009-03-08 29 views
8

Nếu tôi có một biến thành viên như thế này (công bố trong cơ thể của một lớp)Java đối tượng tài liệu tham khảo/Phạm vi câu hỏi

private Dot[] dots=new Dot[numDots]; 

Tôi lặp qua tất cả các thành viên của mảng này, và:

1) Vượt qua mọi đối tượng Dot đến một chức năng của lớp khác, trong đó:

2) Vượt qua nó để thêm một chức năng của một lớp thứ 3, nếu một số điều kiện được đáp ứng

3) Và lớp thứ 3 thay đổi một số prope rties của đối tượng Dot

khi đối tượng này được trả về lớp gốc/cha mẹ, những thay đổi đó sẽ được giữ lại? Hay nó sẽ được coi như một biến cục bộ bởi các hàm thứ 2/thứ 3?

+0

Tôi thích tên của bạn và đã bỏ phiếu mà không cần đọc câu hỏi. – Cheeso

Trả lời

12

Có, các thay đổi đối với các thuộc tính được giữ lại. Tuy nhiên, Java là giá trị vượt qua 100%, khi bạn truyền một đối tượng, giá trị "" được truyền thực sự là một con trỏ tới đối tượng. Vì vậy, khi bạn thay đổi một đối tượng trong một phương pháp, bạn đang thay đổi các đối tượng thực tế được thông qua vào

Đó là, nếu bạn có phương pháp sau đây, sau đó phương pháp gọi điện thoại sẽ thấy những thay đổi:.

private void updateMyDot(final Dot aDot) { 
    aDot.dotColor = new Color(255,255,255); 
} 

nhưng nếu bạn làm như sau, thì phương thức gọi sẽ không xem các thay đổi.

private void updateMyDot(/* not final */ Dot aDot) { 
    aDot = new Dot(); 
    aDot.dotColor = new Color(255,255,255); 
} 

Trong ví dụ thứ hai, người gọi sẽ không thấy bất kỳ thay đổi và sẽ không nhìn thấy mới được tạo ra Dot đối tượng.

2

Đối tượng được thông qua bởi [ tham khảogiá trị trong đó giá trị là tài liệu tham khảo] (điều mà kế thừa từ Object), các giá trị nguyên thủy (int, long, double, vv) được truyền theo giá trị.

Điều này có nghĩa là khi nguyên thủy được truyền từ người gọi đến phương thức được sao chép, trong khi đó đối tượng có giá trị [của tham chiếu] được chuyển.

Điều này có nghĩa là khi một đối tượng bị đột biến theo phương thức, người gọi sẽ thấy những thay đổi đó bởi vì nó có tham chiếu đến cùng một đối tượng.

Ngược lại khi phương thức thay đổi người gọi ban đầu, không thấy thay đổi khi phương thức đang làm việc trên bản sao.

[lý do cho sự chỉnh sửa]

Nếu Java đã vượt qua bằng cách tham chiếu thì bạn có thể làm điều này:

Object x; 

x = new Integer(42); 
foo(x); 
System.out.println(x.getClass()); // pass by reference would have it print out java.lang.Float 

nơi foo được định nghĩa là:

void foo(Object o) 
{ 
    o = new Float(43); 
} 

Kể từ Java vượt qua tham chiếu theo giá trị o = new Float(43); được phép - nhưng giá trị trong người gọi sẽ vẫn là new Integer(42);

+0

Như đã nêu trong một triệu địa điểm khác, điều này không đúng. Tất cả các tham số được truyền theo giá trị trong Java. Tuy nhiên, các biến đối tượng thực sự tham chiếu đến các tham chiếu đối tượng. Việc chuyển đối tượng dưới dạng tham số phương thức sẽ sao chép biến đối tượng, tức là sao chép tham chiếu. – mtruesdell