【问题标题】:in which areas method hiding is aplicable in javajava中哪些领域方法隐藏适用
【发布时间】:2016-07-16 12:09:14
【问题描述】:

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

例如

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

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

【问题讨论】:

标签: java


【解决方案1】:

记住这一点:

  • 静态方法属于该类。
  • 非静态方法属于对象。

现在看看这段代码:

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() 静态方法被 Dog 类隐藏。由于静态方法属于该类,并且dAnimal d = new Dog(); 行中声明为Animal,因此调用将引用Animal 类中的方法。

不是静态的print() 方法被 Dog 类覆盖。由于非静态方法属于对象,并且d 变量指向Dog,因此调用将引用Dog 类中的方法。

【讨论】:

    【解决方案2】:

    只有实例方法(因此,没有 static 关键字)可以被覆盖。 所以,如果在子类中,你重新声明了超类的静态方法,你不重写静态方法,你声明了一个新的静态方法,与哪个超类没有关系。

    所以当你调用静态方法时,有效的调用方法取决于在静态方法调用之前加上哪个类名前缀。

    如果加上超类前缀,就是调用超类的静态方法。

    如果以子类为前缀,则调用的是子类的静态方法。

    就我个人而言,我发现“隐藏”一词对理解这个概念没有多大帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多