Рубрики

Разница между абстрактным классом и конкретным классом в Java

Абстрактный класс : абстрактный класс — это тип класса в Java, который объявлен ключевым словом abstract. Абстрактный класс не может быть создан напрямую, т.е. объект такого класса не может быть создан напрямую с использованием нового ключевого слова. Абстрактный класс может быть создан либо с помощью конкретного подкласса, либо путем определения всего абстрактного метода вместе с новым оператором. Может содержать или не содержать абстрактный метод. Абстрактный метод объявляется абстрактным ключевым словом, такие методы не могут иметь тела. Если класс содержит абстрактный метод, то он также должен быть абстрактным.

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

Абстрактный класс против конкретного класса

  1. Модификатор: абстрактный класс объявляется с использованием абстрактного модификатора. Конкретный класс не должен объявляться с использованием абстрактного ключевого слова, при этом он также станет абстрактным классом.

  2. Создание экземпляра: абстрактный класс не может быть создан непосредственно, т.е. объект такого класса не может быть создан напрямую с использованием нового ключевого слова. Абстрактный класс может быть создан либо с помощью конкретного подкласса, либо путем определения всего абстрактного метода вместе с новым оператором. Конкретный класс можно создать напрямую, используя новое ключевое слово.

    Пример: недопустимая прямая реализация абстрактного класса.

    abstract class DemoAbstractClass {

        abstract void display();

    }

      

    public class JavaApplication {

        public static void main(String[] args)

        {

            DemoAbstractClass AC = new DemoAbstractClass();

            System.out.println("Hello");

        }

    }

    Ошибка компиляции:

    prog.java:9: error: DemoAbstractClass is abstract; cannot be instantiated
            DemoAbstractClass AC = new DemoAbstractClass();
                                   ^
    

    Пример: допустимая реализация путем определения всех абстрактных методов абстрактного класса.

    abstract class DemoAbstractClass {

        abstract void display();

    }

      

    public class JavaApplication {

        public static void main(String[] args)

        {

            DemoAbstractClass AC = new DemoAbstractClass() {

                void display()

                {

                    System.out.println("Hi.");

                }

            };

            AC.display();

            System.out.println("How are you?");

        }

    }

    Выход:

    Hi.
    How are you?
    

    Пример: прямое создание экземпляра бетона с использованием нового ключевого слова.

    abstract class DemoAbstractClass {

        abstract void display();

    }

      

    class ConcreteClass extends DemoAbstractClass {

        void display()

        {

            System.out.println("Hi.");

        }

    }

      

    public class JavaApplication {

        public static void main(String[] args)

        {

            ConcreteClass C = new ConcreteClass();

            C.display();

            System.out.println("How are you?");

        }

    }

    Выход:

    Hi.
    How are you?
    
  3. Абстрактные методы: абстрактный класс может иметь или не иметь абстрактный метод. Конкретный класс не может иметь абстрактный метод, потому что класс, содержащий абстрактный метод, также должен быть абстрактным.
    Давайте разберемся с этим на примере:
    У нас в Servlet есть класс HttpServlet. Теперь этот класс по-своему особенный.
    «HttpServlet — это абстрактный класс, но он не содержит никаких абстрактных методов».
    Давайте разберемся в значении вышеизложенного:
    -> HttpServlet является абстрактным классом, потому что он не имеет надлежащей реализации для своих методов. Поскольку он не имеет надлежащей реализации для своих методов, то в чем смысл создания объектов для такого класса. Поэтому этот класс выполнен как абстрактный.

    Теперь возникает вопрос:
    В. Если методы не имеют надлежащей реализации, то почему они не сделали это абстрактным?
    -> Так как абстрактные методы — это те, которые не имеют правильного определения тела, и мы переопределяем такие методы в нашем классе, чтобы дать ему правильное определение. Таким образом, в основном абстрактные методы используются с целью переопределения.
    Теперь этот класс «HttpServlet» содержит 10 методов и предположим, что если эти методы были сделаны абстрактными, то нам нужно переопределить все 10 методов класса «HttpServlet», что является глупым способом, поскольку нам нужны только методы doGet () и doPost ().

  4. Ниже приведен пример программы для иллюстрации вышеуказанного пункта в Java:

    // Java-программа для показа примера сервлета
    // Импортируем необходимые библиотеки Java

    import java.io.*;

    import javax.servlet.*;

    import javax.servlet.http.*;

      
    // Расширяем класс HttpServlet

    public class AdvanceJavaConcepts extends HttpServlet 

       private String output;

        

       // Инициализация сервлета

       public void init() throws ServletException 

       {

          output = "Advance Java Concepts";

       }

      

       // Запрос и печать вывода

       public void doGet(HttpServletRequest req, 

                        HttpServletResponse resp)

          throws ServletException, IOException 

          {

             resp.setContentType("text/html");

             PrintWriter out = resp.getWriter();

             out.println(output);

          }

      

          public void destroy() 

          {

             System.out.println("Over");

          }

    }

    Выход:

    Advance Java Concepts
    output
    Over
    

    ПРИМЕЧАНИЕ. Как упоминалось ранее, класс HttpServlet не содержит никаких абстрактных методов. Так что программа работает успешно, не переопределяя все свои методы.
    Но предположим, что если этот класс содержит весь свой метод как абстрактный, то нам нужно переопределить все его методы, хотя они ничего не делают в нашем классе.
    Прототипы методов класса HttpServlet:

    1. публичный сервис void (ServletRequest req, ServletResponse res)
    2. служба защищенных пустот (HttpSerletRequest req, HttpServletResponse res)
    3. Защищенный void doGet (HttpSerletRequest req, HttpServletResponse res)
    4. Защищенный void doPost (HttpSerletRequest req, HttpServletResponse res)
    5. Защищенный void doHead (HttpSerletRequest req, HttpServletResponse res)
    6. Защищенные пустые doOptions (HttpSerletRequest req, HttpServletResponse res)
    7. Защищенный void doPut (HttpSerletRequest req, HttpServletResponse res)
    8. защищенный void doTrace (запрос HttpSerletRequest, разрешение HttpServletResponse)
    9. Защищенный void doDelete (HttpSerletRequest req, HttpServletResponse res)
    10. Защищенный void getLastModified (HttpSerletRequest req)

    Ненужное переопределение таких методов будет их в нашем классе, если оно было сделано абстрактным.

    ПРИМЕЧАНИЕ. Однако в последних IDE, таких как netbeans и т. Д., Он автоматически переопределяет все абстрактные методы, предоставляя им пустое тело, уменьшая головную боль программиста при переопределении.

  5. Final: абстрактный класс не может быть окончательным , потому что все его абстрактные методы должны быть определены в подклассе. Конкретный класс может быть объявлен как окончательный .
  6. Интерфейс: Реализация интерфейса невозможна с абстрактным классом, однако, это возможно с конкретным классом.

