реализация абстрактных методов/классов в java

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

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


person Greg Oks    schedule 05.10.2011    source источник


Ответы (7)


Если я правильно понял ваш вопрос, то да.

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 будет компилироваться. Он будет использовать собственную реализацию метода B() и реализацию метода ClassA() класса A. Вы также можете переопределить метод A() в ClassB, если хотите.

person raistlin0788    schedule 05.10.2011
comment
+1, хотя, собственно говоря, я считаю, что ответ должен быть «Да» и «Нет», учитывая, что ОП фактически задал два вопроса (вы ответили только на первый словами, а на второй — кодом). - person CPerkins; 05.10.2011

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

person Nathan Hughes    schedule 05.10.2011
comment
В этом случае Y является абстрактным, потому что у него могут быть другие абстрактные методы? - person Greg Oks; 05.10.2011

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

person Dave Newton    schedule 05.10.2011

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

person reader_1000    schedule 05.10.2011

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

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

person Keen Sage    schedule 05.10.2011

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

person mre    schedule 05.10.2011

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

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

interface I {
    void meth();
}

//and

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

Or:

abstract class A {

    public abstract void meth();
}

//and

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

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

person Bhesh Gurung    schedule 05.10.2011
comment
без реализации базового метода? - person Greg Oks; 05.10.2011