ООП

Вопросы для собеседования

Вопросы:

Что такое ООП?

Объектно-ориентированное программирование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.

Согласно парадигме ООП программа состоит из объектов, обменивающихся сообщениями. Объекты могут обладать состоянием, единственный способ изменить состояние объекта - послать ему сообщение, в ответ на которое, объект может изменить собственное состояние.

Какие преимущества у ООП?

Преимущества ООП:

Какие недостатки у ООП?

Недостатки ООП:

Назовите основные принципы ООП?

Принципы:

Что такое инкапсуляция?

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

В JAVA реализуется с помощью модификаторов доступа и геттеров/сеттеров.

Модификаторы доступа (Access modifiers):

Геттеры и Сеттеры (Getters and Setters)

Цель инкапсуляции — уйти от зависимости внешнего интерфейса класса (то, что могут использовать другие классы) от реализации. Чтобы малейшее изменение в классе не влекло за собой изменение внешнего поведения класса.

Состояние объекта – это значение всех его полей. Объект не должен изменяться чем то из вне, кроме своих методов. Убрать возможность случайного/умышленного изменения объекта.

Пример – кондиционер (берем пульт включаем холод - запускаются разные процессы, которые не показываются пользователю), пользователю на пульте показывается температура воздуха на выходе, остальное все скрыто.

Что такое наследование?

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

Наследование форма отношения «is a» (является).

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

Пример: кондиционер наследуется от холодильной техники.

Есть одиночное и множественное наследование (класс наследуется от нескольких классов).

Проблема – ромбовидное наследование: у одного базового класса есть два наследника, а у наследника этих двух классов свой наследник, какая реализация попадет в последний – ХЗ.

В Java множественное наследование ограничено.

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

public final class

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

class Employee extends Person {}

Делегирование – один класс вызывает другой класс, не связанный наследованием.

Что такое полиморфизм?

Полиморфизм - это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

Пример: интерфейс «охлаждать» имеет место в технике, холодное пиво)) и т.п.

Все if –ы можно заменить на полиморфизм (способ рефакторинга).

Позволяет уменьшать размер программы.

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

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

Unit ref = new Refrigerator("ref", 24);

Полиморфная переменная - это переменная, которая может принимать значения разных типов.

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

Выделяют два вида полиморфных функций:

Абстрагирование – это способ выделить набор общих характеристик объекта, исключая из рассмотрения частные и незначимые.

Соответственно, абстракция – это набор всех таких характеристик.

(телефон звонил в 19 веке и в 21, функция выделена из разных сложных процессов).

Объект - Класс - Абстрактный класс - Интерфейс(макс. уровень абстракции).

Что такое ассоциация, агрегация и композиция?

Ассоциация обозначает связь между объектами.

Композиция и агрегация — частные случаи ассоциации «часть-целое».

Агрегация предполагает, что объекты связаны взаимоотношением «part-of» (часть).

Композиция более строгий вариант агрегации.

Дополнительно к требованию «part-of» накладывается условие, что экземпляр «части» может входить только в одно целое (или никуда не входить), в то время как в случае агрегации экземпляр «части» может входить в несколько целых.

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

«Является» подразумевает наследование.
«Имеет» подразумевает ассоциацию (агрегацию или композицию).

Расскажите про раннее (статическое) и позднее (динамическое) связывание.

Связывание - присоединение вызова метода к телу метода.

Раннее (статическое) связывание - проводится компилятором (компоновщиком) перед запуском программы.

Например, перегрузка методов; приватные, статические и final методы.

Позднее (динамическое) связывание - непосредственно во время выполнения программы (runtime), в зависимости от типа объекта.

Например, переопределение методов. Компилятор не знает тип объекта, но механизм вызова методов определяет его и вызывает соответствующее тело метода.

Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как final (приватные методы являются final по умолчанию).

public class Main {

public static void main(String[] args) {

Insurance current = new CarInsurance();

 

// Динамическое связывание на основе объекта потому что метод premium() нестатический

int premium = current.premium();

// Статическое связывание на основе класса, метод category() статический (принадлежит классу)

String category = current.category();

 

System.out.println("premium : " + premium);

System.out.println("category : " + category);

}

}

 

class Insurance{

public static final int LOW = 100;

public int premium() { return LOW; }

public static String category() { return "Insurance"; }

}

 

class CarInsurance extends Insurance {

public static final int HIGH = 200;

public int premium() { return HIGH; }

public static String category() { return "Car Insurance"; }

}

REST

REST (Representational state transfer) – это стиль архитектуры программного обеспечения для распределенных систем, таких как World Wide Web, который, как правило, используется для построения веб-служб.

Системы, поддерживающие REST, называются RESTful-системами.

В общем случае REST является очень простым интерфейсом управления информацией без использования каких-то дополнительных внутренних прослоек. Каждая единица информации однозначно определяется глобальным идентификатором, таким как URL. Каждая URL в свою очередь имеет строго заданный формат.

Отсутствие дополнительных внутренних прослоек означает передачу данных в том же виде, что и сами данные. Т.е. мы не заворачиваем данные во что либо.

Каждая единица информации однозначно определяется URL – это значит, что URL по сути является первичным ключом для единицы данных.

Как происходит управление информацией сервиса – это целиком и полностью основывается на протоколе передачи данных. Наиболее распространенный протокол конечно же HTTP.

Архитектура REST очень проста в плане использования. По виду пришедшего запроса сразу можно определить, что он делает, не разбираясь в форматах (в отличие от SOAP, XML-RPC). Данные передаются без применения дополнительных слоев, поэтому REST считается менее ресурсоемким, поскольку не надо парсить запрос чтоб понять что он должен сделать и не надо переводить данные из одного формата в другой.

источник