代码之家  ›  专栏  ›  技术社区  ›  Ben

如何在接口中获取非抽象方法?

  •  1
  • Ben  · 技术社区  · 14 年前

    如何在非抽象的接口中生成方法?我知道这是可以做到的,我只是不知道怎么做。

    我举个例子说明我的困惑。在爪哇中,您可以实现java. AWT.Evest.MouSistInter,然后必须调用方法AdHuffSististNER(对象)…将类作为参数传递,这样mouseListener就知道要从哪个对象进行强制转换。AddMouseListener(Object)方法是如何实现的?

    有人说我混淆了匿名类与具有非抽象方法的接口的工作方式。如何在接口内实现匿名类,以便实现者可以调用其方法?我是新来的,在OOP上还是个“笨蛋”。

    7 回复  |  直到 10 年前
        1
  •  7
  •   Todd    14 年前

    如果您对匿名内部类感兴趣,它们的工作方式如下所示。

    我们将继续使用mouselistener示例。

    的接口 java.awt.event.MouseListener 看起来像这样:

    public interface  MouseListener {
      void mouseClicked(MouseEvent e);
      void mouseEntered(MouseEvent e);
      void mouseExited(MouseEvent e);
      void mousePressed(MouseEvent e);
      void mouseReleased(MouseEvent e);
    }
    

    在应用程序的某个地方,您可能希望响应鼠标事件,因此使用匿名内部类,您可以这样做。

    component.addMouseListener(new MouseListener() {
      public void mouseClicked(MouseEvent e){/*implementation goes here...*/}
      public void mouseEntered(MouseEvent e){/*implementation goes here...*/}
      public void mouseExited(MouseEvent e){/*implementation goes here...*/}
      public void mousePressed(MouseEvent e){/*implementation goes here...*/}
      public void mouseReleased(MouseEvent e){/*implementation goes here...*/}
    });
    

    您在这里所做的是创建一个新的类(没有名称,因此是匿名的),该类 实现mouseListener接口 . 如上所述,您没有在接口上创建非抽象方法。

    您还可以创建一个新的命名类(“命名类”表示常规的旧类):

    class MyMouseListener implements MouseListener {
      public void mouseClicked(MouseEvent e){/*implementation goes here...*/}
      public void mouseEntered(MouseEvent e){/*implementation goes here...*/}
      public void mouseExited(MouseEvent e){/*implementation goes here...*/}
      public void mousePressed(MouseEvent e){/*implementation goes here...*/}
      public void mouseReleased(MouseEvent e){/*implementation goes here...*/}
    }
    

    那你就去别的地方吧 component.addMouseListener(new MyMouseListener());

    看到区别了吗?

    我希望这有帮助。祝你好运。

    请阅读Java中的继承、接口、内部类和匿名内部类,以便更深入地理解。

        2
  •  15
  •   mgv    14 年前

    接口方法的定义是公共的和抽象的,因此在接口中不能有非抽象的方法。

        3
  •  1
  •   Matt McHenry    14 年前

    不,它不能在Java 6或7中完成。它将成为可能,在一个回合的方式,作为一部分 project lambda 这是为Java 8预定的。所提出的机制称为扩展方法。

        4
  •  1
  •   Miguel Silva    14 年前

    在Java中,你不能。也许你正在思考的是一个抽象类。

    Java中的抽象类可以实现接口并定义一些方法签名,同时保留其他方法抽象的“抽象”关键字。 Wikipedia

    所以,就像在常规类中一样,您可以为一些具体的方法提供实现。和在接口中一样,您可以声明抽象方法的签名。这些方法将由扩展抽象方法的具体类实现。与接口类似,抽象类不能实例化。

    实际的主要区别在于,具体类是通过对抽象类进行子类创建的。因此,一个具体类只能扩展一个抽象类,而它可以实现多个接口。

        5
  •  1
  •   vanza    14 年前

    您将“接口中的非抽象方法”与“实现接口的类”混淆了。您的问题:

    AddMouseListener(Object)方法是如何实现的?

    可能是因为传递给addMouseListener(MouseListener)的对象(它不接受对象btw,而是MouseListener接口的实例)是实现该接口的类的实例:

    public MyMouseListener implements MouseListener { ... }
    addMouseListener(new MyMouseListener());
    

    我建议你阅读一个关于Java(或OO)基础的教程,比如 this section 关于Java教程的。

        6
  •  1
  •   Marko Kojić    10 年前

    在爪哇,接口方法默认为公共的和抽象的。

    例如:

    public interface IPrint{
        public abstract void print();
    }
    

    这与:

    public interface IPrint{
        void print();
    }
    

    所以第一个选择是不好的做法。关键是你 不能 在接口内部使用非抽象方法,因为它们在默认情况下是抽象的。但在抽象类中,可以使用非抽象或抽象方法。

        7
  •  0
  •   user989383    10 年前

    使用Java 8可以在接口内实现方法的默认实现,请访问此链接。 http://www.lambdafaq.org/what-are-default-methods/