请让我更多地了解方法隐藏以及方法覆盖和方法隐藏之间的区别。感谢
例如。
class Test
{
public static void m1(){}
}
class Test2 extends Test
{
public static void m1(){}
}
为什么这个东西被称为方法隐藏而不是方法覆盖?
答案 0 :(得分: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");
}
}
Dog类隐藏了printStatic()
静态方法。由于静态方法属于类,d
在行Animal
中声明为Animal d = new Dog();
,因此调用将引用Animal类中的方法。
不是静态的print()
方法被Dog类覆盖。由于非静态方法属于对象,并且d
变量指向Dog
,因此调用将引用Dog类中的方法。
答案 1 :(得分:0)
只能覆盖实例方法(因此,不使用static关键字)。 因此,如果在子类中重新声明超类的静态方法,则不要覆盖静态方法,而是声明一个与超类中的哪一个无关的新静态方法。
因此,当您调用静态方法时,有效的调用方法取决于在静态方法调用之前为哪个类名添加前缀。
如果你以超类为前缀,它就是被调用的超类的静态方法。
如果您使用子类作为前缀,那么它就是被调用的子类的静态方法。
就个人而言,我发现"隐藏"术语对于理解这个概念并不是很有帮助。