Java中的隐藏方法?

Java中的隐藏方法?,java,Java,我目前正在自学Java,这个问题困扰了我一段时间,尽管我相信答案很简单。我想知道是否存在通过扩展某些类而获得的隐藏方法,这样您就可以在子类中调用该方法,而无需引用super.method(…)?例如,看看这个ButtonPanel类: class ButtonPanels extends JPanel { /** * */ private static final long serialVersionUID = 1L; public ButtonP

我目前正在自学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);
    }
}
这里的“add”方法…它们来自哪里?似乎编写super.add非常好,这让我很困惑。您不需要在从超类调用的所有方法之前编写super吗?

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


在“methodsummary”标题下列出了所有这些方法,特别是在“继承自java.awt.Container类的方法”部分(有多个
add
重载,这就是为什么这里多次提到它的原因).

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


如果您有overriden方法并且希望调用
super
类实现而不是
sub
类实现(overriden实现),则需要使用
super

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

在您的例子中,super.add(Object j)和add(Object j)在调用它们时完全相同,因为add没有重载

要补充的是,多态性是一个对象可以采用多种形式的概念。它本身和所有的超类同时存在,并且可以被引用。在这个按钮面板的情况下,下面所有的都是构造对象的不同方法

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

(已经很晚了,我希望我没有这些问题,如果我有,请有人告诉我)

JVM/编译器足够聪明,可以检查方法的可用性。它会检查方法在当前类中是否可用。如果可用,它会使用可用的方法。如果不可用,它会检查超类。如果可用,它会使用超类。如果不可用,它会再上一级,直到找到实现。如果它找不到任何类。

因此,如果您用一个类似名称的方法重写超类方法,但您想调用超类方法,那么您是否需要编写super?是的,这是正确的,否则,将调用重写的实现。啊,我明白了。我想我很困惑,因为我唯一一次读到super m时Methods是在我看到一个重写超类方法的示例时出现的。谢谢。你能再解释一下多态性吗?