方法隐藏的区域在java中是适用的

时间:2016-07-16 12:09:15

标签: java

请让我更多地了解方法隐藏以及方法覆盖和方法隐藏之间的区别。感谢

例如。

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

为什么这个东西被称为方法隐藏而不是方法覆盖?

2 个答案:

答案 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关键字)。 因此,如果在子类中重新声明超类的静态方法,则不要覆盖静态方法,而是声明一个与超类中的哪一个无关的新静态方法。

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

如果你以超类为前缀,它就是被调用的超类的静态方法。

如果您使用子类作为前缀,那么它就是被调用的子类的静态方法。

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