Java中的隐藏方法?

时间:2012-09-27 03:52:18

标签: java

我目前正在自己​​学习Java,这个问题让我困惑了一段时间,尽管我确定答案很简单。我想知道是否有通过扩展某些类获得的隐藏方法,这样你可以在不引用super.method的情况下调用子类中的方法(...?例如,看看这个ButtonPanel类:

class ButtonPanels extends JPanel {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public ButtonPanels(){
        JButton yellow = new JButton("Yellow");
        JButton blue = new JButton("Blue");
        JButton red = new JButton("Red");

        add(yellow);
        add(blue);
        add(red);
    }
}

这里的“添加”方法......它们来自哪里?看起来写super.add工作得非常好,这让我很困惑。难道你不需要在超级课程中调用所有方法吗?

4 个答案:

答案 0 :(得分:5)

这些不是“隐藏”的方法。从超类调用方法时super.是可选的(只要你没有在你自己的类中重写它,那么你需要super.来区分它与你自己的实现)。

documentation for JPanel列出了“方法摘要”标题下的所有这些方法,特别是“从类java.awt.Container继承的方法”部分(add有多个重载,这就是为什么它不止一次被提及。)

答案 1 :(得分:1)

您无需撰写super。如果方法定义在此类中不可用,则jvm将检查超类中的方法可用性。

super是必需的,如果你有overrriden方法并想调用super类实现而不是sub类实现(覆盖实现)

答案 2 :(得分:0)

这是多态性的影响。 ButtonPanels类既是ButtonsPanel又是JPanel。因此,它可以访问JPanel中的大多数方法,就好像它们位于ButtonsPanel本身一样。如果重载超类中存在的方法,则super变得很重要。

在你的情况下,super.add(Object j)和add(Object j)在调用它们时完全相同,因为add没有重载。

要添加,多态性是对象可以采用多种形式的概念。它本身和所有超级类同时可以这样引用。对于此按钮面板,以下所有内容都是构造对象的不同方法。

JButton j = new JButton();
Container c= new JButton();
Object o = new JButton();

(已经很晚了,我希望我没有这些倒退,有人请让我知道,如果我这样做)

答案 3 :(得分:0)

JVM / Compiler非常聪明,可以检查方法的可用性。它检查该方法是否在当前类中可用。如果是,它使用可用的那个。如果没有,它会检查超类。如果有的话,它会使用它。如果没有,它会再找到一个级别,直到找到实现。如果没有找到任何类,那么编译器会给出找不到方法的错误。