Như tiêu đề cho thấy tôi muốn hiểu tại sao các lớp tĩnh chỉ có thể có các thành viên tĩnh. Tôi hy vọng nó giống nhau trong tất cả các ngôn ngữ lập trình. Vì vậy, lời giải thích sẽ giống nhau cho tất cả các ngôn ngữ, tôi tin.Tại sao các lớp tĩnh có thể chỉ có các thành viên tĩnh?
Trả lời
Các lớp tĩnh không thể được khởi tạo do đó nó sẽ không có bất kỳ cá thể nào, các thành viên không tĩnh sẽ yêu cầu một cá thể lớp của chúng để truy cập. Vì lớp tĩnh không thể có bất kỳ cá thể nào, bạn không thể truy cập các thành viên không tĩnh nếu có.
Do đó các lớp tĩnh chỉ có thể có các thành viên tĩnh
Có lẽ vì các phương pháp thể hiện không bao giờ được gọi.
Nếu bạn đặt một thành viên không tĩnh trong một lớp tĩnh, nó sẽ không phải là một lớp tĩnh. (Bạn không thể khởi tạo một lớp tĩnh - để có các thành viên không tĩnh, bạn sẽ phải có thể tạo ra các cá thể của lớp để gọi các thành viên đó - mà sẽ làm cho nó trở thành một lớp thông thường)
Để xem nó một cách khác, bằng cách đánh dấu một lớp là tĩnh, bạn đang cố tình yêu cầu trình biên dịch không cho phép bạn đặt các phương thức không tĩnh trong lớp đó - đây là một quyết định thiết kế mà bạn đã thực hiện, và trình biên dịch giúp kiểm tra xem bạn có làm theo thiết kế.
Không thể khởi tạo lớp tĩnh. Do đó, các thành viên không tĩnh không bao giờ có thể được truy cập.
Nếu bạn muốn kết hợp và khớp các thành viên tĩnh, đừng làm cho lớp tĩnh.
Nó không phải là một quyết định thiết kế, nhiều như một quyết định hợp lý. Nơi dễ nhất để bắt đầu là bằng cách xem các định nghĩa có liên quan của các khái niệm:
Lớp tĩnh là lớp không thể khởi tạo được. Điều đó có nghĩa là bạn không thể tạo các đối tượng thuộc loại của lớp đó.
Thành viên không tĩnh được gắn với một phiên bản cụ thể của một lớp học. Chúng chứa dữ liệu được liên kết độc quyền với một đối tượng duy nhất thuộc loại lớp đó. Vì vậy, nếu một lớp tĩnh chứa các thành viên không tĩnh, bạn không bao giờ có thể truy cập dữ liệu đó hoặc gọi phương thức đó vì bạn không bao giờ có thể khởi tạo một đối tượng thuộc loại của lớp tĩnh đó. Thay vào đó, bạn phải có tất cả static thành viên có thể được gọi trực tiếp từ một phiên bản tĩnh của lớp.
Tuy nhiên, bạn có thể có các lớp không tĩnh chứa thành viên tĩnh. Bằng cách này, bạn có thể truy cập dữ liệu hoặc gọi các phương thức được hiển thị dưới dạng thành viên tĩnh mà không instantiating một đối tượng của lớp đó. Tuy nhiên, bạn có thể cũng khởi tạo một đối tượng thuộc loại của lớp đó và truy cập vào các thành viên không tĩnh (hoặc thể hiện). Ví dụ: nếu bạn có một lớp học Circle
, bạn có thể có các thành viên tĩnh như một hàm CalculateArea
và trường PI
. Các thành viên này có thể áp dụng cho tất cả các vòng kết nối, nói chung, chỉ vì thực tế rằng họ là những vòng kết nối. Nhưng bạn cũng có thể có các thành viên không tĩnh được liên kết với các trường hợp cụ thể của lớp đó, vì chúng mô tả các đối tượng vòng tròn cụ thể. Đây có thể là các trường Diameter
và Circumference
.Bạn cũng có thể có các hàm không tĩnh tính toán diện tích của vòng tròn, được cung cấp dữ liệu được lưu trữ trong các trường không tĩnh cho trường hợp cụ thể đó.
Tôi không chắc chắn nếu điều này có liên quan nhưng (trong C# .net 4.0 ít nhất) một lớp tĩnh có thể chứa các định nghĩa lớp không tĩnh có chứa các thành viên không tĩnh. Vì vậy, có vẻ như bạn có thể thêm các thành viên không tĩnh vào một lớp tĩnh vì một kiểu lồng nhau được coi là một member.
Ví dụ:
public static class MyClass
{
/// <summary>
/// This non-static class is accessible and able to be instantiated through the
/// static class MyClass.
/// </summary>
public class Type1
{
public String prop1 { get; set; }
public String funct1(String result)
{
return result;
}
}
/// <summary>
/// This function is inaccessible since it requires an instance of MyClass.
/// It will also cause a compile error.
/// </summary>
/// <returns></returns>
public String nonStaticFunc()
{
return "aString";
}
/// <summary>
/// This function is accessible through the MyClass type because it is also static
/// and therefore does not require a class instance.
/// </summary>
/// <returns></returns>
public static String staticFunc(String str)
{
return str;
}
}
Như bạn có thể thấy, lớp MyClass tĩnh có Type1 định nghĩa lớp không tĩnh mà phải được instanced để sử dụng. Trong khi hàm tĩnh staticFunc trong MyClass không cần một cá thể để truy cập.
//Valid operations
String result = MyClass.staticFunc("result"); //No class instance.
MyClass.Type1 someObj = new MyClass.Type1(); //Class instance from static class containing non-static nested type.
someObj.prop1 = someObj.funct1("hi");
- 1. Tại sao không có khái niệm "const-correctness" cho các hàm thành viên tĩnh của lớp?
- 2. Các thành viên lớp tĩnh python
- 3. Các thành viên tĩnh của một lớp thể hiện
- 4. Lớp Singleton so với lớp có thành viên tĩnh
- 5. 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?
- 6. Tại sao các lớp tĩnh không có destructors?
- 7. khởi In-lớp của các thành viên dữ liệu tĩnh
- 8. Các thành viên tĩnh của một lớp chung có gắn với cá thể cụ thể không?
- 9. Thành viên lớp học "tĩnh"
- 10. Tại sao chúng ta không thể sử dụng các thành viên const trong các hàm thành viên tĩnh?
- 11. Namespace và các thành viên lớp tĩnh liên kết
- 12. ADL có tra cứu các hàm thành viên tĩnh không?
- 13. Khởi tạo các thành viên tĩnh của một lớp templated
- 14. Cấu trúc tĩnh với các thành viên tĩnh
- 15. biến thành viên có thể thay đổi tĩnh trong C++?
- 16. Tại sao tôi không thể kế thừa các lớp tĩnh?
- 17. CUDA: Tại sao không thể định nghĩa các hàm thành viên toàn cầu tĩnh?
- 18. Trong Java, các thành viên lớp tĩnh có được chia sẻ giữa các chương trình không?
- 19. Tĩnh khẳng định để kiểm tra các thành viên dữ liệu lớp const tĩnh?
- 20. Tại sao các lớp tĩnh được sử dụng?
- 21. tại sao giao diện không thể có phương pháp thành viên tĩnh
- 22. Chức năng thành viên tĩnh
- 23. 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?
- 24. Java: Tạo thành viên lớp tĩnh có nhà xây dựng có thể ném một ngoại lệ
- 25. 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?
- 26. Xác định các thành viên tĩnh trong C++
- 27. Các lớp học chung có chia sẻ thành viên tĩnh không?
- 28. Thành viên riêng: Tĩnh const so với chỉ const
- 29. Không thể khai báo các thành viên cá thể trong một lớp tĩnh trong C#
- 30. Tại sao có thể gọi hàm thành viên không tĩnh mà không có một cá thể đối tượng?
Nghe có vẻ hơi lộn xộn một chút ... bạn có nghĩ vậy không? Mục đích nào sẽ cho phép các thành viên không tĩnh trong một lớp tĩnh? – mpen
Tôi biết quy tắc 'lớp tĩnh không thể có các thành viên không tĩnh'. Nhưng tôi muốn hiểu tại sao. Trong thực tế, tôi mong đợi nhiều câu trả lời geeky về bộ nhớ như các lớp tĩnh và các thành viên của chúng được lưu trữ như thế nào và các lớp và các thành viên không tĩnh được lưu trữ như thế nào. :) – NLV