Главная страница
Навигация по странице:

  • Какие преимущества у ООП Модульность.

  • Безопасность.

  • Снижение производительности.

  • Большой размер программы

  • Назовите основные принципы ООП. Инкапсуляция, полиморфизм, наследования, абстракция.Что такое инкапсуляция (с примером)

  • Что такое наследование (с примером)

  • Что такое полиморфизм (с примером

  • Расскажите про раннее и позднее связывание.

  • Принцип единственной ответственности (SRP).

  • Принцип подстановки Барбары Лисков (LSP).

  • Принцип разделения интерфейса (ISP).

  • Принцип инверсии зависимостей (DIP).

  • За счет чего обеспечивается кроссплатформенность

  • Какие преимущества у java

  • Какие недостатки у Java

  • Что такое JDK Что в него входит

  • Что такое JRE что в него входит

  • Что такое загрузчик классов (classloader)

  • Что такое сборщик мусора ( Garbage collector ). Что такое Heap и Stack память в Java Чем они отличаются

  • Подготовка к собеседованию по JAVACORE. Ответы на вопросы по Core. Core 1 ооп что такое ооп


    Скачать 80.55 Kb.
    НазваниеCore 1 ооп что такое ооп
    АнкорПодготовка к собеседованию по JAVACORE
    Дата13.11.2022
    Размер80.55 Kb.
    Формат файлаdocx
    Имя файлаОтветы на вопросы по Core.docx
    ТипПрограмма
    #785648
    страница1 из 5
      1   2   3   4   5

    CORE – 1

    ООП

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

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

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

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

    Гибкость. ООП-код легко развивать, дополнять и изменять. Это обеспечивает независимая модульная структура. Взаимодействие с объектами, а не логикой упрощает понимание кода. Для модификации не нужно погружаться в то, как построено ПО. Благодаря полиморфизму можно быстро адаптировать код под требования задачи, не описывая новые объекты и функции.

    Экономия времени. Благодаря абстракции, полиморфизму и наследованию можно не писать один и тот же код много раз. Это ускоряет разработку нового ПО. Интерфейсы и классы в ООП могут легко преобразовываться в подобие библиотек, которые можно использовать заново в новых проектах. Также ООП экономит время при поддержке и доработке приложения.

    Безопасность. Программу сложно сломать, так как инкапсулированный код недоступен извне.


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

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

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

    Большой размер программы. Код, написанный с использованием ООП, обычно длиннее и занимает больше места на диске, чем «процедурный». Это происходит, потому что в такой программе хранится больше конструкций, чем в обычном процедурном скрипте. 
    Назовите основные принципы ООП.

    Инкапсуляция, полиморфизм, наследования, абстракция.
    Что такое инкапсуляция? (с примером)

    Каждый объект — независимая структура. Все, что ему нужно для работы, уже есть у него внутри. Если он пользуется какой-то переменной, она будет описана в теле объекта, а не снаружи в коде. Это делает объекты более гибкими. Даже если внешний код перепишут, логика работы не изменится.

    Инкапсуляция помогает с легкостью управлять кодом. Выше мы сказали, что для обращения к объекту не нужно понимать, как работают его методы. Начальнику разработчика Ивана не обязательно знать, как именно он программирует: главное — чтобы выполнялись поставленные задачи.

    Внутреннее устройство одного объекта закрыто от других: извне «видны» только значения атрибутов и результаты выполнения методов.
    Что такое наследование? (с примером)

    Можно создавать классы и объекты, которые похожи друг на друга, но немного отличаются — имеют дополнительные атрибуты и методы. Более общее понятие в таком случае становится «родителем», а более специфичное и подробное — «наследником».

    Упомянутый программист Иван — это человек. Но «человек» — более общее определение, которое не описывает свойства, важные именно для программиста. Можно сказать, что класс «программист» унаследован от класса «человек»: программист тоже является человеком, но у него есть дополнительные свойства.

    В таком случае разработчик Иван будет и человеком, и программистом одновременно. У него будут наборы свойств от обоих классов.

    У одного «родителя» может быть несколько дочерних структур. Например, от «человека» можно наследовать не только «программиста», но и «директора».

    Наследование позволяет реализовывать сложные схемы с четкой иерархией «от общего к частному». Это облегчает понимание и масштабирование кода. Не нужно много раз переписывать в разных объектах одни и те же свойства. Достаточно унаследовать эти объекты от одного «родителя», и «родительские» свойства применятся автоматически.
    Что такое полиморфизм? (с примером)

    Одинаковые методы разных объектов могут выполнять задачи разными способами. Например, у «человека» есть метод «работать». У «программиста» реализация этого метода будет означать написание кода, а у «директора» — рассмотрение управленческих вопросов. Но глобально и то, и другое будет работой.

    Тут важны единый подход и договоренности между специалистами. Если метод называется delete, то он должен что-то удалять. Как именно — зависит от объекта, но заниматься такой метод должен именно удалением. Более того: если оговорено, что «удаляющий» метод называется delete, то не нужно для какого-то объекта называть его remove или иначе. Это вносит путаницу в код.
    Что такое Абстракция?

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

    Пример: объекту класса «программист» вряд ли понадобятся свойства «умение готовить еду» или «любимый цвет». Они не влияют на его особенности как программиста. А вот «основной язык программирования» и «рабочие навыки» — важные свойства, без которых программиста не опишешь.

    Набор атрибутов и методов, доступный извне, работает как интерфейс для доступа к объекту. Через них к нему могут обращаться другие структуры данных, причем им не обязательно знать, как именно объект устроен внутри.
    Что такое ассоциация, агрегация и композиция?

    Классы и объекты могут быть связаны друг с другом. Наследование описывает связь «является» (или по-английски «IS A»). Лев является Животным. Такое отношение легко выразить с помощью наследования, где Animal будет родительским классом, а Lion — потомком. Однако не все связи отношения в мире описываются таким образом. К примеру, клавиатура определенно как-то связана с компьютером, но она не является компьютером. Руки как-то связаны с человеком, но они не являются человеком. В этих случаях в его основе лежит другой тип отношения: не «является», а «является частью» («HAS A»). Рука не является человеком, но является частью человека. Клавиатура не является компьютером, но является частью компьютера. Отношения HAS A можно описать в коде, используя механизмы композиции и агрегирования. Разница между ними заключается в «строгости» этих связей.

    У нас есть наш Car — машина. У каждой машины есть двигатель. Кроме того, у каждой машины есть пассажиры внутри. В чем же принципиальная разница между полями Engine engine и Passenger [] passengers? Если у машины внутри сидит пассажир А, это не значит, что в ней не могут находиться пассажиры B и C. Одна машина может соответствовать нескольким пассажирам. Кроме того, если всех пассажиров высадить из машины, она продолжит спокойно функционировать. Связь между классом Car и массивом пассажиров Passenger [] passengers менее строгая. Она называется агрегацией. Есть неплохая статья на эту тему: Отношения между классами (объектами). В ней приведен еще один хороший пример агрегации. Допустим, у нас есть класс Student, обозначающий студента, и класс StudentsGroup (группа студентов). Студент может входить и в клуб любителей физики, и в студенческий фан-клуб «Звездных войн» или команду КВН. Композиция — более строгий тип связи. При использовании композиции объект не только является частью какого-то объекта, но и не может принадлежать другому объекту того же типа. Самый простой пример — двигатель автомобиля. Двигатель является частью автомобиля, но не может быть частью другого автомобиля. Как видишь, их связь гораздо более строгая, чем у Car и Passengers.
    Расскажите про раннее и позднее связывание.

    Присоединение вызова метода к телу метода называется связыванием. Если связывание проводится компилятором (компоновщиком) перед запуском программы, то оно называется статическим или ранним связыванием (early binding).

    В свою очередь, позднее связывание (late binding) это связывание, проводимое непосредственно во время выполнения программы, в зависимости от типа объекта. Позднее связывание также называют динамическим (dynamic) или связыванием на стадии выполнения (runtime binding). В языках, реализующих позднее связывание, должен существовать механизм определения фактического типа объекта во время работы программы, для вызова подходящего метода. Иначе говоря, компилятор не знает тип объекта, но механизм вызова методов определяет его и вызывает соответствующее тело метода. Механизм позднего связывания зависит от конкретного языка, но нетрудно предположить, что для его реализации в объекты должна включаться какая-то дополнительная информация.

    Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как final (приватные методы являются final по умолчанию).
    SOLID
    SOLID — это акроним, образованный из заглавных букв первых пяти принципов ООП и проектирования. Принципы придумал Роберт Мартин в начале двухтысячных, а аббревиатуру позже ввел в обиход Майкл Фэзерс. Вот что входит в принципы SOLID:

    Single Responsibility Principle (Принцип единственной ответственности).

    Open Closed Principle (Принцип открытости/закрытости).

    Liskov’s Substitution Principle (Принцип подстановки Барбары Лисков).

    Interface Segregation Principle (Принцип разделения интерфейса).

    Dependency Inversion Principle (Принцип инверсии зависимостей).

    Принцип единственной ответственности (SRP). Данный принцип гласит: никогда не должно быть больше одной причины изменить класс.

    Принцип открытости/закрытости (OCP). Этот принцип емко описывают так: программные сущности (классы, модули, функции и т.п.) должны быть открыты для расширения, но закрыты для изменения.

    Принцип подстановки Барбары Лисков (LSP). Это вариация принципа открытости/закрытости, о котором говорилось ранее. Его можно описать так: объекты в программе можно заменить их наследниками без изменения свойств программы.

    Принцип разделения интерфейса (ISP). Характеризуется следующим утверждением: клиенты не должны быть вынуждены реализовывать методы, которые они не будут использовать.

    Принцип инверсии зависимостей (DIP). Этот принцип SOLID в Java описывают так: зависимости внутри системы строятся на основе абстракций. Модули верхнего уровня не зависят от модулей нижнего уровня. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
    Java

    Какая основная идея языка?

    Создатели реализовали принцип WORA: write once, run anywhere или «пиши один раз, запускай везде». Это значит, что написанное на Java приложение можно запустить на любой платформе, если на ней установлена среда исполнения Java (JRE, Java Runtime Environment).

    За счет чего обеспечивается кроссплатформенность?

    Главная идея заключается в том, что программа представляется в виде так называемого байт-кода, предназначенного для выполнения на виртуальной Java-машине. Последнюю иногда называют еще исполняющей системой (run-time system), или интерпретатором байт-кода. Байт-код абсолютно универсален, поскольку виртуальная машина лишена каких бы то ни было аппаратных деталей.

    Какие преимущества у java?
    У Java масса достоинств, благодаря которым многие разработчики выбирают именно его.

    • Простота 

    • Объектно-ориентированный подход

    • Безопасность

    • Производительность

    • Надёжность 

    • Независимость от аппаратной части и ОС

    • Динамичность и адаптируемость

    • Удобные и эффективные сетевые возможности


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

    • Низкая скорость. Все высокоуровневые языки приходится компилировать с помощью виртуальной машины, что плохо сказывается на их производительности. Java – не исключение, кроме того, у него есть и некоторые собственные особенности, вызывающие дополнительные проблемы с производительностью;

    • Многословие (verbosity). Сходство с естественными языками делает Java проще для изучения и понимания, но также ведёт и к тому, что он содержит много лишней информации и довольно громоздок;

    • Платность для коммерческого использования (с 2019 года).


    Что такое JDK? Что в него входит?

    JDK, или Java Development Kit — это набор инструментов для разработки на языке Java. В него входят все компоненты, необходимые для того, чтобы программировать на этом языке. Он позволяет компилировать, то есть «собирать», и запускать написанный код.
    Что такое JRE? что в него входит?

    JRE — Java Runtime Environment. Это набор инструментов для запуска программы. Без них код не будет работать и исполняться. JRE — составная часть JDK и входит в пакет по умолчанию.
    Что такое JVM?

    JVM — Java Virtual Machine. Особенность Java в том, что для запуска программ язык создает виртуальную среду, «оболочку», внутри которой все выполняется. Благодаря этой особенности язык — кроссплатформенный. Код может без доработок выполняться практически на любом устройстве. JVM — набор технологий, который реализует виртуальную оболочку. JVM входит в пакет JRE, точно так же как сам JRE входит в JDK.

    Что такое byte code?

    Исходный код Java преобразуется компилятором в байт-код (а не машинный код). A байт-код Java преобразуется в машинный код с помощью специального интерпретатора, называемого виртуальной машиной Java (Java Virtual Machine — JVM). Результат преобразования кода в байт код файл с расширением class.

    Что такое загрузчик классов (classloader)?

    Любой класс (экземпляр класса java.lang.Class в среде и .class файл в файловой системе), используемый в среде исполнения был так или иначе загружен каким-либо загрузчиком в Java. Для того, чтобы получить загрузчик, которым был загружен класс А, необходимо воспользоваться методом A.class.getClassLoader().

    Классы загружаются по мере надобности, за небольшим исключением. Некоторые базовые классы из rt.jar (java.lang.* в частности) загружаются при старте приложения. Классы расширений ($JAVA_HOME/lib/ext), пользовательские и большинство системных классов загружаются по мере их использования.

    Виды загрузчиков

    Различают 3-и вида загрузчиков в Java. Это — базовый загрузчик (bootstrap), системный загрузчик (System Classloader), загрузчик расширений (Extension Classloader).

    Bootstrap — реализован на уровне JVM и не имеет обратной связи со средой исполнения. Данным загрузчиком загружаются классы из директории $JAVA_HOME/lib. Т.е. всеми любимый rt.jar загружается именно базовым загрузчиком. Поэтому, попытка получения загрузчика у классов java.* всегда заканчиватся null'ом. Это объясняется тем, что все базовые классы загружены базовым загрузчиком, доступа к которому из управляемой среды нет.

    Управлять загрузкой базовых классов можно с помощью ключа -Xbootclasspath, который позволяет переопределять наборы базовых классов.

    System Classloader — системный загрузчик, реализованный уже на уровне JRE. В Sun JRE — это класс sun.misc.Launcher$AppClassLoader. Этим загрузчиком загружаются классы, пути к которым указаны в переменной окружения CLASSPATH.

    Управлять загрузкой системных классов можно с помощью ключа -classpath или системной опцией java.class.path.

    Extension Classloader — загрузчик расширений. Данный загрузчик загружает классы из директории $JAVA_HOME/lib/ext. В Sun JRE — это класс sun.misc.Launcher$ExtClassLoader.
    Управлять загрузкой расширений можно с помощью системной опции java.ext.dirs.

    Различают текущий загрузчик (Current Classloader) и загрузчик контекста (Context Classloader).

    Current Classloader — это загрузчик класса, код которого в данный момент исполняется. Текущий загрузчик используется по умолчанию для загрузки классов в процессе исполнения. В часности, при использовании метода Class.forName("")/ClassLoader.loadClass("") или при любой декларации класса, ранее не загруженного.

    Context Classloader — загрузчик контекста текущего потока. Получить и установить данный загрузчик можно с помощью методов Thread.getContextClassLoader()/Thread.setContextClassLoader(). Загрузчик контекста устанавливается автоматически для каждого нового потока. При этом, используется загрузчик родительского потока.

    Что такое JIT?

    Just-in-time compilation (JIT, компиляция «на лету»), dynamic translation (динамическая компиляция) — технология увеличения производительности программных систем, использующих байт-код, путём компиляции байт-кода в машинный код непосредственно во время работы программы. Таким образом достигается высокая скорость выполнения по сравнению с интерпретируемым байткодом[1] (сравнимая с компилируемыми языками) за счёт увеличения потребления памяти (для хранения результатов компиляции) и затрат времени на компиляцию. JIT базируется на двух более ранних идеях, касающихся среды исполнения: компиляции байт-кода и динамической компиляции.

    Что такое сборщик мусора? (Garbage collector).

    Что такое Heap и Stack память в Java? Чем они отличаются?


    Сборщик мусора — процесс, который запускается JVM периодически и освобождает память, использованную объектами, которые больше не нужны. JVM обычно запускает сборщик мусора при низком уровне свободной памяти. Если памяти недостаточно даже после восстановления, JVM генерирует исключение OutOfMemoryError.

    System.gc(), Runtime.getRuntime().gc()
    Объект подлежит утилизации, когда он недоступен живому потоку.

    - Если переменная ссылочного типа, которая ссылается на объект, установлена в положение "0", объект подлежит утилизации, в том случае, если на него нет других ссылок.

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

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

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

    Java позволяет использовать метод finalize() (финализировать), чтобы произвести необходимую очистку перед тем, как сборщик мусора извлекает объект из памяти. Этот метод вызывается для объекта сборщиком мусора, когда сборщик мусора вычисляет, что ссылок к объекту больше нет. Это описано в классе Object, а значит, это наследуется всеми классами.
    Разделение объектов на младшее поколение (young generation) и старшее поколение (old generation). В соответствии с этим разделением и процессы сборки мусора разделяются на малую сборку (minor GC), затрагивающую только младшее поколение, и полную сборку (full GC), которая может затрагивать оба поколения. Малые сборки выполняются достаточно часто и удаляют основную часть мертвых объектов. Полные сборки выполняются тогда, когда текущий объем выделенной программе памяти близок к исчерпанию и малой сборкой уже не обойтись.
    Java HotSpot VM предоставляет разработчикам на выбор четыре различных сборщика мусора:

    - Serial (последовательный) — самый простой вариант для приложений с небольшим объемом данных и не требовательных к задержкам. Редко когда используется, но на слабых компьютерах может быть выбран виртуальной машиной в качестве сборщика по умолчанию.

    - Parallel (параллельный) — наследует подходы к сборке от последовательного сборщика, но добавляет параллелизм в некоторые операции, а также возможности по автоматической подстройке под требуемые параметры производительности.

    - Concurrent Mark Sweep (CMS) — нацелен на снижение максимальных задержек путем выполнения части работ по сборке мусора параллельно с основными потоками приложения. Подходит для работы с относительно большими объемами данных в памяти.

    - Garbage-First (G1) — создан для постепенной замены CMS, особенно в серверных приложениях, работающих на многопроцессорных серверах и оперирующих большими объемами данных.
    Общая куча, где хранятся все созданные объекты, была разделена на несколько частей.

    Eden (библ. “Райский сад”). Сюда объекты попадают после их создания. Именно в этой части выделяется память для новых объектов. Когда в этой области заканчивается место, начинается первая, “быстрая” сборка мусора.

    Область памяти, куда переносятся все объекты, пережившие хотя бы одну сборку мусора, называется Survival Space.

    Survival Space в свою очередь делится на поколения. Каждый объект относится к своему поколению в зависимости от того, сколько сборок мусора он пережил. Если одну — он относится к “Поколению 1”, если 5 — к “Поколению 5”.

    Вместе Eden и Survival Space образуют область под названием Young Generation (“молодое поколение”).

    Помимо Young Generation в куче существует и другая область памяти — Old Generation (“старое поколение”). Сюда как раз попадают те самые объекты-долгожители, которые пережили много сборок мусора. И только когда область Old Generation заполнена, т.е. даже объектов-долгожителей в программе так много, что памяти не хватает, производится полная уборка мусора. Она обрабатывает не одну область памяти, а вообще все созданные Java-машиной объекты.
    12.Что такое Heap и Stack память в Java? Чем они отличаются?

    JVM разделяет используемую ею память на две области: куча (heap), в которой хранятся данные приложения. И стек, в которой хранится код программы и другие вспомогательные данные.

    Все объекты, которые явно или неявно создаются Java-приложением, размещаются в куче.
    Heap (куча) используется Java Runtime для выделения памяти под объекты и JRE классы. Создание нового объекта также происходит в куче. Здесь работает сборщик мусора: освобождает память путем удаления объектов, на которые нет каких-либо ссылок. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться с любой части приложения.
    Стековая память в Java работает по схеме LIFO (Последний-зашел-Первый-вышел). Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе. Как только метод заканчивает работу, блок также перестает использоваться, тем самым предоставляя доступ для следующего метода.

    Размер стековой памяти намного меньше объема памяти в куче.
    - Куча используется всеми частями приложения в то время как стек используется только одним потоком исполнения программы.

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

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

    - Управление памятью в стеке осуществляется по схеме LIFO.

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

    - Размер памяти стека намного меньше памяти в куче. Из-за простоты распределения памяти (LIFO), стековая память работает намного быстрее кучи. https://java-online.ru/garbage-collection.xhtml
      1   2   3   4   5


    написать администратору сайта