2013-09-03 51 views
5

làm cách nào để có thể khởi tạo biến cuối cùng của lớp tại thời điểm tạo đối tượng?Biến cuối cùng có thể được khởi tạo khi một đối tượng được tạo không?

Bất kỳ ai cũng có thể giải thích điều đó là gì? ...

+2

Có, khởi tạo chúng trong hàm tạo của đối tượng lớp mà bạn đang tạo . –

+0

Bạn có nghĩa là, Làm thế nào có thể java cho phép gán trong constructor ?? –

+0

Bạn thường nên đăng bài theo http://sscce.org/ bởi vì điều này làm cho ngăn xếp tràn hiệu quả hơn.Đăng một số mã, giải thích những gì bạn đã cố gắng đạt được và những gì bạn đã nhận được. Hãy giữ tâm trí này trong tương lai. –

Trả lời

15

Bạn phải khởi tạo biến cuối cùng một lần và chỉ một lần.Có ba cách để làm điều đó cho một biến Ví dụ:

  1. trong constructor
  2. trong một khối dụ khởi tạo.
  3. khi bạn khai báo nó

Dưới đây là một ví dụ về cả ba:

public class X 
{ 
    private final int a; 
    private final int b; 
    private final int c = 10; 

    { 
     b = 20; 
    } 

    public X(final int val) 
    { 
     a = val; 
    } 
} 

Trong mỗi trường hợp đang chạy một lần khi bạn gọi new X(...) và không có cách nào để gọi bất kỳ của những một lần nữa, đáp ứng yêu cầu khởi tạo xảy ra một lần và chỉ một lần cho mỗi trường hợp.

5

Biến cuối cùng không được khởi tạo trong quá trình khai báo được gọi là biến cuối cùng trống và phải được khởi tạo on all constructor either explicitly or by calling this(). Thất bại trong việc làm như vậy trình biên dịch sẽ phàn nàn như "final variable (name) might not be initialized".


Theo Wikipedia

Một biến cuối cùng chỉ có thể được khởi tạo một lần, hoặc thông qua một initializer hoặc một câu lệnh gán. Nó không cần phải được khởi tạo tại điểm khai báo: đây được gọi là biến số "blank final". Một biến mẫu trống cuối cùng của một lớp chắc chắn phải được gán ở cuối mỗi hàm tạo của lớp mà nó được khai báo; tương tự, một biến tĩnh cuối cùng trống phải được gán chắc chắn trong một trình khởi tạo tĩnh của lớp mà nó được khai báo; nếu không, một lỗi biên dịch xảy ra trong cả hai trường hợp.

Ví dụ:

public class Sphere { 

    // pi is a universal constant, about as constant as anything can be. 
    public static final double PI = 3.141592653589793; 

    public final double radius; 
    public final double xPos; 
    public final double yPos; 
    public final double zPos; 

    Sphere(double x, double y, double z, double r) { 
     radius = r; 
     xPos = x; 
     yPos = y; 
     zPos = z; 
    } 

    [...] 
} 

Để biết thêm thông tin chi tiết đọc trang wiki http://en.wikipedia.org/wiki/Final_(Java)

+0

Cảm ơn Aura bạn có thể cho tôi biết theo kiến ​​thức của tôi, chúng tôi phải khởi tạo trận chung kết biến khi chúng ta xác định nó và không thể thay đổi giá trị của nó thì làm thế nào nó có thể? Bạn có thể giải thích biến thành viên cuối cùng trống không. – shivam

+0

@ user1118930 Tôi đã cập nhật câu trả lời theo yêu cầu của bạn – AurA

+0

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

0

Tại sao không. Như thế này

public class GenericFoo{ 

    final int var; 

    GenericFoo(){ 
     var = 100; 
    } 

} 
0

Bạn có thể khởi tạo biến mẫu cuối cùng trước khi hàm tạo hoàn tất.
Theo JSL

Một instance variable thức trống phải được chắc chắn giao vào cuối mỗi constructor của lớp mà nó được khai báo; nếu không xảy ra lỗi biên dịch.

Trống biến thức trong Java là một biến thức mà không được khởi tạo khi khai

