2

我目前正在自学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 工作得很好,这让我很困惑。你不需要在你从超类调用的所有方法前面写 super 吗?

4

4 回答 4

5

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

文档JPanel在“方法摘要”标题下列出了所有这些方法,特别是在“从类 java.awt.Container 继承的方法”部分中(有多个重载,add这就是为什么在那里不止一次提到它的原因)。

于 2012-09-27T03:53:37.227 回答
1

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

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

于 2012-09-27T03:53:49.630 回答
0

这是多态性的影响。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();

(已经晚了,我希望我没有这些倒退,如果我这样做,请有人告诉我)

于 2012-09-27T03:55:07.467 回答
0

JVM/编译器足够聪明,可以检查方法的可用性。它检查该方法是否在当前类中可用。如果是 ,则使用可用的那个。如果不是,它检查超类。如果那里可用,它会使用它。如果不是,它会再上一层,直到找到实现。如果没有找到任何类,编译器会给出关于方法未找到的错误。

于 2012-09-27T03:57:38.177 回答