абстрактный класс или интерфейс - PullRequest
2 голосов
/ 05 апреля 2011
public class C {
  public abstract Boolean methodC();
}

Class A implements C {
 // all non-abstract methods
}

Class B extends A {
// all non-abstract methods
}

В Java может C быть абстрактным классом или это должен быть интерфейс? [ПРИМЕЧАНИЕ: там написано: C». Можете ли вы реализовать реферат класс на Java?]

Ответы [ 8 ]

5 голосов
/ 05 апреля 2011

Вот несколько описаний в терминологии мирян, чтобы помочь:

Интерфейс : Это набор методов.Они не имеют никакого определения, и их функция определяется классом , который реализует их.Примером интерфейса является список.Все списки (ArrayList, LinkedList) имеют методы add () и remove (), поскольку они реализуют интерфейс List , который требует их.

public interface List {
    public void add (Object o);
    public void remove (Object o);
}

public class MyList implements List {

    public void add (Object o) {
       // I must implement this method because of the interface List
    }

    public void remove (Object o) {
       // I must implement this method because of the interface List
    }
}

An Abstract Class : Это частично завершенный класс.Он отличается от интерфейса тем, что часто сам по себе содержит некоторые функции.Тем не менее, в нем (как правило) отсутствуют некоторые методы, которые должны быть определены под * классом * extension *.Эти методы определены как abstract методы в абстрактном суперклассе.

public abstract class AbstractThing {

     public void method1 (Object o) {
         // This is a real method that does things
     }

     // Anyone who extends me must implement this
     public abstract void method2 (Object o1, Object o2);
}

public class ActualThing extends AbstractThing implements List {

    public void add (Object o) {
       // I must implement this method because of the interface List
    }

    public void remove (Object o) {
       // I must implement this method because of the interface List
    }

    public void method2 (Object o1, Object o2) {
       // I must implement this method because of abstract method in
       // the super class
    } 

Ключевое слово Implements используется классом, чтобы указать, что он собирается реализоватьметоды, требуемые интерфейсом .Класс может реализовать столько интерфейсов, сколько ему нужно;единственное требование состоит в том, что он дает определение для каждого из этих методов.Он также может быть определен как abstract и полагаться на его подклассы для определения некоторых.Затем эти методы аналогичны абстрактным методам любого другого абстрактного класса.

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

Почему вся эта сложность?Интерфейсы хороши тем, что вы можете предполагать определенные функциональные возможности реализации классов.Особый случай - интерфейс List.Большинству методов все равно, какой список они получают;они просто хотят знать, что объект поддерживает методы общего списка.В операторе:

List<String> myList = new ArrayList();

Вы создаете реальный объект ArrayList, но скрываете его реализацию под интерфейсом List.Затем, позже, если вы решите использовать LinkedList, вам не нужно менять весь код, поскольку он также реализует интерфейс List.

Есть также несколько «наборов интерфейсов», которые Java определяет(например, постоянство), но не реализует.Это позволяет сторонним разработчикам разрабатывать свои собственные реализации (фактические классы), но, поскольку все они реализуют один и тот же общий интерфейс, разработчики могут менять и внедрять реализации без изменения кода.

3 голосов
/ 16 января 2016

класс A не может реализовать C, потому что C. не является интерфейсом.

Давайте разберемся, интерфейс в java является проектом класса.Он имеет только статические константы и абстрактные методы.

Интерфейс в Java - это механизм для достижения полной абстракции .В интерфейсе Java могут быть только абстрактные методы, а не тело метода.Он используется для достижения полной абстракции и множественного наследования в Java.

Интерфейс Java также представляет отношение IS-A .

Его нельзя создать как абстрактныйclass.

Как показано на рисунке ниже, класс расширяет другой класс, интерфейс расширяет другой интерфейс, но класс реализует интерфейс .

enter image description here

2 голосов
/ 05 апреля 2011

класс A не может реализовать C, потому что C не является интерфейсом.Вы продлеваете занятия;вы реализуете интерфейсы.

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

1 голос
/ 05 апреля 2011

Вот свод правил:

  1. Интерфейс может extend любое количество интерфейсов.
  2. Класс может дополнительно extend точно один класс;он расширяется Object, если вы ничего не указали.
  3. Класс может implement любое количество интерфейсов.
  4. Любой класс может быть объявлен abstract.
  5. Любой класс, имеющий абстрактные методы , должен быть объявлен abstract.
  6. Любой класс, который расширяет абстрактный класс или реализует интерфейс, должен реализовывать все абстрактные и интерфейсные методы, иначе должен быть объявлен abstract.
1 голос
/ 05 апреля 2011

Любой тип со всеми абстрактными методами обычно является интерфейсом, но ничто не мешает ему быть абстрактным классом.Итак, C в вашем примере может быть классом, как он у вас есть.Чаще всего это будет интерфейс.

Ваш класс A утверждает, что он реализует C. Классы могут реализовывать только интерфейсы.Итак, если вы хотите сохранить C в классе, тогда A нужно будет расширить C. Если вы сделаете C интерфейсом, то использование инструментов будет правильным.

1 голос
/ 05 апреля 2011

Если C является абстрактным классом, то A должен расширять C. Кроме того, вам нужно использовать слово abstract перед словом class при определении C.

Если C является интерфейсом, тогда удалите слово "реферат "перед методом C.

1 голос
/ 05 апреля 2011

C может быть либо; если бы это был класс, его нужно было бы объявить как «публичный абстрактный класс».

1 голос
/ 05 апреля 2011

В Java каждый класс может расширять только 1 другой класс, но он может реализовывать столько интерфейсов, сколько ему нужно.

C может быть интерфейсом или абстрактным классом.

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