回答
靜態和非靜態方法/類是完全不同的野獸。我們來看一個面向對象編程的例子。說我有一個名爲「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.如果代碼錯了,那實際上只是我掀起的一些僞代碼。
非常好的幫助,謝謝... – Sajad
我覺得你講什麼是靜態變量而不是類實例(沒有這個詞),靜態變量,我能想到的靜態方法之間的一個關聯的是,在你的靜態方法可以只能訪問靜態變量而不是實例變量。
類實例是存儲在內存中並通過類的類型的變量引用的對象。每個元素都有自己的狀態和自己的方法。例如:如果我們有一個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;
}
}
因此,有這類顏色將取決於實例。
我想OP是詢問Java而不是C#。 'Apple.size'之後缺少括號使我認爲你指的是對象屬性,而不是OP想要學習的東西。 – theGreenCabbage
訪問: 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-variables
在static-methods
和object-level-lock
採取可以通過member-variables
在member-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
}
}
}
請格式化您的代碼。 – theGreenCabbage
做了一個嘗試,希望現在更清楚.. – harsh
- 1. 使用靜態方法實例化類依賴關係
- 2. 靜態方法和實例方法C#
- 3. Python中的靜態和實例方法
- 4. 從靜態方法實例化子類
- 5. 類實例調用靜態方法
- 6. 靜態方法vs靜態實例
- 7. 具有靜態方法的靜態類和具有靜態方法的常規類之間有什麼不同?
- 8. 孿生靜態和實例方法
- 9. 類方法和實例方法之間的區別?
- 10. 跟進:類方法和實例方法之間的區別?
- 11. Mongoose'靜態'方法與'實例'方法
- 12. 靜態變量和靜態方法之間的區別
- 13. 靜態方法和靜態塊之間的線程安全
- 14. java.lang.Class實例和方法區域關係
- 15. 需要在靜態和非靜態方法中使用實例
- 16. 對象中的靜態方法和非靜態方法之間的區別
- 17. C#類實例的靜態方法VS靜態類的內存使用情況
- 18. 控制檯的靜態IO方法和Console.In/Out/Error的IO方法之間的差異和關係?
- 19. 同步靜態方法和非靜態方法之間的區別
- 20. 兩個類之間的關係示例
- 21. 非靜態類的實例之間共享的內部靜態類的靜態屬性?
- 22. 內存中的靜態方法和實例方法
- 23. 告訴TypeScript該類有靜態和實例方法
- 24. 什麼是靜態類與只有靜態方法的類之間的區別?
- 25. 將靜態方法放入靜態類並將實例方法放入靜態類中有什麼區別?
- 26. 靜態方法的Java實例變量
- 27. 靜態類和靜態方法
- 28. 新的類實例VS Singleton類VS靜態方法
- 29. 只有公共靜態方法與實例化類的類
- 30. 實例化超類中的子類靜態方法
如果一個變量是一個靜態類變量或者它是一個實例變量,那麼'final'修飾符就無關。 –