Vì vậy, có 2 cách để làm điều đó.

cách 1: Trong constructor

class Program { 
    final int i3; 
    Program() { 
     i3 = 10; 
    } 
} 

cách 2: Trong trường hợp chặn

class Program { 
     final int i3; 
     { 
      i3 = 10; 
     } 
    } 
0

Một giá trị final là một trong đó chỉ có thể được thiết lập một lần, và chỉ trong constructor. Không có lý do nào nó không thể được thiết lập bởi hàm tạo cho bất kỳ giá trị nào bạn thích.

Nếu bạn có một giá trị mà bạn muốn là một hằng số cho tất cả các trường hợp, bạn sẽ làm cho nó static final và bạn KHÔNG thể đặt nó trong một hàm tạo. Có lẽ bạn đang bối rối cả hai.

0

Nếu bạn có nghĩa là một thành viên chính thức tĩnh bạn có thể sử dụng một initializer tĩnh:

class Example { 
    public final static Map<String,Object> C; 

    static { 
    C = new HashMap<>(); 
    C.put("hi", 5); 
    } 
} 
0

Điều này có thể do cách thức mà JVM làm việc trong nội bộ và cách Java được thiết kế.

Sau khi mã của bạn được biên dịch, tệp .class được tạo sẽ chứa biểu diễn bytecode của mã của bạn. Tệp Lớp không là gì ngoài một loạt các byte được cấu trúc theo thứ tự được xác định có thể được JVM giải thích.

Trong cấu trúc tệp lớp, bạn sẽ có thể tìm thấy thứ được gọi là Hồ bơi không đổi, không có gì ngoài bảng tham chiếu tượng trưng được JVM sử dụng khi lớp được tải. Các biến cuối cùng của bạn sẽ được tìm thấy ở đây cho dù chúng được khởi tạo hay không phải là một chữ. Vì vậy, bây giờ bạn đã biết điều này, chúng ta hãy tiếp tục và nghĩ về công cụ sửa đổi cuối cùng có nghĩa là gì, nhưng nó có nghĩa là không có cách nào để nói với JVM rằng trong trường hợp này một biến sẽ được gán giá trị và một khi điều này được thực hiện, một hoạt động gán lại trên biến đó sẽ không được phép, vì vậy như các trạng thái tài liệu Ngôn ngữ Java, một biến cuối cùng có thể được gán một giá trị một lần và chỉ một lần.

Bây giờ bạn có nền tảng này, để trả lời câu hỏi của bạn trực tiếp:

Cho dù biến của bạn là một đối tượng hoặc một loại nguyên thủy, giá trị cho một biến thức mà không phải là một thành viên lớp (có nghĩa là không phải là tĩnh) sẽ được JVM tự động đặt bằng cách sử dụng giá trị trong pool hằng số thời gian chạy cho đối tượng của bạn HOẶC nếu biến này không được khởi tạo trên khai báo, thì nó sẽ được yêu cầu được thiết lập khi hàm khởi tạo chạy. Tất cả điều này là có thể bởi vì Java được thiết kế theo cách này để cung cấp cho người lập trình một số sự linh hoạt trong việc gán biến để tránh viết mã cứng và cung cấp một cách để gán các đối tượng cho các tham chiếu cuối cùng.

Giống như mẹo cuối cùng, hãy ngừng suy nghĩ dưới dạng các biến cuối cùng dưới dạng hằng số trong C++. Họ có thể có vẻ tương tự nhưng họ không, họ được xử lý theo những cách hoàn toàn khác nhau.

0

Khi bạn biết biến mẫu chỉ được liên kết với đối tượng lớp, Và từ khóa cuối cùng trước biến có nghĩa là bạn không thể thay đổi giá trị của biến để biến tồn tại chỉ khi đối tượng được tạo ra đó là lý do tại sao chúng tôi có thể gán giá trị biến cuối cùng cách như đã đề cập ở trên trước khi tạo đối tượng (ví dụ: bởi khối tĩnh, khi bạn khai báo) hoặc tại thời điểm tạo đối tượng (ví dụ: thông qua hàm tạo)

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