2013-12-19 39 views
1

類實例(例如,由static/final聲明的變量)和靜態方法(例如類方法)之間是否有任何特定關係?類實例和靜態方法之間的關係

我跳你明白我的意思。

+0

如果一個變量是一個靜態類變量或者它是一個實例變量,那麼'final'修飾符就無關。 –

回答

1

靜態和非靜態方法/類是完全不同的野獸。我們來看一個面向對象編程的例子。說我有一個名爲「Person」的類,它有一個叫Person()構造,以聲明爲myAge實例變量(設置爲0),並呼籲方法Birthday()

int myAge; 

public Person(){ 
    myAge = 0; 
} 

public void Birthday(){ 
    myAge += 1; 
} 

在我main方法,這個類使用這樣的:

Person Sajjad = new Person(); 
Sajjad.Birthday(); 

當我創建一個新的人,這是你的,你的年齡是0,因爲我們的構造函數的默認值是0 myAge。一旦我對你應用Birthday()方法,你的年齡就會增加1。

至於static方法,其中沒有面向對象的原則。有它的用途..我通常用它來簡單的數學。

public static double addValues(double a, double b){ 
    return a + b; 
} 

在我main

int sum; 
sum = addValues(1, 2); 
System.out.println(sum); 

輸出:

3

見上面怎麼沒有必要宣佈一個新的對象?靜態方法更容易原型化,但從長遠來看,我肯定會遵循面向對象的原則,因爲它使得從長遠來看維護代碼變得容易得多。另外,我不需要用不必要的代碼行來混淆我的主要方法。

P.S.如果代碼錯了,那實際上只是我掀起的一些僞代碼。

+1

非常好的幫助,謝謝... – Sajad

2

我覺得你講什麼是靜態變量而不是類實例(沒有這個詞),靜態變量,我能想到的靜態方法之間的一個關聯的是,在你的靜態方法可以只能訪問靜態變量而不是實例變量

1

類實例是存儲在內存中並通過類的類型的變量引用的對象。每個元素都有自己的狀態和自己的方法。例如:如果我們有一個Apple類和getColor非靜態元素:

Apple a = new Apple("green"); 
Apple b = new Apple("red"); 
a.getColor();//green 
b.getColor();//red 

靜態方法/變量是與該類並通過類的名稱加入的元素。您無法從實例訪問靜態元素。例如:如果我們有一個Apple類和size靜態元素:

Apple.tree; //Apple Tree 

這裏的類蘋果

class Apple { 
    public static String tree = "Apple Tree"; // Class related 
    private String color; //object instance related 

    public Apple(String color) { 
     this.color = color; 
    } 

    public String getColor() { 
     return this.color; 
    } 
} 

因此,有這類顏色將取決於實例。

+0

我想OP是詢問Java而不是C#。 'Apple.size'之後缺少括號使我認爲你指的是對象屬性,而不是OP想要學習的東西。 – theGreenCabbage

1

訪問: class instance (i.e variables that declared by static/final)static方法可以在不對象引用的明確需要共同努力。而訪問成員變量(又名實例變量),你需要通過對象引用訪問。

class Test { 
    static String str = "asdf"; 
    int num = 10; 

    static void methodA() { 
     System.out.println("Static variable direct access: " + str); 
     System.out.println("Member variable access : " + new Test().num); 
    } 
} 

併發: 其他不同的是併發訪問或線程安全的邏輯中,class-level-lock可以通過class-variablesstatic-methodsobject-level-lock採取可以通過member-variablesmember-methods採取雖然你可以混合正賽ofcourse 。

class Test { 
    static Object CLASS_LOCK = new Object(); 
    Object MEMBER_LOCK = new Object(); 
    Test sharedTest = new Test(); // or created in different manner 

    static void methodA() { 
     synchronized (CLASS_LOCK) { 
      // .. thread-safe code 
     } 

     synchronized (sharedTest.MEMBER_LOCK) { 
      // .. thread-safe code 
     } 
    } 
} 
+0

請格式化您的代碼。 – theGreenCabbage

+0

做了一個嘗試,希望現在更清楚.. – harsh

相關問題