2012-10-09 35 views
46

Chúng tôi luôn viết:Làm thế nào để khai báo một hằng số trong Java

public static final int A = 0; 

Câu hỏi:

  1. static final cách duy nhất để khai báo một liên tục trong một lớp học?
  2. Nếu tôi viết public final int A = 0; thay vào đó, là A vẫn là hằng số hoặc chỉ một trường hợp trường hợp?
  3. Biến số cá thể là gì? Sự khác biệt giữa biến số cá thể và trường cá thể là gì?
+0

Bản sao có thể có của [Cách tốt nhất để triển khai các hằng số trong Java là gì?] (Https://stackoverflow.com/questions/66066/what-is-the-best-way-to-implement-constants-in- java) –

Trả lời

32
  1. Bạn có thể sử dụng một loại enum trong Java 5 trở đi cho mục đích này bạn đã mô tả. Nó là loại an toàn.
  2. A là một biến mẫu. (Nếu nó có công cụ sửa đổi tĩnh, thì nó sẽ trở thành biến tĩnh.) Hằng số chỉ có nghĩa là giá trị không thay đổi.
  3. Biến thể hiện là thành viên dữ liệu thuộc đối tượng chứ không phải lớp. Biến thể hiện = Trường thể hiện.

Nếu bạn đang nói về sự khác biệt giữa biến mẫu và biến lớp, biến mẫu tồn tại trên mỗi đối tượng được tạo. Trong khi biến lớp chỉ có một bản sao cho mỗi trình nạp lớp bất kể số lượng đối tượng được tạo ra.

Java 5 và lên enum loại

public enum Color{ 
RED("Red"), GREEN("Green"); 

private Color(String color){ 
    this.color = color; 
    } 

    private String color; 

    public String getColor(){ 
    return this.color; 
    } 

    public String toString(){ 
    return this.color; 
    } 
} 

Nếu bạn muốn thay đổi giá trị của enum bạn đã tạo, cung cấp một phương pháp mutator.

public enum Color{ 
RED("Red"), GREEN("Green"); 

private Color(String color){ 
    this.color = color; 
    } 

    private String color; 

    public String getColor(){ 
    return this.color; 
    } 

    public void setColor(String color){ 
    this.color = color; 
    } 

    public String toString(){ 
    return this.color; 
    } 
} 

Ví dụ về truy cập:

public static void main(String args[]){ 
    System.out.println(Color.RED.getColor()); 

    // or 

    System.out.println(Color.GREEN); 
} 
+1

câu hỏi thứ hai, vì A không thể thay đổi, nó vẫn là một biến ** **? –

+1

Có nó vẫn là một biến thể hiện. Nó tồn tại một cho mỗi đối tượng được tạo ra. –

+0

Phải, nhưng bạn cũng có thể biến nó thành biến tĩnh nếu không thể thay đổi được :) –

3

Mọi thứ có kích thước là static. Bạn không phải tạo cá thể để truy cập các trường/phương thức tĩnh. Biến tĩnh sẽ được tạo một lần khi lớp được nạp. Biến thể hiện là biến liên kết với đối tượng. Điều đó có nghĩa là các biến mẫu được tạo cho từng đối tượng bạn tạo. Tất cả các đối tượng sẽ có bản sao riêng của biến cá thể cho chính chúng. Trong trường hợp của bạn, khi bạn khai báo là static final, đó chỉ là một bản sao của biến. Nếu bạn thay đổi nó từ nhiều cá thể, cùng một biến sẽ được cập nhật (tuy nhiên, bạn có final biến để nó không thể được cập nhật). Trong trường hợp thứ hai, final int a cũng không đổi, tuy nhiên nó được tạo ra mỗi lần bạn tạo một thể hiện của lớp mà biến đó được khai báo.

Có một cái nhìn về this Java tutorial để hiểu rõ hơn,

54

final có nghĩa là giá trị không thể thay đổi sau khi khởi tạo, đó là những gì làm cho nó một hằng số.static có nghĩa là thay vì có khoảng trống được phân bổ cho trường trong mỗi đối tượng, chỉ có một cá thể được tạo cho lớp đó.

Vì vậy, static final có nghĩa là chỉ một ví dụ của biến bất kể có bao nhiêu đối tượng được tạo và giá trị của biến đó không bao giờ có thể thay đổi.

+0

Không phải chuyên gia trong Java nhưng âm thanh 'cuối cùng 'như" trường chỉ đọc "với tôi và" hằng "phải liên tục tại thời gian biên dịch – fjch1997

+0

-1. Cảnh báo: Không thể sử dụng 'final int' trong câu lệnh' switch', dẫn tôi tin rằng 'int cuối cùng 'không phải là hằng số biên dịch. – starbeamrainbowlabs

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