请让我知道更多关于方法隐藏和方法覆盖与方法隐藏有什么区别。谢谢其中隐藏方法隐藏的地方适用于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