2010-08-05 40 views
7

Tôi đã gặp phải vấn đề này nhiều lần và tôi không bao giờ bận tâm tìm hiểu lý do tại sao nó xảy ra và tìm hiểu những gì "tĩnh" thực sự có nghĩa là. Tôi vừa áp dụng thay đổi mà Eclipse đã đề xuất và tiếp tục.Chính xác "tĩnh" có nghĩa là gì khi khai báo các biến "toàn cục" trong Java?

public class Member { 

// Global Variables 
int iNumVertices; 
int iNumEdges; 

public static void main(String[] args) { 

    // do stuff 

    iNumVertices = 0; // Cannot make a static reference to the non-static field iNumVertices 

    // do more stuff 

} // main end 
} 

Vì vậy, nhật thực cho tôi biết làm static int iNumVertices; và tôi không chắc chắn lý do. Vì vậy, những gì chính xác là "tĩnh", làm thế nào là nó được sử dụng, mục đích của việc sử dụng "tĩnh" là gì, và tại sao nó cho tôi vấn đề này?

+4

Đó không phải là biến toàn cục. Họ thậm chí không công khai. Ngay cả khi chúng được công khai, chúng sẽ không phải là các biến toàn cục. Ngay cả khi chúng được công khai và tĩnh họ sẽ không phải là biến toàn cầu. Java không có khái niệm toàn cầu. ** Mọi thứ ** được khai báo cục bộ hoặc trong một lớp hoặc giao diện. –

+0

@Mark ... Tôi xin lỗi? Tôi đã không nhận thức được những sự kiện này. Cảm ơn bạn đã làm rõ. Vậy làm thế nào bạn sẽ phân loại chúng? – Hristo

+0

@Hristo: Tôi nghĩ rằng "biến thành viên" là cụm từ chính xác. – torak

Trả lời

9

Dưới đây là ví dụ của bạn:

public class Member { 

    // Global Variables 
    int iNumVertices; 
    int iNumEdges; 

    public static void main(String[] args) { 

     // do stuff 

     iNumVertices = 0; // Cannot make a static reference to the non-static field iNumVertices 

    } 
} 

Phương pháp main là một phương pháp tĩnh kết hợp với lớp. Nó không được liên kết với một phiên bản của Member, do đó, nó không thể truy cập các biến được liên kết với một phiên bản của Member. Giải pháp cho điều này là không phải để làm cho các trường đó tĩnh. Thay vào đó, bạn cần phải tạo một phiên bản Member bằng cách sử dụng từ khóa new.

Dưới đây là một phiên bản sửa đổi:

public class Member { 
    // Fields 
    private int iNumVertices; 
    private int iNumEdges; 

    public Member(){ 
     // init the class 
    } 

    public static void main(String[] args) { 
     Member member = new Member(); 
     member.iNumVertices = 0; 
     // do more stuff 
    } 
} 

tìm cho mình tạo ra tĩnh học toàn cầu là một dấu hiệu để bạn biết rằng bạn nên suy nghĩ cẩn thận về cách bạn đang thiết kế một cái gì đó. Nó không phải là luôn luôn sai, nhưng nó sẽ cho bạn biết để suy nghĩ về những gì bạn đang làm.

+0

ohhh ... Tôi hiểu rồi. Điều đó làm cho rất nhiều ý nghĩa. Tại sao bạn quyết định biến 2 biến toàn cục thành riêng tư? Có phải vì chúng thuộc về lớp Thành viên và chỉ nên được truy cập bởi các đối tượng Thành viên? – Hristo

+3

Thực hành tốt nhất là làm cho mọi thứ riêng tư không cần truy cập từ bên ngoài, ngay cả trong một dự án thử nghiệm nhỏ chỉ với một lớp. – f1sh

+2

@Hristo Đó là niềm tin của tôi rằng nói chung, mọi biến mẫu (cũng được gọi là trường, thuộc tính và một số tên khác) phải là riêng tư. Bạn muốn phơi bày càng ít hoạt động nội bộ của lớp càng tốt. Điều này giúp bạn làm cho lớp của bạn dễ dự đoán hơn vì bạn sẽ không có ai khác sửa đổi trạng thái lớp học của bạn. 6 tháng xuống đường khi bạn sửa lỗi trong mã của mình, bạn sẽ không phải lo lắng về 5 tệp khác thay đổi các biến của mình nếu bạn giữ chúng ở chế độ riêng tư. –

1

biến tĩnh không cần phải có lớp được khởi tạo để được truy cập, vì vậy nếu bạn đang cố gắng truy cập vào một biến không tĩnh tạo nên một bối cảnh tĩnh bạn đang mạo hiểm cố gắng truy cập vào thứ gì đó chưa được khởi tạo/khởi tạo.

0

biến tĩnh là phổ biến cho tất cả các phiên bản của một Lớp.

Lưu ý: Như đã nói ở trên, đây là các biến lớp tức là được chia sẻ bởi tất cả các phiên bản.

Đây cũng có thể được gọi là biến cấp lớp. Nói chung bạn xác định hằng số (Bạn cũng sẽ cần từ khóa cuối cùng để xác định hằng số) và biến Toàn cục là tĩnh.

Để biết thêm thông tin tham khảo: http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html

http://www.roseindia.net/java/beginners/staticvariable.shtml

0

Mỗi biến lớp (một biến khai báo trong cơ thể lớp và bên ngoài các cơ quan phương pháp) được sử dụng trong một phương pháp tĩnh cần phải được khai báo tĩnh quá.

