Protected abstract void java

Абстрактные классы Java и методы

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

Объявление

Нужно добавить ключевое слово abstract в объявление класса:

public abstract class MyAbstractClass

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

MyAbstractClass myClassInstance = new MyAbstractClass(); //not valid

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

Абстрактные методы

Вы объявляете их, добавляя ключевое слово abstract перед объявлением метода:

public abstract class MyAbstractClass

Информация об абстрактных методах:

  • Не имеет реализации.
  • У него просто есть подпись метода. Так же, как методы в интерфейсе.
  • Если у класса есть абстрактный метод, весь класс должен быть объявлен как абстрактный.
  • Не все методы в абстрактном классе должны быть абстрактными, может иметь и неабстрактные.
  • Подклассы абстрактного класса должны реализовывать (переопределять) все абстрактные методы его абстрактного суперкласса. Неабстрактные методы суперкласса просто наследуются как есть. Они также могут быть отменены, если это необходимо.
public class MySubClass extends MyAbstractClass < public void abstractMethod() < System.out.println("My method implementation"); >>

Обратите внимание, как MySubClass должен реализовывать абстрактный метод abstractMethod() из своего абстрактного суперкласса MyAbstractClass.

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

Цель

Цель – функционировать как базовые классы, которые могут быть расширены подклассами для создания полной реализации. Например, представьте, что определенный процесс требует 3 шага:

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

public abstract class MyAbstractProcess < public void process() < stepBefore(); action(); stepAfter(); >public void stepBefore() < //implementation directly in abstract superclass >public abstract void action(); // implemented by subclasses public void stepAfter() < //implementation directly in abstract superclass >>

Обратите внимание, как метод action() является абстрактным. Подклассы MyAbstractProcess теперь могут расширять MyAbstractProcess и просто переопределять метод action().

Когда вызывается метод process() подкласса, выполняется полный процесс, включая stepBefore() и stepAfter() абстрактного суперкласса и метод action() подкласса.

Конечно, MyAbstractProcess не должен был быть абстрактным, чтобы функционировать как базовый класс. Метод action() также не должен быть абстрактным. Вы могли бы просто использовать обычный класс. Однако, создав метод для реализации абстрактного, а значит и класса, вы четко дадите понять его пользователям, что он не должен использоваться как есть. Вместо этого его следует использовать в качестве базового класса для подкласса, а абстрактный метод должен быть реализован в подклассе.

В приведенном выше примере не было реализации по умолчанию для метода action(). В некоторых случаях ваш суперкласс может ее иметь. Тогда вы можете не делать метод абстрактным. Вы все равно можете сделать суперкласс абстрактным, даже если он не содержит абстрактных методов.

Вот более конкретный пример, который открывает URL-адрес, обрабатывает его и впоследствии закрывает соединение с URL-адресом.

public abstract class URLProcessorBase < public void process(URL url) throws IOException < URLConnection urlConnection = url.openConnection(); InputStream input = urlConnection.getInputStream(); try< processURLData(input); >finally < input.close(); >> protected abstract void processURLData(InputStream input) throws IOException; >

Обратите внимание, что processURLData() является абстрактным методом, а URLProcessorBase – абстрактным классом. Подклассы URLProcessorBase должны реализовывать processURLData(), потому он абстрактный.

Подклассы URLProcessorBase могут обрабатывать данные, загруженные с URL-адресов, не беспокоясь об открытии и закрытии сетевого подключения к URL-адресу. Это делается с помощью URLProcessorBase. Подклассам нужно только беспокоиться об обработке данных из InputStream, переданных методу processURLData(). Это облегчает реализацию классов, обрабатывающих данные из URL.

public class URLProcessorImpl extends URLProcessorBase < @Override protected void processURLData(InputStream input) throws IOException < int data = input.read(); while(data != -1)< System.out.println((char) data); data = input.read(); >> >

Обратите внимание, как подкласс реализует только метод processURLData(), и ничего более. Остальной код унаследован от суперкласса URLProcessorBase.

Вот пример того, как использовать класс URLProcessorImpl:

URLProcessorImpl urlProcessor = new URLProcessorImpl(); urlProcessor.process(new URL("https://java-blog.ru"));

Вызывается метод process(), который реализован в суперклассе URLProcessorBase. Этот метод, в свою очередь, вызывает processURLData() в классе URLProcessorImpl.

Шаблона проектирования Template

Пример, который я показал вам выше с классом URLProcessorBase, на самом деле является примером шаблона проектирования Template. Он обеспечивает частичную реализацию некоторого процесса, который подклассы могут выполнять при расширении базового класса Template.

Источник

Can we declare an abstract method, private, protected, public or default in java?

A method which does not have body is known as abstract method. It contains only method signature with a semi colon and, an abstract keyword before it.

