Вопрос-ответ

Abstract class in Java

Абстрактный класс в Java

Что такое "абстрактный класс" в Java?

Переведено автоматически
Ответ 1

Абстрактный класс - это класс, который не может быть создан. Абстрактный класс используется путем создания наследуемого подкласса, который может быть создан. Абстрактный класс выполняет несколько функций для наследующего подкласса:


  1. Определите методы, которые могут использоваться наследующим подклассом.

  2. Определите абстрактные методы, которые должен реализовывать наследующий подкласс.

  3. Предоставляет общий интерфейс, который позволяет заменять подкласс всеми другими подклассами.

Вот пример:

abstract public class AbstractClass
{
abstract public void abstractMethod();
public void implementedMethod() { System.out.print("implementedMethod()"); }
final public void finalMethod() { System.out.print("finalMethod()"); }
}

Обратите внимание, что "abstractMethod()" не имеет тела метода. Из-за этого вы не можете выполнить следующее:

public class ImplementingClass extends AbstractClass
{
// ERROR!
}

Не существует метода, который реализует abstractMethod()! Таким образом, у JVM нет возможности узнать, что она должна делать, когда получает что-то вроде new ImplementingClass().abstractMethod().

Вот правильный ImplementingClass.

public class ImplementingClass extends AbstractClass
{
public void abstractMethod() { System.out.print("abstractMethod()"); }
}

Обратите внимание, что вам не нужно определять implementedMethod() или finalMethod(). Они уже были определены AbstractClass.

Вот еще один правильный ImplementingClass.

public class ImplementingClass extends AbstractClass
{
public void abstractMethod() { System.out.print("abstractMethod()"); }
public void implementedMethod() { System.out.print("Overridden!"); }
}

В этом случае вы переопределили implementedMethod().

Однако из-за ключевого слова final следующее невозможно.

public class ImplementingClass extends AbstractClass
{
public void abstractMethod() { System.out.print("abstractMethod()"); }
public void implementedMethod() { System.out.print("Overridden!"); }
public void finalMethod() { System.out.print("ERROR!"); }
}

Вы не можете этого сделать, потому что реализация finalMethod() в AbstractClass помечена как окончательная реализация finalMethod(): никакие другие реализации не будут разрешены, никогда.

Теперь вы можете также реализовать абстрактный класс дважды:

public class ImplementingClass extends AbstractClass
{
public void abstractMethod() { System.out.print("abstractMethod()"); }
public void implementedMethod() { System.out.print("Overridden!"); }
}

// In a separate file.
public class SecondImplementingClass extends AbstractClass
{
public void abstractMethod() { System.out.print("second abstractMethod()"); }
}

Теперь где-нибудь вы могли бы написать другой метод.

public tryItOut()
{
ImplementingClass a = new ImplementingClass();
AbstractClass b = new ImplementingClass();

a.abstractMethod(); // prints "abstractMethod()"
a.implementedMethod(); // prints "Overridden!" <-- same
a.finalMethod(); // prints "finalMethod()"

b.abstractMethod(); // prints "abstractMethod()"
b.implementedMethod(); // prints "Overridden!" <-- same
b.finalMethod(); // prints "finalMethod()"

SecondImplementingClass c = new SecondImplementingClass();
AbstractClass d = new SecondImplementingClass();

c.abstractMethod(); // prints "second abstractMethod()"
c.implementedMethod(); // prints "implementedMethod()"
c.finalMethod(); // prints "finalMethod()"

d.abstractMethod(); // prints "second abstractMethod()"
d.implementedMethod(); // prints "implementedMethod()"
d.finalMethod(); // prints "finalMethod()"
}

Обратите внимание, что, хотя мы объявили b тип AbstractClass, он отображается "Overriden!". Это потому, что объект, который мы создали, на самом деле был ImplementingClass, чей implementedMethod(), конечно, переопределен. (Возможно, вы видели, что это называется полиморфизмом.)

Если мы хотим получить доступ к члену, специфичному для определенного подкласса, мы должны сначала выполнить приведение к этому подклассу:

// Say ImplementingClass also contains uniqueMethod()
// To access it, we use a cast to tell the runtime which type the object is
AbstractClass b = new ImplementingClass();
((ImplementingClass)b).uniqueMethod();

Наконец, вы не можете выполнить следующее:

public class ImplementingClass extends AbstractClass, SomeOtherAbstractClass
{
... // implementation
}

Одновременно может быть расширен только один класс. Если вам нужно расширить несколько классов, они должны быть интерфейсами. Вы можете сделать это:

public class ImplementingClass extends AbstractClass implements InterfaceA, InterfaceB
{
... // implementation
}

Вот пример интерфейса:

interface InterfaceA
{
void interfaceMethod();
}

По сути, это то же самое, что:

abstract public class InterfaceA
{
abstract public void interfaceMethod();
}

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

Следующее является незаконным:

interface InterfaceB
{
void interfaceMethod() { System.out.print("ERROR!"); }
}

Вы не можете реализовать методы в интерфейсе. Это означает, что если вы реализуете два разных интерфейса, разные методы в этих интерфейсах не могут сталкиваться. Поскольку все методы в интерфейсе абстрактны, вы должны реализовать метод, а поскольку ваш метод является единственной реализацией в дереве наследования, компилятор знает, что он должен использовать ваш метод.

