2013-02-21 29 views
6

Biến tham chiếu được đánh dấu không thể chuyển nhượng cuối cùng cho đối tượng khác. Dữ liệu có trong đối tượng có thể được sửa đổi nhưng biến tham chiếu không thể thay đổi.Đối tượng cuối cùng có thể được sửa đổi nhưng biến tham chiếu không thể thay đổi

Dựa trên hiểu biết của tôi Tôi đã tạo một mã bên dưới nơi tôi đang cố gắng gán lại một UserId mới 155. Định nghĩa đi tôi chỉ cố gắng thay đổi dữ liệu trong đối tượng. Nhưng tham chiếu là như nhau.

public class FinalClass 
{ 
    public static void main(String[] args) 
    { 
     ChildClass objChildClass = new ChildClass(); 
     objChildClass.UserId = 155; 
    } 
} 

class ChildClass 
{ 
    public static final int UserId = 145; 
} 

Tôi tin rằng tôi đã hiểu lầm khái niệm trên.

Vui lòng giải thích tương tự ví dụ.

Cảm ơn bạn đã trả lời.

+1

Để bắt đầu, bạn không * có bất kỳ tham chiếu nào trong chương trình của bạn, vậy ý ​​bạn là gì "Nhưng tham chiếu là như nhau"? – aioobe

+1

mã của bạn thậm chí sẽ không biên dịch. – SudoRahul

+0

nguyên thủy không phải là tham chiếu –

Trả lời

6

Bạn không thể thay đổi giá trị cuối cùng bằng toán tử "=". Nếu bạn làm điều đó, bạn cố gắng thay đổi tham chiếu (hoặc nguyên thủy) và final nói rằng điều này không thể thay đổi.

Bạn thể thay đổi hiện các lĩnh vực của đối tượng:

public static final User user = NewUser(145); 

    public static void main(String[] args) 
    { 
     user.setId(155); 
    } 
2

UserId thuộc loại int, là kiểu nguyên thủy, do đó các quy tắc khác nhau áp dụng cho Đối tượng. một biến nguyên thủy không phải là con trỏ mà là giá trị của chính nó. Nhưng ngay cả khi bạn đang sử dụng một số nguyên (loại đối tượng), bạn sẽ không thể thay đổi giá trị của nó, vì các loại trình bao bọc cho nguyên thủy là không thay đổi.

+3

Tôi không nhận được câu trả lời này. Ngay cả khi anh ta thay đổi 'int' thành' Integer' là một kiểu tham chiếu, nó sẽ không hoạt động. – aioobe

+0

@aioobe người trả lời nói rằng nó sẽ không hoạt động vì 'Integer' là không thay đổi. Nhưng nếu 'int' được thay đổi thành một loại' MutableInteger' tùy chỉnh, thì nó có thể làm một cái gì đó như 'MutableInteger.set (155)' và thay đổi trạng thái đóng gói của đối tượng. –

2

Tôi tin rằng tôi đã hiểu nhầm khái niệm trên.

Bạn đã chính xác, nhưng bạn không kiểm tra chính xác. Nếu UserId sẽ là một lớp có thuộc tính id (hoặc bất kỳ tên nào), thì bạn có thể thay đổi giá trị của nó nhưng không thể tham chiếu.

Ở đây bạn đang tạo biến loại nguyên thủy chứ không phải đối tượng. Hãy thử sử dụng lớp bao bọc Integer cho cùng một thử nghiệm.

3

Trong câu hỏi được sửa đổi của bạn, một thay đổi sẽ làm cho nó hoạt động, tôi không chắc chắn nếu đây là những gì bạn muốn.

public class FinalClass 
{ 
    public static void main(String[] args) 
    { 
     final ChildClass objChildClass = new ChildClass(); 
     ^^^^^ 
     objChildClass.UserId = 155; 
     //objChildClass = new ChildClass(); 
    } 
} 

class ChildClass 
{ 
    public static int UserId = 145; 
       ^^^ 
} 

Bây giờ objChildClass là cuối cùng, bạn có thể sửa đổi các thành viên, nhưng không thay đổi đối tượng mà nó trỏ tới. UserId không còn là cuối cùng nên nó có thể được thay đổi.

1

Hiểu biết của bạn về khái niệm này là đúng. Chờ tôi sẽ cố gắng giải thích vẻ đẹp của từ khóa cuối cùng. tôi đã chia nó thành ba phần:

  1. Nếu bạn đang sử dụng từ khóa cuối cùng cho bất kỳ thành viên nào (biến cục bộ/biến thể/phương pháp) có nghĩa là bạn không thể sửa đổi giá trị của biến cụ thể đó (nếu phương pháp, mà không thể được over-ridden) trong suốt chương trình của bạn.
  2. Nếu bạn khai báo lớp là cuối cùng, thì có nghĩa là không có lớp nào khác (trong cùng một gói hoặc khác nhau) có thể mở rộng lớp đó (lớp cuối cùng), nói cách khác lớp cuối cùng không bao giờ được phân lớp, nhưng, lớp cuối cùng có thể được sử dụng như là "tham chiếu Superclass".
  3. Thứ ba là trường hợp bạn đang đề cập đến. Nếu bất kỳ biến tham chiếu đối tượng nào được khai báo là cuối cùng thì điều đó có nghĩa là biến tham chiếu cuối cùng có thể không bao giờ trong toàn bộ cuộc đời của nó tham chiếu đến một đối tượng khác nhau, nhưng dữ liệu trong đối tượng (đối tượng biến tham chiếu của bạn đang đề cập đến) có thể được sửa đổi.

Tôi đã viết một lớp ở đây hy vọng làm rõ tất cả những nghi ngờ bạn có.

public class FinalSampleTestDrive { 

public static void main(String[] args) { 

    final FinalSample obj = new FinalSample(); 

    FinalSample obj2 = new FinalSample(); 
    FinalSample obj3 = new FinalSample(); 

    obj2.setName("arya"); 
    System.out.println(obj2.getName()); 

    obj3 = obj2; //allowed 

    System.out.println(obj3.getName()); 

    //obj = obj2 //not allowed as obj is final and can not be modified 

    obj.setName("shubham"); 
    System.out.println(obj.getName()); 

    //but the value of the instance variables, the obj is referring to 
    //can change 

    obj.setName("shivam"); 
    System.out.println(obj.getName()); 



} 

} 

và đây là lớp FinalSample đó là nhận được khởi tạo ở đây:

public class FinalSample { 

private String name; 
private String age; 

public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
public String getAge() { 
    return age; 
} 
public void setAge(String age) { 
    this.age = age; 
} 

} 

Bạn cố gắng chạy nó theo những cách khác nhau trên máy tính của bạn.

Mã hóa hạnh phúc :)

+0

Được giải thích rõ ràng. –

+0

Cảm ơn S Kumar :) –

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