2011-09-10 23 views
29

Không thể tìm thấy câu trả lời thỏa đáng ở bất kỳ đâu.Tại sao một lớp cấp cao nhất có thể là tĩnh trong Java?

+9

Nếu không biết bạn đã tìm thấy câu trả lời nào, có thể bạn sẽ chỉ nhận được câu trả lời không thỏa đáng hơn. – BoltClock

+0

@BoltClock .. tôi cũng tìm thấy những câu trả lời mà chỉ hỏi lý do cho một lớp như vậy nhưng không phải là lý do tại sao họ không thể tĩnh http://www.coderanch.com/t/515963/java-programmer-SCJP/ chứng nhận/Lớp không thể bảo vệ hoặc tĩnh ... và http://www.coderanch.com/t/523014/java/java/Why-Class-cannot-declared-as .. và http: // tải xuống .oracle.com/javase/tutorial/java/javaOO/nested.html – ngesh

Trả lời

58

Tất cả các lớp cấp cao nhất, theo định nghĩa, tĩnh.

Những gì static tóm tắt là một thể hiện của lớp có thể tự đứng vững. Hoặc, cách khác xung quanh: một lớp bên trong không tĩnh (= instance bên trong lớp) không thể tồn tại mà không có một thể hiện của lớp bên ngoài. Vì một lớp cấp cao nhất không có lớp ngoài, nên nó không thể là gì ngoài static.

tất cả các lớp cấp cao nhất là tĩnh, có từ khóa static ở định nghĩa cấp cao nhất là vô nghĩa.

Một số mã để chơi xung quanh với:

public class Foo { 

    public class Bar { 
     // Non-static innner class 
    } 

    public static class Baz { 
     // Static inner class 
    } 
} 

public class Example { 
    public static void main(String[] args) { 
     new Foo(); // this is ok 
     new Foo.Baz(); // this is ok 
     new Foo.Bar(); // does not compile! 

     Foo f = new Foo(); 
     Foo.Bar bar = f.new Bar(); //this works, but don't do this 
    } 
} 

tôi đặt "nhưng không làm điều này" trong đó bởi vì nó thiết kế mã thực sự xấu xí. Các lớp bên trong cá thể không được hiển thị bên ngoài lớp bên ngoài. Chúng chỉ nên được sử dụng từ bên trong lớp bên ngoài.

+2

@barend .. tại sao trình biên dịch lại phàn nàn khi tôi thêm từ khóa tĩnh – ngesh

+1

Từ khóa không có giá trị, do đó, chúng bỏ nó ra. Tôi nghĩ đây là một lựa chọn thiết kế về khả năng đọc. Bạn có điều tương tự với từ khóa 'public' khi bạn định nghĩa một phương thức trên một' giao diện' (nó chỉ là vô nghĩa), nhưng trong trường hợp đó chúng để nó trong. – Barend

+6

+1: lồng nhau 'enum' có hiệu quả' tĩnh' và 'final' nhưng bạn không thể sử dụng. –

2

static có thể được thêm vào các lớp lồng nhau của giao diện, mặc dù đây là mặc định.

Tôi tin rằng không thể thêm static vào các lớp cấp cao nhất vì ban đầu không có lớp lồng nhau và bạn không thể thêm tĩnh vào bất kỳ lớp nào.

Lớp lồng nhau sau được thêm vào và tĩnh có thể được thêm vào các lớp lồng nhau, tuy nhiên có xu hướng không thay đổi cú pháp nào nhiều hơn mức cần thiết để nó không được thêm vào các lớp cấp cao nhất. (vì không cần/lợi ích)

0

Tôi đoán bạn không hiểu đúng nếu bạn muốn thấy từ khóa "tĩnh" trong lớp ngoài.

Tóm lại, bạn sẽ sử dụng tính năng tĩnh trên lớp ngoài như thế nào?

public class Outer 
{ 
    public static int x = 0 ; 

} 

Bây giờ bạn sẽ làm Outer.x để truy cập biến tĩnh. Điều này có nghĩa là x chia sẻ một giá trị duy nhất trên tất cả các đối tượng của Outer.

Bây giờ chúng ta có điều đó, kết quả của từ khóa tĩnh trong lớp bên ngoài là gì? .

+1

Vì vậy, bạn có nghĩa là để ngụ ý rằng gửi bình luận như vậy ở đây là một điều xây dựng để làm gì? –

0

Bất cứ khi nào chúng tôi chạy một lớp JVM sẽ khởi tạo một đối tượng. JVM có thể tạo một số đối tượng, theo định nghĩa Tĩnh có nghĩa là bạn có cùng một bản sao cho tất cả các đối tượng. Do đó, nếu lớp trên cùng là tĩnh thì bất cứ khi nào bạn chạy chương trình, nó tạo một đối tượng và tiếp tục đi đến cùng một vị trí bộ nhớ.

0

chúng tôi không thể khai báo lớp bên ngoài (cấp cao nhất) là tĩnh vì từ khóa tĩnh có nghĩa là cung cấp bộ nhớ và thực thi logic mà không tạo đối tượng, lớp không có logic giá trị trực tiếp, vì vậy từ khóa tĩnh không được phép ở lớp bên ngoài.

2

Tôi đã đưa ra cùng một câu trả lời Why can't a Java class be declared as static?. Nhưng viết nó một lần nữa ở đây

Chúng ta nên xác định các thành viên như tĩnh mà

  1. nên được phổ biến cho tất cả các đối tượng của lớp.
  2. Nên thuộc về lớp học và có thể truy cập theo tên lớp học.
  3. Không cần một đối tượng của lớp học để truy cập chúng.

Giả sử chúng tôi định nghĩa lớp bên ngoài là tĩnh và giả sử chúng tôi được phép làm như vậy. Điều này có phục vụ bất kỳ mục đích nào hoặc cung cấp bất kỳ lợi thế nào cho nhà phát triển hoặc nó sẽ tạo ra sự mơ hồ và biến chứng cho cả nhà phát triển và người sáng tạo ngôn ngữ?

Hãy kiểm tra, xác định lớp bên ngoài là tĩnh sẽ phục vụ mục đích mà chúng tôi đã xác định ở trên hay không?

  1. Mọi lớp đều phổ biến với tất cả các đối tượng của nó và không cần phải làm cho nó tĩnh để có sẵn cho tất cả các đối tượng của nó.
  2. Chúng ta cần một tên lớp để truy cập các thành viên tĩnh bởi vì các thành viên này là một phần của lớp trong khi lớp ngoài là một phần của gói và chúng ta có thể truy cập trực tiếp lớp đó bằng cách chỉ viết package_name.class_name (tương tự class_name.static_field_name), một lần nữa không cần phải làm gì đã có sẵn theo mặc định.
  3. Chúng tôi không cần bất kỳ đối tượng nào để truy cập một lớp nếu nó hiển thị, chúng ta chỉ cần viết package_name.class_name để truy cập nó. Và theo định nghĩa, một lớp là một kế hoạch chi tiết cho các đối tượng của nó và chúng ta tạo một lớp để tạo các đối tượng từ nó (ngoại lệ sẽ luôn có ở đó, ví dụ java.lang.Math), một lần nữa không cần phải định nghĩa một lớp ngoài là tĩnh.

Từ các điểm trên, chúng tôi có thể nói người sáng tạo Java đã không cho phép lớp bên ngoài tĩnh vì không cần làm cho nó tĩnh. Cho phép làm cho lớp bên ngoài tĩnh sẽ chỉ làm tăng các biến chứng, mơ hồ và trùng lặp. Đọc thêm trên Why An Outer Java Class Can’t Be Static

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