2012-06-29 67 views
13

Ai đó có thể làm rõ ý nghĩa của mã bên dưới.Khai báo đối tượng là cuối cùng trong java

class A 
{ 
    int i = 10; 

    public void setI(int b) 
    { 
     i = b; 
    } 

    public int getI() 
    { 
     return i; 
    } 
} 

class Test 
{  
    public static void main(String args[]) throws Throwable 
    { 
     final A ob = new A(); 
     ob.setI(10); 
     System.out.println(ob.getI()); 
    } 
} 

Đối tượng A được khai báo là cuối cùng, nhưng tôi có thể thay đổi giá trị của biến dụ của đối tượng này và cũng có thể truy xuất các giá trị được cập nhật. Vì vậy, ý nghĩa của việc tuyên bố một đối tượng là cuối cùng là gì. Tôi biết về việc khai báo kiểu dữ liệu nguyên thủy là cuối cùng, làm cho hằng số biến đó.

Trả lời

31

ob sẽ không thể tham chiếu đến bất kỳ đối tượng nào khác: final keyword.

Không thể gán lại. Nhưng bạn có thể thay đổi nội bộ của nó (nó là mutable, nếu nó đã được ban đầu). Vì vậy, công trình này:

final A ob = new A(); 
    ob.setI(6) 

nhưng điều này không:

final A ob = new A(); 
    ob = new A(); 
+0

Vì vậy, về cơ bản việc này không cho phép gán một đối tượng mới của đối tượng? Còn những thứ khác như: 'Image img = loadImage (" img.png ");'. sau đó bạn có thể làm: 'img = loadImage (" image.png ");'? hoặc điều này sẽ là bất hợp pháp? –

+0

@LinkTheProgrammer bạn nghĩ sao? – NimChimpsky

1

Trong java, như trái ngược với C++, tất cả các đối tượng là con trỏ, do đó, một đối tượng final thể thay đổi, nó chỉ có thể' t điểm bất cứ nơi nào mới, đó là, bạn không thể đặt nó ở phía bên trái của các nhà điều hành chuyển nhượng.

3

Nếu đối tượng là final, bạn có thể gọi bất kỳ phương pháp nào thực hiện thay đổi nội bộ như bình thường, nhưng bạn không thể gán lại tham chiếu để trỏ đến một đối tượng khác. Hãy thử thực hiện việc này:

final A ob = new A(); 
ob = new A(); 

và thông báo rằng mã sẽ không biên dịch.

Hãy coi đây là tham chiếu không đổi.

3

Nó có nghĩa như sau là không thể:

final A ob = new A(); 
ob = new A(); // This is not possible 

Biến ob cũng sẽ đề cập đến trường hợp của lớp A rằng lần đầu tiên được gán cho nó. Đó là ý nghĩa của từ khóa final trong trường hợp này. Nó có nghĩa là bạn có thể sửa đổi các thuộc tính của ob vì nó là một đối tượng bình thường giống như bất kỳ thể hiện nào khác của A.

2

Vâng, trong trường hợp đối tượng, giá trị tham chiếu là địa chỉ đối tượng. Vì vậy, giá trị của ob sẽ là địa chỉ đối tượng được tạo bởi new A(); sẽ là giá trị cuối cùng và bạn sẽ không thể thay đổi giá trị của nó. có nghĩa là ở đó, Bạn không thể gán một đối tượng mới cho tham chiếu này.

Bạn không thể viết theo cách này.

final A ob = new A(); 

ob= new A(); // not allowed 
1

Sẽ không có bất kỳ đối tượng cố định nào (cuối cùng) trong java. Các đối tượng được tạo trong vùng bộ nhớ Heap. và chúng ta có thể sửa đổi đối tượng bất cứ lúc nào.
Chỉ có tham chiếu liên tục (cuối cùng) trong java: - nghĩa là bạn không thể sửa đổi tham chiếu và gán lại nó cho bất kỳ đối tượng nào khác vì nó là hằng số và thông qua tham chiếu cuối cùng chỉ đề cập đến một đối tượng đang được được giao trong khi khai báo.

Do đó:

final A objectA = new A(); 
objectA.setI(6); 

là hợp lệ bởi vì chúng ta đang thay đổi chỉ có nội dung đối tượng, không phải là tài liệu tham khảo.

Nhưng:

final A objectA = new A(); 
    objectA = new A(); 

là không hợp lệ vì bạn đang cố gắng để sửa đổi tài liệu tham khảo.

10

Nếu bạn chỉ ra bất kỳ biến nào là cuối cùng, điều đó có nghĩa là bạn không muốn giá trị nó chứa trong bộ nhớ thay đổi. Trong trường hợp các kiểu nguyên thủy, giá trị đó được đại diện bởi các biến là các giá trị thực tế. Trong trường hợp các kiểu đối tượng, các giá trị trong bộ nhớ là các tham chiếu đến đối tượng và không phải là các đối tượng thực tế.

Ví dụ, bạn có:

final int x = 7; 
final Object y = new Object(); 

Bạn có thể nghĩ về những dữ liệu được đại diện trong bộ nhớ theo cách này:

+----------+----------+ 
| block | value | 
+----------+----------+ 
| 1001 | 7  | 
| 1002 | 2110 | 
+----------+----------+ 

Vì mục đích của cuộc thảo luận, chúng ta hãy bỏ qua các chi tiết như thế nào Java thực sự quản lý bộ nhớ (vì tôi cũng không biết nhiều về nó). Vì vậy, trong ví dụ trên, khối 1001 được biểu thị bằng biến x và 1002 theo y. Cả hai đều là các biến cuối cùng có nghĩa là các giá trị mà chúng đại diện không thể thay đổi. Trong trường hợp x, nó là 7, là giá trị thực tế, nhưng trong trường hợp y, 2110 chỉ là một tham chiếu đến một vị trí bộ nhớ khác. Cả hai không thể thay đổi nhưng lý do biến nguyên thủy trở thành hằng số là chúng đại diện cho giá trị thực tế. Nhưng trên thực tế, bạn có thể nói tương tự cho các biến loại đối tượng quá chỉ rằng các hằng số mà chúng đại diện là các tham chiếu. Do đó, từ khóa cuối cùng là là khá phù hợp trong lĩnh vực này.

Vì vậy, với các biến cuối cùng, nếu chúng là các kiểu nguyên thủy, chúng sẽ liên tục đại diện cho bất kỳ giá trị cụ thể nào bạn đặt chúng. Nếu chúng là các kiểu đối tượng/tham chiếu, chúng sẽ liên tục trỏ đến bất kỳ đối tượng nào mà bạn trỏ đến (bất kể sự biến đổi của đối tượng).

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