Abstract ClassConcrete Class
An abstract class is declared using abstract modifier.A concrete class is note declared using abstract modifier.
An abstract class cannot be directly instantiated using the new keyword.A concrete class can be directly instantiated using the new keyword.
An abstract class may or may not contain abstract methods.A concrete class cannot contain an abstract method.
An abstract class cannot be declared as final.A concrete class can be declared as final.
Interface implementation is not possibleInterface implementation is possible.

Некоторые важные моменты:

  • Конкретный класс — это подкласс абстрактного класса, который реализует весь его абстрактный метод.
  • Абстрактные методы не могут иметь тела.
  • Абстрактный класс может иметь статические поля и статический метод, как и другие классы.
  • Абстрактный класс не может быть объявлен как окончательный.
  • Только абстрактный класс может иметь абстрактные методы.
  • Закрытый, последний, статический метод не может быть абстрактным, так как он не может быть переопределен в подклассе.
  • Абстрактный класс не может иметь абстрактных конструкторов.
  • Абстрактный класс не может иметь абстрактные статические методы.
  • Если класс расширяет абстрактный класс, то он должен определять все абстрактные методы (переопределение) базового абстрактного класса. Если нет, подкласс (класс, расширяющий абстрактный класс) также должен быть определен как абстрактный класс.

Рекомендуемые посты:

Разница между абстрактным классом и конкретным классом в Java

0.00 (0%) 0 votes