Ответ 2

Класс Java становится абстрактным при выполнении следующих условий:

1. По крайней мере, один из методов помечен как абстрактный:

public abstract void myMethod()

В этом случае компилятор заставляет вас пометить весь класс как абстрактный.

2. Класс помечен как абстрактный:

abstract class MyClass

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

Общее использование:

Обычно абстрактные классы используются для создания структуры класса, аналогичной интерфейсу. Но, в отличие от интерфейса, он уже может предоставлять функциональность, т. Е. Некоторые части класса реализованы, а некоторые части просто обозначены объявлением метода. ("abstract")

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

Ответ 3

Класс, который объявляется с использованием ключевого слова abstract, известен как abstract class. Абстракция - это процесс сокрытия деталей реализации данных и показа пользователю только функциональности. Абстракция позволяет вам сосредоточиться на том, что делает объект, а не на том, как он это делает.

Основные функции абстрактного класса


  • Абстрактный класс может содержать или не содержать абстрактные методы.Могут быть неабстрактные методы.


    Абстрактный метод - это метод, который объявляется без реализации (без фигурных скобок и за которым следует точка с запятой), например:


    пример : abstract void moveTo(double deltaX, double deltaY);


  • Если класс имеет хотя бы один абстрактный метод, то этот класс должен быть абстрактным


  • Абстрактные классы не могут быть созданы (Вам не разрешено создавать объект абстрактного класса)


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


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


Объявлять абстрактный класс Указание abstract ключевого слова перед классом во время объявления делает его абстрактным. Взгляните на приведенный ниже код:

abstract class AbstractDemo{ }

Объявляем абстрактный метод
Указание abstract ключевого слова перед методом во время объявления делает его абстрактным. Взгляните на приведенный ниже код,

abstract void moveTo();//no body

Зачем нам нужны абстрактные классы

В объектно-ориентированном приложении для рисования вы можете рисовать круги, прямоугольники, линии, кривые Безье и многие другие графические объекты. Все эти объекты имеют определенные общие состояния (например, положение, ориентацию, цвет линии, цвет заливки) и поведение (например, перемещение, поворот, изменение размера, рисование). Некоторые из этих состояний и поведений одинаковы для всех графических объектов (например, цвет заливки, положение и moveTo). Другие требуют другой реализации (например, изменение размера или рисование). Все графические объекты должны иметь возможность рисовать или изменять размер самих себя, они просто отличаются тем, как они это делают.

Это идеальная ситуация для абстрактного суперкласса. Вы можете воспользоваться преимуществами сходства и объявить, что все графические объекты наследуются от одного и того же абстрактного родительского объекта (например : GraphicObject), как показано на следующем рисунке. введите описание изображения здесь

Сначала вы объявляете абстрактный класс, GraphicObject для предоставления переменных-членов и методов, которые полностью используются всеми подклассами, таких как current position и метод moveTo. GraphicObject также объявлены абстрактные методы, такие как draw или resize , которые должны быть реализованы всеми подклассами, но должны быть реализованы разными способами. GraphicObject Класс может выглядеть примерно так:

abstract class GraphicObject {

void moveTo(int x, int y) {
// Inside this method we have to change the position of the graphic
// object according to x,y
// This is the same in every GraphicObject. Then we can implement here.
}

abstract void draw(); // But every GraphicObject drawing case is
// unique, not common. Then we have to create that
// case inside each class. Then create these
// methods as abstract
abstract void resize();
}

Использование абстрактного метода во вложенных классах
Каждый неабстрактный подкласс GraphicObject, такой как Circle и Rectangle, должен предоставлять реализации для методов draw и resize.

class Circle extends GraphicObject {
void draw() {
//Add to some implementation here
}
void resize() {
//Add to some implementation here
}
}
class Rectangle extends GraphicObject {
void draw() {
//Add to some implementation here
}
void resize() {
//Add to some implementation here
}
}

Внутри main метода вы можете вызывать все методы следующим образом:

public static void main(String args[]){
GraphicObject c = new Circle();
c.draw();
c.resize();
c.moveTo(4,5);
}

Способы достижения абстракции в Java

Существует два способа достижения абстракции в Java


  • Абстрактный класс (от 0 до 100%)

  • Интерфейс (100%)

Абстрактный класс с конструкторами, элементами данных, методами и т. Д

abstract class GraphicObject {

GraphicObject (){
System.out.println("GraphicObject is created");
}
void moveTo(int y, int x) {
System.out.println("Change position according to "+ x+ " and " + y);
}
abstract void draw();
}

class Circle extends GraphicObject {
void draw() {
System.out.println("Draw the Circle");
}
}

class TestAbstract {
public static void main(String args[]){

GraphicObject grObj = new Circle ();
grObj.draw();
grObj.moveTo(4,6);
}
}

Вывод:

GraphicObject  is created
Draw the Circle
Change position according to 6 and 4

Запомните два правила:


  • Если в классе мало абстрактных и мало конкретных методов, объявите его как abstract класс.


  • Если класс имеет только абстрактные методы, объявите его как interface.


Ссылки:

Ответ 4

Это класс, который не может быть создан, и заставляет реализующие классы, возможно, реализовывать абстрактные методы, которые он описывает.

java oop