Рубрики
Без рубрики

JAVA: ООП (Абстракция)

В1: УПС: Абстракция? Q2: интерфейс? Вопрос 3. абстрактный класс? Q4: Почему статические методы не могут быть абстрактными… С тегом java, ооп.

В1: УПС: Абстракция? Q2: интерфейс? Вопрос 3. абстрактный класс? Q4: Почему статические методы не могут быть абстрактными в Java? Q5: Преимущества абстракции? Вопрос 6: Почему мы не можем создать объект абстрактного класса? Q7: Инкапсуляция данных против абстракции данных? Вопрос 8: Абстрактный класс против интерфейса? Q9: Когда использовать абстрактный класс? Q10: когда использовать интерфейс?

1. Абстракция:-

1.1 процесс реализации скрытия

отображение основных функций и скрытие несущественных функций от пользователя.

1.2 например, пульт дистанционного управления является интерфейсом между пользователем и телевизором. Им можно управлять с помощью различных кнопок, но пользователь не знает о внутренней части пульта дистанционного управления (т. е. схемы). Это происходит потому, что пользователю не нужно знать деталей, кроме той, которая помогает ему управлять пультом дистанционного управления. 1.3 другим примером может быть форма входа или регистрации. Пользователь не знает/ему не нужно знать, как все работает за кулисами, т.Е. пользовательский интерфейс. 1.4 это набор абстрактных методов

способы достижения абстракция:-

  1. использование интерфейса
  2. использование абстрактного класса

2. Использование Интерфейса:-

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

это означает, что интерфейсы не предоставляют никаких сведений о реализации, и классы/клиенты должны предоставлять сведения о реализации метода/методов при реализации интерфейса.

2.3 класс может использовать реализует ключевое слово для реализации интерфейса и обеспечения реализации метода интерфейса 2.4 класс java может реализовать интерфейс, чтобы обеспечить реализацию методов, использующих интерфейс 2.5 интерфейс предоставляет наборы правил для классов и говорит им, что делать и не делать.

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

Простой Пример:

interface printable
{
    void start();
    void stop();
    int off=0;
    void pressed(int key);
}
class InterfaceExample implements printable
{
    int off=1;
    @Override
    public void start()
    {
        System.out.println("Started");
    }
    @Override
    public void stop()
    {
        System.out.println("\nvariable from interface : "+printable.off+"\nStopped ");
    }
    @Override
    public void pressed(int key)
    {
                //printable.off=1;
        System.out.println("\nvariable from interface : "+off+"\nPressed key number "+key);
    }
    public static void main(String args[])
    {
        InterfaceExample obj = new InterfaceExample();
        obj.start();obj.pressed(23);
        obj.stop();

    }
}
/*Started

variable from interface : 1
Pressed key number 23

variable from interface : 0
Stopped*/

-: здесь мы создали интерфейс с методами и переменной, которые мы реализуем в классе, а также пытаемся выяснить, повлияет ли изменение значения внутри метода на переменную интерфейса, т.е. на переменную off.

изменение значения переменной внутри метода не влияет на значение интерфейса

-:в приведенном выше примере, если мы раскомментируем строку;” а затем выполним код , это приведет к ошибке во время компиляции

InterfaceExample.java:24: error: cannot assign a value to final variable off
                printable.off=1;
                         ^
1 error

пример статического метода внутри интерфейса:

interface Jump 
{
    static int getHeight() 
    {
        return 1;
    }
}
class Cat implements Jump 
{
    public void jump() 
    {
        System.out.println("Jumping height " + getHeight());//COMPILE TIME ERROR
    }
}

-:приведенный выше код не будет компилироваться, так как он вызывает getHeight(), который должен находиться внутри Kangaroo.

для выполнения кода необходимо внести одно изменение т.е.

System.out.println("Jumping height " + Jump.getHeight());

пример вложенного интерфейса:

interface OuterInterface 
{
    interface InnerInterface 
    {        
    }

}

class ImplementingC implements OuterInterface.InnerInterface 
{
} 

пример вложенного интерфейса:

class OuterC
{
    interface InnerInterface 
    {        
    }
}

class ImplementingC implements OuterClass.InnerInterface 
{    
}

пример интерфейса, расширяющего интерфейс:

public interface Teacher 
{
   public void Name(String name);
   public void Age(int age);
}

public interface Computer extends Teacher 
{
   public void MonthlyAttendance(int attendance);
   public void Salary(String sal);
   public void City(String city);
}

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

класс интерфейса также создается после компиляции кода компилятором, т. е. printable.class файл будет создан после компиляция завершена

Факты об интерфейсе:-

-:все члены т.е. как методы, так и переменные/поля интерфейса являются общедоступными -: все методы являются общедоступными , аннотация по по умолчанию

