为什么方法addMouseListener不需要super?

时间:2016-11-28 00:30:57

标签: java swing mouselistener super

我的问题是当我创建一个继承自JPanel的类时,为什么不使用super.addMouseListener()来添加一个监听器呢?我认为这个方法是在超级类中,即JPanel。 这是代码:

private class DrawPanel extends JPanel
{
    private int prefwid, prefht;

    // Initialize the DrawPanel by creating a new ArrayList for the images
    // and creating a MouseListener to respond to clicks in the panel.
    public DrawPanel(int wid, int ht)
    {
        prefwid = wid;
        prefht = ht;

        chunks = new ArrayList<Mosaic>();

        // Add MouseListener to this JPanel to respond to the user
        // pressing the mouse.  In your assignment you will also need a
        // MouseMotionListener to respond to the user dragging the mouse.
        addMouseListener(new MListen());
    }

1 个答案:

答案 0 :(得分:2)

因为没有必要。

您没有在addMouseListener类中声明方法DrawPanel,因此编译器会检查超类以查找此类方法,并在java.awt.Component中找到它。因为这个方法是由DrawPanel类继承的,所以可以在这里调用它。

如果您想了解深层原因,则需要阅读JLS Sec 15.12, "Method Invocation Expressions"。然而,这并不是简单的阅读。

我认为关键句是:

  

<强> Sec 15.12.1

     

对于要搜索的类或接口,有六种情况需要考虑,具体取决于MethodInvocation左括号前面的表单:

     
      
  • 如果表单是MethodName,即只是一个标识符,那么:

         
        
    • 如果标识符出现在具有该名称的可见方法声明的范围内(§6.3,§6.4.1),则:
    •   
    • 如果存在该方法为成员的封闭类型声明,则让T为最内层的类型声明。要搜索的类或接口是T.
    •   
    • ...
    •   
  •   

所以TDrawPanel

  

<强> Sec 15.12.2.1

     

搜索由编译时步骤1(第15.12.1节)确定的类或接口,以查找可能适用于此方法调用的所有成员方法;从超类和超接口继承的成员包含在此搜索中。

因此,在addMouseListener及其所有超类中搜索名为DrawPanel的方法。