Các biến và phương thức lớp tĩnh có thể được truy cập bên ngoài lớp đó mà không cần một cá thể của lớp đó.

1

Phương pháp tĩnh chỉ có thể truy cập các biến tĩnh. Có hai loại biến trong lớp. một là biến tĩnh (cũng là biến lớp) và biến khác là biến mẫu. Chỉ có một bản sao của biến tĩnh tồn tại trong bộ nhớ nhưng các biến mẫu sẽ được khởi tạo cho từng đối tượng. Vì vậy, đối với các biến tĩnh, tất cả các đối tượng truy cập cùng một biến và bất kỳ thay đổi nào được thực hiện bởi một đối tượng sẽ được phản ánh cho các đối tượng khác. Câu hỏi đặt ra ở đây là tại sao các phương thức phải tĩnh để truy cập các biến tĩnh. Khi bạn tạo một phương thức tĩnh, bạn có thể truy cập vào phương thức mà không cần instantiating các đối tượng của lớp đó. Vì vậy, nếu phương pháp này có thể truy cập các biến mẫu thì các biến của đối tượng nào sẽ thay đổi? Một cách khác là có thể tức là các phương thức không tĩnh có thể truy cập các biến tĩnh. Các biến số

+0

Vì vậy, nếu tôi muốn một biến cụ thể cho từng đối tượng ... nếu tôi muốn mỗi Thành viên độc lập với một Thành viên khác (ví dụ nếu họ ở các độ tuổi khác nhau), sau đó tôi không nên sử dụng quyền tĩnh? – Hristo

+1

@Hristo Đúng. Thuật ngữ "thể hiện" ám chỉ đến việc thực hiện riêng từng cá thể của lớp. Lớp này mô tả cách cấu trúc từng cá thể. Thống kê sidestep đó và không thực sự là một phần của cá thể trường hợp. Chúng không thể là duy nhất cho một cá thể - chỉ có một bản sao của một tĩnh, không phải một bản sao được kết hợp với từng cá thể. –

+0

Cảm ơn bạn đã giải thích. Điều đó có ý nghĩa. – Hristo

4

tĩnh là các biến được chia sẻ trên tất cả các đối tượng của một lớp. Ở đây trong ví dụ của bạn cho mọi đối tượng của Thành viên bạn tạo, bạn sẽ nhận được các đối tượng có giá trị iNumVertices riêng. Khi bạn sử dụng tĩnh với biến, chỉ có một biến được chia sẻ trên mọi đối tượng của Thành viên. static các phương thức hoạt động theo cùng một cách - chúng được chia sẻ trên tất cả các đối tượng.

static biến/phương thức là phổ biến cho tất cả các đối tượng, bạn không cần phải tạo đối tượng của lớp để truy cập các biến/phương pháp này.

Biến không tĩnh như iNumVertices thuộc về đối tượng của lớp học. Chúng không thể được truy cập mà không cần tạo một đối tượng. Vì vậy, khi bạn truy cập biến không tĩnh từ ngữ cảnh tĩnh (ở đây là phương thức chính), thì java sẽ không biết đối tượng nào là iNumVertices của đối tượng bạn đang cố gắng truy cập. Do đó lỗi.

Hoặc làm iNumVertices tĩnh, hoặc tham khảo nó bằng cách tạo ra một đối tượng của Member

Member m = new Member(); 
m.iNumVertices = 0; 
+0

Vì vậy, nếu tôi muốn một biến được cụ thể cho từng đối tượng ... nếu tôi muốn mỗi Thành viên độc lập với một Thành viên khác (ví dụ nếu họ là các độ tuổi khác nhau), thì tôi không nên sử dụng quyền tĩnh? – Hristo

+0

Chính xác! Đó là mục đích chính xác của các biến thành viên. Bạn không được, tuy nhiên, nhầm lẫn nó với phạm vi của một biến - công cộng, tư nhân, vv – Ara

+0

chờ đợi ... Tôi nghĩ phạm vi đề cập đến phạm vi thời gian trong đó một biến sống. Bạn đang nói rằng công cộng, tư nhân, vv ... cũng xác định phạm vi? – Hristo

4
learn what "static" actually means 

gì tĩnh thực sự có nghĩa là biến lớp sẽ tương tự cho tất cả các thể hiện của lớp học đặc biệt, tuy nhiên nếu bạn muốn tránh sử dụng biến tĩnh (ý tưởng hay, vì biến tĩnh đang được lưu trong bộ nhớ), bạn có thể truyền giá trị biến trough do đó tránh sử dụng công cụ sửa đổi tĩnh và đạt được hiệu quả tương tự (nghĩa là nếu bạn vượt qua cùng một giá trị khi khởi tạo lớp).

Đây là mã ví dụ:

public class Car{ 

    private int speed; 

    public Car(int speed){ 
     this.speed = speed; 
    } 

} 

Vì vậy, bạn có thể làm điều này khi tạo thể hiện mới:

Car car = new Car(100); 

và mỗi khi bạn tạo Ví dụ xe nó sẽ có tốc độ 100, như vậy tránh khai tĩnh private static int speed = 100;

+0

ahh thú vị ... giải pháp hơi khác so với các câu trả lời khác. tâm trí đăng một số mã để chứng minh? – Hristo

+0

@Hristo Tôi đã thêm một số mã –

+0

Cảm ơn bạn đã nhập mã. – Hristo

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