кроме статических и по умолчанию

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

Особенности интерфейса:-

-:предоставить полная абстракция -: помогает достичь множественного наследования, поскольку java не поддерживает множественное наследование.

один класс может реализовывать несколько интерфейсов, которые также можно назвать реализацией нескольких интерфейсов.

-:помогает добиться слабой связи при реализации шаблонов проектирования

слабая связь означает независимое поведение, например, класс A знает о классе B только то, что класс B раскрыл через свой интерфейс.

3. использование абстрактного класса:-

3.1 обеспечить полную абстракцию, где все методы пусты, а переменные поля являются общедоступными статическими и окончательными по умолчанию 3.2 использовать ключевое слово аннотация до объявления класса и объявления метода 3.3 мы не можем создать объект абстрактного класса

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

3.4 они могут содержать как абстрактные, так и неабстрактные методы.

они не могут содержать тело абстрактного метода

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

если класс содержит абстрактный метод, то он должен быть определен как абстрактный

3.6 абстрактный класс используется для предоставления наиболее общей функции, характерной для различных классов.

подклассы могут предоставлять различную реализацию этих методов в соответствии с их требованиями

Пример:-

abstract class Animal
{
    public abstract void Like();
    public void doTheyHaveLegs()
    {
        System.out.println("Yes, animals have legs");
    }
}

class Dog extends Animal
{
    @Override
    public void Like()
    {
        System.out.println("Dog like to cuddle.");
    }
}

class Lion extends Animal
{
    @Override
    public void Like()
    {
        System.out.println("Lion like to Growl");
    }
}



class TestAnimal
{
    public static void main(String[] args)
    {
        Animal Dog = new Dog();
        Dog.Like();

        Animal Lion = new Lion();
        Lion.Like();
        Dog.doTheyHaveLegs();
        Lion.doTheyHaveLegs();
    }
}
/*
Dog like to cuddle.
Lion like to Growl
Yes, animals have legs
Yes, animals have legs
*/

3.7 Здесь Животное это абстрактный класс, который разделяет общее свойство животного с Собакой и Lion класс, которые реализуют Как() из Животное абстрактный класс

Класс Animal содержит как абстрактные, так и неабстрактные методы.

4. Почему статические методы не могут быть абстрактными в Java:-

4.1 необходимо помнить о двух моментах

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

4.2 здесь, как вы можете видеть, оба пункта противоречат друг другу, в результате чего невозможно сделать абстрактный метод статичным

хотя абстрактный класс может содержать статические методы

6. Почему мы не можем создать объект абстрактного класса:-

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

7. Инкапсуляция данных против абстракции данных:-

Инкапсуляция данных – это сокрытие данных или информации

Абстракция скрывает детали реализации

Инкапсуляция связывает элементы данных и методы вместе

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

Инкапсуляция скрывает данные

абстракция обеспечивает доступ к определенной части данных

8. Абстрактный класс против интерфейса:-

используется ключевое слово “абстрактный”

используется ключевое слово “интерфейс”

Мы можем расширить абстрактный класс, используя ключевое слово extends

Мы можем реализовать интерфейс, используя ключевое слово implements

могут иметь как конечные, так и не конечные, статические и нестатические переменные

могут иметь только конечные и статические переменные, объявленные по умолчанию

скорость высокая по сравнению с интерфейсом

скорость медленная по сравнению с абстрактным классом

могут иметь или не иметь переменные, объявленные как окончательные

переменные по умолчанию объявлены как окончательные

может иметь все модификаторы доступа

разрешен только модификатор общего доступа

может иметь как абстрактные, так и неабстрактные или конкретные методы

могут быть только абстрактные методы, но, начиная с версии 8 Java, интерфейс также поддерживает статические и нестатические методы.

могут иметь конструкторы

не может быть конструкторов

Абстрактные классы не поддерживают множественное наследование, но класс может расширять только один абстрактный класс, но может реализовывать несколько интерфейсов Java

Интерфейс поддерживает Множественное наследование

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

интерфейс используется, когда требуется дальнейшее улучшение

9. Когда использовать абстрактный класс:-

9.1 когда некоторые связанные классы, которым необходимо использовать одни и те же строки кода 9.2, требуется использовать модификаторы доступа, отличные от общедоступных

10. Когда использовать интерфейс:-

10.1 для достижения 100 % абстракции 10.2 для достижения множественного наследования 10.3 для определения поведения определенного типа данных, независимо от того, кто реализует его поведение

Пожалуйста, прокомментируйте, если у вас есть какие-либо отзывы или предложения

Оригинал: “https://dev.to/supriya2371997/java-oop-abstraction-4ild”