2010-12-11 38 views
7

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?

+3

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

+0

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

Trả lời

14

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

2

Có lẽ vì các phương pháp thể hiện không bao giờ được gọi.

1

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ế.

4

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.

7

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 DiameterCircumference.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ể đó.

-1

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"); 
Các vấn đề liên quan