2014-06-17 14 views
9
class construct{ 
     public construct(){ 
     System.out.println("no args constructer"); 
     } 
     //other methods 
} 
class two{ 
     static construct d = new construct();// this is legal 
     public static void main(String[] args){ 
     static int c =0;//but why this is not-----showing illegal start of expression 
     } 
} 

Vậy tại sao chúng ta không thể khai báo biến tĩnh bên trong một hàm?tại sao chúng ta không thể khai báo các biến tĩnh bên trong một hàm chức năng ngay cả khi hàm tĩnh?

+5

Tại sao điều này có ý nghĩa? Khi nói về các biến chỉ nằm trong phạm vi bên trong phần thân của phương thức, nó không có ý nghĩa gì khi nói rằng chúng là "cấp độ lớp". – awksp

+0

Bởi vì nó không phải là không hợp lý và/hoặc dự phòng ở mức tốt nhất. –

+1

@ user3580294 tôi đang tìm cách khai báo một biến (mã này không thực tế) bên trong một vòng lặp tĩnh để giá trị của nó không bao giờ thay đổi với lần lặp tiếp theo. – YakRangi

Trả lời

3

Khai báo biến là cuối cùng, không phải tĩnh.

Phương tiện tĩnh là mỗi lớp không có một lớp cho mỗi lớp. Cuối cùng có nghĩa là nó không thể được sửa đổi sau khi tạo. (Mặc dù lưu ý rằng làm cho một tham chiếu cuối cùng không làm cho lớp nó tham chiếu bất biến).

Nói cách khác, nếu bạn có một

final String[] array = new String[3]; 

Bạn có thể không còn thay đổi biến, ví dụ nếu bạn muốn gán cho nó một mảng mới với kích thước khác nhau mà bạn không thể. Tuy nhiên bạn có thể sửa đổi nội dung của mảng.

array[0] = "test"; 

Vì điều này sửa đổi nội dung chứ không phải chính mảng đó.

Điều tương tự cũng có đối với mọi đối tượng có thể thay đổi.

+0

nhưng mảng [0] cũng là một tham chiếu đến chuỗi "kiểm tra", và chúng tôi đã lập trình lại nó mặc dù mảng là cuối cùng, do đó, đó là lý do tại sao bạn đã đề cập đến dòng này trong(). – YakRangi

+0

@Bayant_singh 'final String [] array' có nghĩa là nó là tham chiếu * là' final', không phải là đối tượng mà nó trỏ tới. – awksp

+0

@Bayant_singh Tôi nghĩ rằng bạn là đúng, từ ngữ của bạn là một chút mơ hồ mặc dù. Hãy nghĩ về nó như một cái tủ. Bằng cách làm cho tủ cuối cùng bạn đang xây dựng nó vào tường. Bạn không còn có thể di chuyển tủ nhưng bạn vẫn có thể đưa mọi thứ vào và lấy mọi thứ ra khỏi nó. –

13

Bạn phải đặt tĩnh final static hoặc xóa static.

Trong Java, tĩnh có nghĩa là nó là một biến/phương thức của một lớp, nó thuộc về toàn bộ lớp nhưng không thuộc về một trong các đối tượng nhất định của nó. Điều này có nghĩa là từ khóa tĩnh chỉ có thể được sử dụng trong một 'phạm vi lớp'.

Nói chung, trong C, bạn có thể có các biến được sắp xếp cục bộ được phân bổ tĩnh. Thật không may, điều này không được hỗ trợ trực tiếp trong Java. Nhưng bạn có thể đạt được hiệu quả tương tự bằng cách sử dụng các lớp lồng nhau.

Ví dụ: nội dung sau được phép nhưng đó là kỹ thuật kém, vì phạm vi của x lớn hơn nhiều so với mức cần thiết. Ngoài ra còn có sự phụ thuộc không rõ ràng giữa hai thành viên (x và getNextValue).

static int x = 42; 
public static int getNextValue() { 
    return ++x; 
} 

Một thực sự muốn làm những điều sau đây, nhưng nó không phải là quy phạm pháp luật:

public static int getNextValue() { 
    static int x = 42;    // not legal :-(
    return ++x; 
} 

Tuy nhiên bạn có thể làm điều này thay vào đó,

public static class getNext { 
    static int x = 42; 
    public static int value() { 
     return ++x; 
    } 
} 

Đó là kỹ thuật tốt hơn tại các chi phí của một số xấu xí.

+6

Chỉ vì Java không cho phép nó không có nghĩa là 'static' không thể có bất kỳ phương thức nào bên trong." Chắc chắn nó có thể, ví dụ: 'static int getNextCounter() {static int x = 0; return x ++; } 'có thể trả về các giá trị gia tăng, và bạn có thể tự tin rằng không có phương thức nào khác có thể sửa đổi' x' đó, bởi vì nó chỉ có phạm vi cho phương thức đó. Chỉ vì một cái gì đó không được bao gồm trong ngôn ngữ không có nghĩa là không có cách nào nó có thể có ý nghĩa. –

8

Những người khác đã giải thích cách giải quyết vấn đề này ở cấp mã hóa. Cho phép tôi giải thích lý do logic và triết học tại sao tĩnh trong một phương thức không có ý nghĩa. Bạn phải đặt câu hỏi "Bạn muốn biến này kéo dài bao lâu?".

  • biến thành viên bình thường kéo dài miễn là trường hợp chúng là một phần của;
  • biến được khai báo trong phương thức cho đến khi phương thức được thoát;
  • biến lớp tĩnh kéo dài tuổi thọ của lớp (ví dụ: mãi mãi đối với hầu hết các mục đích)

Vì vậy, bao lâu để bạn muốn biến 'tĩnh trong một phương pháp' của bạn sẽ kéo dài?Nếu nó cho đến khi kết thúc phương thức, thì bạn chỉ có thể sử dụng nó mà không cần tĩnh. Nếu đó là thời gian tồn tại của lớp, thì bạn có thể khai báo nó như là một biến thành viên tĩnh. tùy chọn khác là gì ở đó?

C++ cho phép các số liệu thống kê trong một phương thức, nhưng chúng kết thúc hoạt động giống như một biến lớp tĩnh, nhưng với phạm vi giảm. Ngay cả trong C++ chúng hiếm khi được sử dụng. Chúng cũng được lưu trữ giống như các biến thành viên tĩnh.

Các nhà thiết kế Java đã quyết định rằng số lượng nhỏ lợi ích không đáng giá thêm độ phức tạp của ngôn ngữ.

+5

"Nếu đó là thời gian tồn tại của lớp học, thì bạn có thể khai báo nó như là một biến thành viên tĩnh. Có những tùy chọn nào khác?" Nhưng những gì bạn không nhận được ở đây là đảm bảo rằng một số phương pháp khác trong lớp không sửa đổi nó. Đó là những gì một biến tĩnh trong một phương thức sẽ cung cấp cho bạn (như bạn chỉ ra): phạm vi giới hạn. Giới hạn phạm vi làm cho nó * dễ dàng hơn * để lý do về hành vi của một chương trình. –

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