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?
Trả lời
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
.
Vì 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.
@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
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
+1: lồng nhau 'enum' có hiệu quả' tĩnh' và 'final' nhưng bạn không thể sử dụng. –
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)
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ì? .
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ì? –
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ớ.
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.
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à
- nên được phổ biến cho tất cả các đối tượng của lớp.
- Nên thuộc về lớp học và có thể truy cập theo tên lớp học.
- 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?
- 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ó.
- 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.
- 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
- 1. Tại sao giao diện chỉ có thể được khai báo trong lớp cấp cao nhất?
- 2. tại sao hằng số java được khai báo là tĩnh?
- 3. Tại sao trong mẫu ViewHolder lớp ViewHolder nên tĩnh?
- 4. Tại sao các lớp tĩnh có thể chỉ có các thành viên tĩnh?
- 5. Tại sao tôi không thể tạo một enum trong một lớp bên trong trong Java?
- 6. Tại sao DialogFragment không thể là một lớp bên trong?
- 7. Tại sao tôi không thể kế thừa các lớp tĩnh?
- 8. Tuyên bố cấp cao nhất trong Python là gì?
- 9. Có thể tạo một số lớp cấp cao nhất với một lời gọi macro trong scala 2.10 không?
- 10. Tại sao các lớp tĩnh không có destructors?
- 11. Java: tại sao Thread.sleep() và yield() là tĩnh?
- 12. Tại sao lớp System.Random không tĩnh?
- 13. Tại sao JavaMail Transport.send() là một phương thức tĩnh?
- 14. C# lớp tĩnh tại sao sử dụng?
- 15. Lớp C# - Tại sao có quá nhiều phương pháp tĩnh?
- 16. Tại sao sử dụng một lớp như là một thực hành cấu trúc xấu trong Java?
- 17. Tại sao cần thiết để đánh dấu một lớp là có thể tuần tự hóa?
- 18. Loại có mức độ cao hơn — tại sao có thể là Scala nhưng không phải F #?
- 19. Tại sao một Java enum không thể là cuối cùng?
- 20. Có phải là một lớp trong java?
- 21. Tại sao các toán tử không thể bị quá tải bên trong một lớp tĩnh?
- 22. Trong PHP, tại sao tôi có thể truy cập phương thức không tĩnh theo cách tĩnh?
- 23. Tại sao String là một lớp học?
- 24. Tại sao tôi không thể có một thành viên const tĩnh không tách rời trong một lớp học?
- 25. Tại sao một lớp được phép có một thành viên tĩnh của chính nó, nhưng không phải là một thành viên không tĩnh?
- 26. Số trong tên miền cấp cao nhất?
- 27. intrusive_ptr: Tại sao không phải là một lớp cơ sở chung được cung cấp?
- 28. Tại sao toBinaryString không phải là một phương thức thể hiện trong lớp Integer?
- 29. Tại sao phải có phương thức ClassInitialize là tĩnh?
- 30. Tại sao các lớp tĩnh không có các phương thức và biến không tĩnh?
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
@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