請讓我知道更多關於方法隱藏和方法覆蓋與方法隱藏有什麼區別。謝謝其中隱藏方法隱藏的地方適用於java
例如,
class Test
{
public static void m1(){}
}
class Test2 extends Test
{
public static void m1(){}
}
爲什麼這個東西被稱爲方法隱藏而不是方法重寫?
請讓我知道更多關於方法隱藏和方法覆蓋與方法隱藏有什麼區別。謝謝其中隱藏方法隱藏的地方適用於java
例如,
class Test
{
public static void m1(){}
}
class Test2 extends Test
{
public static void m1(){}
}
爲什麼這個東西被稱爲方法隱藏而不是方法重寫?
有考慮到這一點:
現在來看看這段代碼:
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類中的方法。
只有實例方法(因此沒有static關鍵字)可以被覆蓋。 因此,如果在子類中重新聲明超類的靜態方法,則不會重寫靜態方法,而是聲明與超類中的哪個無關的新靜態方法。
因此,當您調用靜態方法時,有效的調用方法取決於在靜態方法調用之前添加了哪個類名稱。
如果你使用超級類的前綴,它是被調用的超類的靜態方法。
如果你使用子類的前綴,它是被調用的子類的靜態方法。
就我個人而言,我發現「隱藏」這個術語對理解概念不是很有幫助。
可能重複[爲什麼稱爲「方法隱藏」?](http://stackoverflow.com/questions/33666148/why-is-it-called-method-hiding) – VatsalSura
靜態方法不能被重寫因爲它是一個類的一部分,而不是一個對象 – Unknown