Реализация абстрактных методов / классов в Java - PullRequest
4 голосов
/ 05 октября 2011

Могу ли я реализовать абстрактные методы в абстрактном базовом классе A в Java?

Если ответ положительный, и в базовом классе A есть реализованный абстрактный метод, а из A есть производный класс B (B не является абстрактным). B все еще должен реализовать этот базовый абстрактный метод?

Ответы [ 7 ]

9 голосов
/ 05 октября 2011

Если я правильно понимаю ваш вопрос, Да.

public abstract class TopClass {
  public abstract void methodA();
  public abstract void methodB();
}

public abstract class ClassA extends TopClass {
  @Override
  public void methodA() {
    // Implementation
  }
}

public class ClassB extends ClassA {
  @Override
  public void methodB() {
    // Implementation
  }
}

В этом примере ClassB скомпилируется.Он будет использовать свою собственную реализацию methodB (), и реализацию ClassA метода methodA ().Вы также можете переопределить methodA () в ClassB, если хотите.

1 голос
/ 05 октября 2011

Да, вы можете реализовать абстрактные методы в классе, который объявлен как абстрактный.Если класс объявлен как абстрактный, что не означает, что все его методы должны быть абстрактными.

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

1 голос
/ 05 октября 2011

Абстрактные классы могут иметь обычные методы.Если вы хотите реализовать некоторые методы класса A и оставить остальные методы абстрактными, вы можете сделать это.Однако у абстрактных методов не может быть тела, поэтому, если вы помечаете метод как абстрактный, он должен быть реализован подклассом, вы не можете реализовать его в абстрактном классе.Однако у вас может быть абстрактный класс без абстрактных методов, тогда подкласс должен только расширять его.

1 голос
/ 05 октября 2011

У вас может быть два абстрактных класса, X и Y, где Y расширяет X. В этом случае для Y может иметь смысл реализовать абстрактный метод X, оставаясь при этом абстрактным.Другой неабстрактный класс Z мог бы расширить Y. Однако, в вашем примере, для реализации собственных абстрактных методов A является противоречием, смысл сделать их абстрактными, так что он не предоставляет реализации, он просто указывает, какие сигнатуры методадолжен выглядеть так.

0 голосов
/ 05 октября 2011

Если вы реализуете абстрактный метод, он больше не является абстрактным, поэтому нет.

0 голосов
/ 05 октября 2011

Да, но это уже не может быть абстрактным.Аннотация означает, что реализации нет.

Что вы можете сделать:

interface I {
    void meth();
}

//and

abstract class A implements I {
    public void meth() {
        //implementation
    }
}

Или:

abstract class A {

    public abstract void meth();
}

//and

abstract class B extends A {
    public void meth() {
    }
}

Если A уже имеет реализацию, вы можете переопределить еев B (если B конкретный), потому что B наследует реализацию по умолчанию от A.

0 голосов
/ 05 октября 2011

Нет .Абстрактные методы должны быть определены подклассом (ами).Для получения дополнительной информации см. Абстрактные методы и классы .Тем не менее, вы можете определить метод в базовом классе и иметь подкласс (ы) переопределить его, если требуется.

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