2011-06-03 30 views
1

我腦海中有一個懷疑....有關的任何靜態的概念......類似方法,成員等

1)我們可以稱之爲&訪問任何非靜態方法,但任何靜態方法或變量靜態方法我們不能訪問任何非靜態方法或變量..... why。

2)但我們可以從靜態方法創建任何類的實例。

請告訴我理解我的問題更好的答案的理由。

class Class1 
{ 
    static int x=0; 
    int w = 0; 
    private static Class2 test() 
    { 
     w = 88; // give error because w is not a static member. 
     test1(); // give error because test1() is not a static function. 
     Class2 z = new Class2(); // here i am creating instance of class2 
     return z; 
    } 

    private int test1() 
    { 
     x = 9; 
     return x; 
    } 
} 

class Class2 
{ 

} 

感謝

回答

1

瞭解您首先必須瞭解class與實際object之間差異的原因。 我可以定義一個類像下面這樣:

public class Car 
{ 
    public string Brand {get; set;} 
} 

什麼,我會算命這個編譯器是一個Car會是什麼樣子,如果我在哪裏創建這樣的事情。目前沒有Car創建,但計算機瞭解汽車是什麼。我們已經給它一個藍圖。這就是所謂的class

接下來,我可以去真正開創汽車:

Car myCar = new Car(); 
myCar.Brand = "Ford"; 
Car otherCar = new Car(); 
otherCar.Brand = "BMW"; 

現在myCar包含實際object,我告訴計算機它是一輛跑車。我還在otherCar中創建了另一輛車。這些都是單獨的對象。並且都有自己的屬於該對象的Name

所以,現在我們有2個對象,但仍然只有1個類。

現在有時會出現需要爲methods有某種聯繫的概念Car但不要求特定Car上下工夫properties。在C#中,我們可以使用static關鍵字來定義這些成員。

我們可以添加以下method我們班:

public static Car GetFirstCarEverBuild(); 

要真正發現是有史以來建造我們並不需要訪問特定汽車的第一輛汽車。我們會盡力在這裏找到一輛車,但我們並不是從一輛車開始。所以我們標記它static。這也意味着我們必須進入Brand的車,因爲我們沒有object從中獲得它。這種情況甚至可能完全沒有創建Car這種方法只能返回Null。沒有汽車曾經存在過,你不需要一輛車就能找到。

同樣也適用於靜態字段和屬性:

public static Car firstCar; 

此字段可以存儲1臺車和1只。不管你創造多少輛車。它的價值與班級而不是對象聯繫在一起。因此,如果myCar將在此字段中存儲值,則otherCar可以讀取相同的值。

請看下面的例子來總結這一切:

public class Car 
{ 
    public static Car firstCar; 

    public Car() 
    { 
    if (firstCar == null) 
     firstCar = this; 
    } 

    public string Brand {get; set;} 

    public static Car GetFirstCarEverBuild() 
    { 
    return firstCar; 
    } 
} 
1

這是你不能調用一個空對象的方法同樣的原因 - 非靜態方法/場/屬性需要對抗調用類型的實例。

3

看看關於靜態類的MSDN文章和關於靜態類的basic tutorial

在回答你的直接問題時,靜態方法不是實例化對象的一部分(this),因此無法訪問需要實例化對象的任何方法/字段。

在你的例子中,test1()可以很容易地在字段w上操作。在這種情況下,外部呼叫者可以呼叫Class1.test()而不創建任何Class1的字段。如果Class1已經實例化,其字段已創建,因此可以運行。

我發現這個Stackoverflow Post這是值得閱讀的靜態一些更多的背景。

2

1)我們可以調用&從任何非靜態方法訪問任何靜態方法或變量,但是從靜態方法我們不能訪問任何非靜態方法或變量..... why。

您無法從靜態方法調用訪問非靜態變量或方法的原因是因爲它們尚未創建,更重要的是不存在於內存中。靜態方法不會調用它所屬的非靜態類的構造函數。

2)但我們可以從靜態方法創建任何類的實例。

任何在靜態方法中聲明和實例化的東西仍然會分配內存(記住範圍),所以它們是可用的,但只能在該靜態方法中使用。例如,你不能從靜態方法中分配非靜態類的成員。

此鏈接可能有助於更詳細地解釋它。

Static keyword demystified

0

您必須獲得對靜態和實例成員有基本的瞭解。

+0

這並不能真正幫助OP,因爲這正是他們正在尋求的。 – 2011-06-03 13:50:36

1

想象一下,你有這個類:

Class Product { 
    static int getTotalWeightOfAllProducts() 
    int getWeight() 
} 

的原因,你永遠不會有意從靜態方法調用一個實例方法因爲它沒有意義。 假設您有2個產品。

電腦和Xbox。 像這樣

var xbox = new Product() 
var computer = new Product() 
xbox.getWeight() // would return the xbox weight 
computer.getWeight() // would return the computer weight 

// But calling getWeight like this doesn't make sense 
Product.getWeight() //because weight is product specific thing to do 

//However getting all products total weight would make sense to return through a static call like this: 
Product.getTotalWeightOfAllProducts() // because "getting all products total weight" isn't a product specific thing to do. Therefore it should reside in a static method. 

基本上實例方法是「產品」特異性行爲和靜態方法是共享的「產品」的功能。不知道這是否有道理。

getTotalWeightOfAllProducts甚至不知道xboxcomputer實例存在,因此從getTotalWeightOfAllProducts內調用getWeight()是沒有意義的。因爲即使有可能,它會返回什麼?電腦的重量或電腦的重量?