当前位置: 首页 > 面试题库 >

Java中隐藏的方法是什么?甚至JavaDoc的解释也令人困惑

郭星文
2023-03-14
问题内容

Javadoc说:

被调用的隐藏方法的版本是超类中的版本,被调用的重写方法的版本是子类中的版本。

不会向我敲钟。任何清楚的例子,表明其含义将不胜感激。


问题答案:
public class Animal {
    public static void foo() {
        System.out.println("Animal");
    }
}

public class Cat extends Animal {
    public static void foo() {  // hides Animal.foo()
        System.out.println("Cat");
    }
}

在这里,Cat.foo()据说藏起来了Animal.foo()。隐藏不像覆盖那样工作,因为静态方法不是多态的。因此,将发生以下情况:

Animal.foo(); // prints Animal
Cat.foo(); // prints Cat

Animal a = new Animal();
Animal b = new Cat();
Cat c = new Cat();
Animal d = null;

a.foo(); // should not be done. Prints Animal because the declared type of a is Animal
b.foo(); // should not be done. Prints Animal because the declared type of b is Animal
c.foo(); // should not be done. Prints Cat because the declared type of c is Cat
d.foo(); // should not be done. Prints Animal because the declared type of d is Animal

在实例而不是类上调用静态方法是一种非常糟糕的做法,绝不应该这样做。

将其与实例方法进行比较,实例方法是多态的,因此被覆盖。调用的方法取决于对象的具体运行时类型:

public class Animal {
    public void foo() {
        System.out.println("Animal");
    }
}

public class Cat extends Animal {
    public void foo() { // overrides Animal.foo()
        System.out.println("Cat");
    }
}

然后将发生以下情况:

Animal a = new Animal();
Animal b = new Cat();
Animal c = new Cat();
Animal d = null;

a.foo(); // prints Animal
b.foo(); // prints Cat
c.foo(); // prints Cat
d.foo(): // throws NullPointerException


 类似资料:
  • 问题内容: 就在我以为我了解适用于varargs的JLS15.12时,这是这个示例: 打印出来 我了解第一行:JLS15.12说方法解析是分阶段进行的,而阶段1和2忽略了varargs方法来确定是否存在兼容的方法,只有阶段1和2失败时才发生阶段3(包括varargs)。(请参阅JLS和此SO问题。)因此,如果适用,将始终被忽略。 但是我不明白为什么其他两行打印43。An 也是的实例,那么为什么它与

  • 本文向大家介绍命令解释器的目的是什么?,包括了命令解释器的目的是什么?的使用技巧和注意事项,需要的朋友参考一下 命令解释器允许用户使用文本行形式的命令与程序进行交互。它一直被使用到1970年代。然而,在现代,许多命令解释器被图形用户界面和菜单驱动界面所取代。 命令翻译的目的 命令解释器有许多用途,在某些情况下比图形用户界面更有用。这些情况的详细信息如下- 命令解释器具有大量可用于不同操作的命令和查

  • 问题内容: 我想为我正在使用的开源代码库生成javadocs。但是Eclipse Generate JavaDoc向导要求我提供“ Javadoc命令”,并且该帮助未解释这意味着什么。是否需要javadoc binary / jar或其他路径? 问题答案: 是的,大概它想要JDK随附的命令行工具的路径(在bin目录中,与和相同)。 Eclipse应该能够自动找到它。您是否可能在JRE上运行它?那将

  • 我理解不同的行为(与覆盖相比是新的),但不理解术语。

  • 问题内容: 我是Android开发和实现SSLSockets的新手。经过一些挖掘后,我能够设置一个可以正常工作的简单服务器/客户端。我觉得该实现可能需要花费一些工作,并且在不使用纯文本格式的情况下困扰于如何将密码加载到密钥库中。这是客户端上的一些代码。如您所见,我已将密码硬编码到本地变量中。有没有更好的方法来加载密钥库密码,所以我在代码中没有纯文本格式? 更新: 事实证明,客户端根本不需要知道密钥

  • Test类是超级类,Fest是它的子类,因为我们知道静态方法不能被重写,即使我遇到了“静态方法不能在java中隐藏实例方法”这样的错误,有人能解释一下吗,提前谢谢。