To use an abstract method, you need to inherit it by extending its class and provide implementation to it.

Declaring an abstract method private

If a method of a class is private, you cannot access it outside the current class, not even from the child classes of it.

But, incase of an abstract method, you cannot use it from the same class, you need to override it from subclass and use.

Therefore, the abstract method cannot be private.

If, you still try to declare an abstract method final a compile time error is generated saying “illegal combination of modifiers − abstract and private”.

Example

In the following Java program, we are trying to declare an abstract method private.

abstract class AbstractClassExample

Compile time error

On compiling, the above program generates the following error.

AbstractClassExample.java:2: error: illegal combination of modifiers: abstract and private private static abstract void display(); ^ 1 error

Declaring an abstract method protected

Yes, you can declare an abstract method protected. If you do so you can access it from the classes in the same package or from its subclasses.

(Any you must to override an abstract method from the subclass and invoke it.)

Example

In the following Java program, we are trying to declare an abstract method protected.

abstract class MyClass < protected abstract void display(); >public class AbstractClassExample extends MyClass < public void display() < System.out.println("This is the subclass implementation of the display method "); >public static void main(String args[]) < new AbstractClassExample().display(); >>

Output

This is the subclass implementation of the display method

Источник

Абстрактные классы и методы в Java #

Иногда наши родственные объекты, которые наследованы от одного базового класса имеют разный подход к реализации методов. И часто во всех дочерних классах метод нужно переопределить.

Одна из парадигм ООП — схожее объединять. И эта парадигма может объединить и разные методы. Пример разных методов есть у домашних животных. Лошадка скачет, собачка бежит, птичка летит, рыбка плывёт. Метод движения нам нужен, потому что мы должны прописать передачу целевых координат и задать движение объекта.

В данном случае нам поможет абстрактный класс.

abstract class Pet   abstract void moves(); > 

Абстрактным класс называется, если в нём есть хотя бы один метод абстрактный. Без тела. Этот метод должен быть реализован в каждом классе наследнике, так как больше подходит этому типу.

class Duck extends Pet  void moves()   > > 

Мы можем создавать не только абстрактные методы, но и “обычные”:

abstract class Pet   abstract void moves();   protected void eats()   System.out.println("Трёхразовое питание");  > > 

Обычные методы наследуются так же, как мы учили в “наследовании”, а это значит, что они должны быть переопределены.

class Duck extends Pet   void moves()   >   @Override  protected void eats()   super.eats();  > > 

Абстрактные методы имплементируются(implemented), родительские классы переопределяются(override)

Пример создания объекта абстрактного класса. #

class Test  public static void main(String[] args)   Pet pet = new Pet();  > > 

Попытка запуска/компиляции такого кода приведёт к следующей ошибке:

java: Pet is abstract; cannot be instantiated 

создание объекта абстрактного класса

IDEA тоже подозревала это заранее.

Но нам никто не запретит обработать наши объекты вот так:

class Test  public static void main(String[] args)   Pet pet = new Duck();  Duck duck = new Duck();  > > 

Это вполне себе валидный код.

Абстрактный класс #

  1. Класс, который содержит в себе ключевое слово abstract. класс должен быть абстрактным, если он содержит хотя бы один абстрактный метод.
  2. Абстрактные классы в Java могут содержать или не содержать абстрактные методы, т.е. методы без тела protected void move();
  3. Абстрактные классы не могут быть инстанцированы(объекты класса не могут быть созданы).
  4. Класс наследник абстрактного класса обязан имплементировать все абстрактные методы базового класса.

Абстрактный метод #

  1. Ключевое слово abstract используется для объявления метода абстрактным.
  2. У абстрактного метода нет тела и соответственно фигурных скобок.
  3. Абстрактный метод имеет только сигнатуру (название метода плюс параметры).

Пример реализации #

abstract class Pet   String name;   public Pet()   >   public Pet(String name)   this.name = name;  >   abstract void moves();   protected void eats()   System.out.println("Трёхразовое питание");  > >  class Duck extends Pet    public Duck(String name)   super(name);  >   void moves()   this.flies();  >   void flies()   System.out.println("Лети птичка");  >   @Override  protected void eats()   super.eats();  > >  class Test   public static void main(String[] args)   Pet pet = new Duck("Дональд Дак");  Duck duck = new Duck("Дейзи Дак");  > > 

Вот так может работать реализации абстракции в Java.

Дополнительные ссылки #

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

Домашнее задание #

  1. Измените своих домашних животных из урока с наследованием. Реализуйте абстрактны класс Pet.
  2. Добавьте в вашу экосистему дракона “Змей Горыныч”, чёрного цвета.

Источник

Читайте также:  Android java получить значение
Оцените статью