2016-07-16 65 views
0

請讓我知道更多關於方法隱藏和方法覆蓋與方法隱藏有什麼區別。謝謝其中隱藏方法隱藏的地方適用於java

例如,

class Test 
{ 
    public static void m1(){} 
} 
class Test2 extends Test 
{ 
    public static void m1(){} 
} 

爲什麼這個東西被稱爲方法隱藏而不是方法重寫?

+2

可能重複[爲什麼稱爲「方法隱藏」?](http://stackoverflow.com/questions/33666148/why-is-it-called-method-hiding) – VatsalSura

+1

靜態方法不能被重寫因爲它是一個類的一部分,而不是一個對象 – Unknown

回答

0

有考慮到這一點:

  • 靜態方法屬於類。
  • 非靜態方法屬於該對象。

現在來看看這段代碼:

public class Test { 
    public static void main(String[] args) { 
     Animal d = new Dog(); 
     d.printStatic(); //prints "Animal" 
     d.print();  //prints "Dog" 
    } 
} 

class Animal { 
    static void printStatic() { 
     System.out.println("Animal"); 
    } 
    void print() { 
     System.out.println("Animal"); 
    } 
} 

class Dog extends Animal { 
    static void printStatic() { 
     System.out.println("Dog"); 
    } 
    void print() { 
     System.out.println("Dog"); 
    } 
} 

printStatic()方法是靜態的,由狗類隱。由於靜態方法屬於該類,並且d在行Animal d = new Dog();中被聲明爲Animal,因此調用將引用Animal類中的方法。

print()方法不是 static,被Dog類重寫。由於非靜態方法屬於該對象,並且d變量指向Dog,因此調用將引用Dog類中的方法。

0

只有實例方法(因此沒有static關鍵字)可以被覆蓋。 因此,如果在子類中重新聲明超類的靜態方法,則不會重寫靜態方法,而是聲明與超類中的哪個無關的新靜態方法。

因此,當您調用靜態方法時,有效的調用方法取決於在靜態方法調用之前添加了哪個類名稱。

如果你使用超級類的前綴,它是被調用的超類的靜態方法。

如果你使用子類的前綴,它是被調用的子類的靜態方法。

就我個人而言,我發現「隱藏」這個術語對理解概念不是很有幫助。