java对静态方法有向上投射的效果吗?

9bfwbjaz  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(269)

为什么当我们在基类和派生类中声明方法为静态并进行向上转换时,它调用基类方法。

class Base
{
    static void show(){
        System.out.println("Base class....");
    }
}
class Derive extends Base
{
    static void show(){
        System.out.println("Drive class....");
    }//method hidding.....

    public static void main(String[] args) 
    {
        Base b= new Derive();
            b.show();           
    }
}
hwamh0ep

hwamh0ep1#

这里有几个问题值得一提:
静态方法不被继承,也不被子类重写
静态方法不需要调用示例,它们需要一个类
所以,基本上,打电话 b.show(); 实际上意味着打电话 Base.show();

ldxq2e6h

ldxq2e6h2#

只需再完成一个以上的答案。最好通过类而不是示例变量调用类方法: Base.show() 不是 b.show() 明确该方法是静态方法。这在隐藏方法而不是重写方法时特别有用。

piok6c0g

piok6c0g3#

你在打电话吗 Base.show ,不是 Derive.show . 方法隐藏未重写。
§8.4.8.2. java语言规范的一部分给出了一个示例,它准确地演示了这里发生的事情:
一个班级( static )可以使用类型为实际包含方法声明的类的引用来调用隐藏的方法。在这方面,隐藏 static 方法不同于重写示例方法。例如:

class Super {
    static String greeting() { return "Goodnight"; }
    String name() { return "Richard"; }
}
class Sub extends Super {
    static String greeting() { return "Hello"; }
    String name() { return "Dick"; }
}
class Test {
    public static void main(String[] args) {
        Super s = new Sub();
        System.out.println(s.greeting() + ", " + s.name());
    }
}

生成输出: Goodnight, Dick 因为问候语的调用使用 s ,即 Super ,以确定在编译时调用哪个类方法,而 name 使用 s ,即 Sub ,以在运行时确定要调用哪个示例方法。

相关问题