2016-07-16 80 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关键字)可以被覆盖。 因此,如果在子类中重新声明超类的静态方法,则不会重写静态方法,而是声明与超类中的哪个无关的新静态方法。

因此,当您调用静态方法时,有效的调用方法取决于在静态方法调用之前添加了哪个类名称。

如果你使用超级类的前缀,它是被调用的超类的静态方法。

如果你使用子类的前缀,它是被调用的子类的静态方法。

就我个人而言,我发现“隐藏”这个术语对理解概念不是很有帮助。