我目前正在自己学习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工作得非常好,这让我很困惑。难道你不需要在超级课程中调用所有方法吗?
答案 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非常聪明,可以检查方法的可用性。它检查该方法是否在当前类中可用。如果是,它使用可用的那个。如果没有,它会检查超类。如果有的话,它会使用它。如果没有,它会再找到一个级别,直到找到实现。如果没有找到任何类,那么编译器会给出找不到方法的错误。