回答
靜態類與非靜態類基本相同,但有一點不同:靜態類不能實例化。換句話說,您不能使用new關鍵字來創建類類型的變量。因爲沒有實例變量,您使用類名稱本身
靜態類只有一個類本身的實例,所以你不能創建一個靜態類的多個實例訪問靜態類的成員。
看着你的問題,你不能同時設置兩個不同的值下面的屬性,如果類是靜態的,因爲只會有一個ClassName
內存
ClassName.MemberName
更多信息以
實例非靜態類的優點是靜態類是可怕的單元測試 - 他們不能輕易被嘲笑,他們不支持接口。
說你需要存儲的信息和操作encapsulate僱員。
class Employee
{
string Name {get; set;}
double HourlyRate {get; set;}
double CalculatePay(int hoursWorked) { . . . }
}
現在,讓我們說您的程序需要同時比較兩個員工嗎?
正是!使用非靜態員工類,您可以實例化Employee類的兩個(或更多)instances,這些objects中的每一個代表不同的Employee。
你不能這樣做員工是靜態的。
例如
void CompareEmployees(Employee empA, Employee empB)
{
if(empA.HourlyRate < empB.HourlyRate)
Console.WriteLine("Employee {0} has a higher rate than {1}", empA.Name, empB.Name);
else if(empA.HourlyRate > empB.HourlyRate)
Console.WriteLine("Employee {0} has a higher rate {1}", empb.Name, empA.Name);
else
Console.WriteLine("{0} and {1} have the same rate", empb.Name, empA.Name);
}
認爲一個類爲類(對象)的建築藍圖和實例爲依據的藍本設計建造的建築。
給定一個藍圖,你可以創建許多建築物。這些建築物中的每一個都有相同的結構,但每個都是獨立的 - 一個門可以打開,另一個門關閉。
靜態類就像是永遠不能用來建造房屋的任何一個藍圖。你仍然可以做一些事情,比如把它撕掉或者灑上咖啡,但是你不可能在藍圖上打開門,因爲它沒有真正的門,只有門的設計。
描述這種情況的另一種方法是考慮'狀態'。建築物(物體)具有某種狀態(例如,門是否打開),並且每個建築物的狀態可以不同(例如,它是否是自己的門是打開的)。藍圖(課程)也可以具有(靜態)狀態(例如,咖啡是否灑落在其上),但與根據藍圖建造的建築物相關的狀態不同並且分開。
public class House {
private static boolean isCoffeeSpilt;
private boolean isDoorOpen;
public static void spillCoffee() {
House.isCoffeeSpilt = true;
}
public void openDoor() {
isDoorOpen = true;
}
}
public static class Program {
public static void main(String[] args) {
House redHouse = new House(); // 1
House blueHouse = new House(); // 2
redHouse.openDoor(); // 3
House.spillCoffee(); // 4
}
}
在上面的例子中,線1,2,和3將是不可能的,如果是House
一個靜態類。請注意,在House
的實例上調用openDoor
,而在該類本身上調用spillCoffee
。還要注意的是,在第4行,紅房子的門打開了,但藍房子的門仍然關着。
靜態類不能被實例化(在技術上它是,但只有一次),靜態構造函數是「一般」的首次訪問類,它可以是很難跟蹤和協調調用。 如果你想要一個只收集一些實用方法的類,靜態類很好。 .net框架中的數學就是一個很好的例子。它們對於extension methods也是有用的。除此之外,我不使用它們。
如果你需要一個實例,並且不希望被綁定到一個靜態類有限制,單例模式是非常有用的。關於單例和靜態類之間的區別的一個nice article。
當然,非靜態類必須實例化,存儲在一個變量中,並且可以多次實例化。
例子:
靜態類,用於加載文件只是輔助方法:
static class TextureHelper
{
public static byte[] LoadFromFile(string aFileName);
}
一個Singleton是主要的點來創建紋理。
public sealed class TextureManager
{
public static TextureManager Instance{get;set;}
public Texture CreateTexture();
}
一個實際的紋理,我可能在我的應用程序中有很多。
public class Texture
{
}
- 1. 靜態類和非靜態類有什麼區別?
- 2. 靜態與非靜態類
- 3. C#靜態類 - 靜態類不能有非靜態成員
- 4. 使用Java將內部類設爲靜態有什麼優勢?
- 5. 爲什麼C#靜態類包含非靜態類/結構體?
- 6. 從靜態類觸發非靜態類?
- 7. 訪問非靜態類的靜態類
- 8. Combinig靜態類和非靜態類
- 9. 非靜態類中的靜態方法和靜態類中的靜態方法有什麼區別?
- 10. 對於簡單功能靜態優於靜態優勢
- 11. 爲什麼可以調用非靜態類的靜態方法?
- 12. 非靜態類中靜態方法的要點是什麼?
- 13. 靜態類中的靜態變量和非靜態類中的靜態變量
- 14. C# - 非靜態類的靜態事件
- 15. 使用靜態或非靜態類
- 16. c#靜態或非靜態類
- 17. 聲明非靜態類靜態
- 18. 非靜態類的靜態成員?
- 19. 聲明類的靜態和非靜態
- 20. Java:非靜態類和靜態調用
- 21. 非靜態...靜態是什麼?
- 22. 靜態主類靜態類?
- 23. 想從非靜態類訪問靜態成員的非靜態子類的Java
- 24. PHP:靜態優於非靜態?
- 25. 靜態鏈接優勢
- 26. 爲什麼所有靜態方法/變量都在非靜態類中?
- 27. 爲什麼靜態類不能有非靜態方法和變量?
- 28. 靜態函數與類的靜態指針有什麼區別
- 29. 爲什麼靜態類只能有靜態成員?
- 30. 無法對非靜態類成員進行靜態引用
您也可以直接使用'ClassName.MemberName'如果'MemberName'是靜態的,但該類不是。當你不(並且永遠不會)創建它的實例時,使類成爲靜態的。這是擴展類的必備條件。 –
那麼只有一個MemberName?使用靜態類如何實現'人'? –
從http://stackoverflow.com/questions/576853/what-is-the-use-of-a-static-class開始 – V4Vendetta