Как вы получаете не абстрактный метод в интерфейсе? - PullRequest
1 голос
/ 11 ноября 2010

Как создать метод в интерфейсе, который не является абстрактным? Я знаю, что это МОЖЕТ быть сделано, я просто не знаю как.

Я приведу пример моего замешательства. В Java вы можете реализовать java.awt.event.MouseListener, затем вы должны вызвать метод addMouseListener (Object) ... передавая ваш класс в качестве параметра, чтобы MouseListener знал, из какого объекта нужно произвести приведение. Как возможен метод addMouseListener (Object)?

Кто-то сказал, что я путаю то, как анонимные классы работают с интерфейсами, имеющими неабстрактные методы. Как бы вы реализовали анонимный класс в интерфейсе, чтобы разработчик мог вызывать его методы? Я очень новичок и все еще "нуб" в ООП.

Ответы [ 7 ]

15 голосов
/ 11 ноября 2010

Методы интерфейса по определению являются публичными и абстрактными, поэтому в вашем интерфейсе не должно быть неабстрактных методов.

7 голосов
/ 11 ноября 2010

Если вам интересны анонимные внутренние классы, они работают, как показано ниже.

Мы продолжим с примером 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);
}

Где-то в вашем приложении вы можете захотеть реагировать на события мыши, поэтому, используя анонимный внутренний класс, вы можете сделать что-то вроде этого.здесь создается новый класс (без имени, следовательно, анонимный), который реализует интерфейс 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());

Видите разницу?

Надеюсь, это поможет.Удачи.

PS - Читайте о наследовании, интерфейсах, внутренних классах и анонимных внутренних классах в Java для более глубокого понимания.

1 голос
/ 16 декабря 2013

В Java методы интерфейса по умолчанию являются публичными и абстрактными.

Например:

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

И это то же самое, что:

public interface IPrint{
    void print();
}

Так что первый вариант - плохая практикаДело в том, что вы не можете использовать неабстрактные методы внутри интерфейса, потому что они являются абстрактными по умолчанию.Но в абстрактном классе вы можете использовать неабстрактные или абстрактные методы.

1 голос
/ 11 ноября 2010

Вы путаете «неабстрактный метод в интерфейсе» с «классом, реализующим интерфейс». Ваш вопрос:

Как возможен метод addMouseListener (Object)?

Это возможно, потому что объект, который вы передаете addMouseListener (MouseListener) (который не принимает Object, кстати, но является экземпляром интерфейса MouseListener), является экземпляром класса, который реализует этот интерфейс:

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

Я бы порекомендовал вам прочитать учебник по основам Java (или OO), такой как этот раздел Учебника по Java.

1 голос
/ 11 ноября 2010

В Java вы просто не можете. Возможно, вы думаете об абстрактном классе.

Абстрактный класс в Java может реализовывать интерфейсы и определять некоторые сигнатуры методов, оставляя другие методы абстрактными с ключевым словом «abstract» - Wikipedia

Итак, как и в обычном классе, вы можете обеспечить реализацию некоторых конкретных методов. И, как в интерфейсе, вы можете объявить сигнатуру абстрактных методов. Эти методы будут реализованы конкретными классами, расширяющими абстрактный. Как и интерфейс, абстрактный класс не может быть создан.

Основное практическое отличие состоит в том, что конкретные классы создаются путем подкласса абстрактного класса. Таким образом, один конкретный класс может расширять только один абстрактный класс, в то время как он может реализовывать много интерфейсов.

1 голос
/ 11 ноября 2010

Нет, это не может быть сделано в Java 6 или 7. Это станет возможным примерно в рамках проекта lambda , который запланирован для Java 8. ПредлагаемыйМеханизм называется методы расширения.

0 голосов
/ 15 июля 2014

В Java 8 вы можете иметь реализацию по умолчанию для методов внутри интерфейса, перейдите по этой ссылке.http://www.lambdafaq.org/what-are-default-methods/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...