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

  • В чём разница между instanceOf и getClass

  • 1. Что такое полиморфизм Приведите пример полиморфизма 2. Что такое перегрузка метода в Java 3. Какие модификаторы доступа могут быть у класса

  • 4. Может ли статический метод быть перегружен Будет ли работать переопределение статического метода 5. Можно ли использовать статические методы в обычных Наоборот Почему

  • 6. В чём разница между instanceOf и getClass 7. Из-за чего происходят коллизии Почему нельзя написать hashcode гарантировано без коллизий

  • 10. Можно ли создать поля в интерфейсе 11. Можно ли создавать статик методы в интерфейсах

  • 2. Что такое абстрактный класс Чем отличается от обычного 3. Можно ли создавать статик методы в интерфейсах

  • Может ли быть конструктор у абстрактного класса. Ревью модуль 3 сдал. Конструкторы


    Скачать 41.42 Kb.
    НазваниеКонструкторы
    АнкорМожет ли быть конструктор у абстрактного класса
    Дата14.10.2022
    Размер41.42 Kb.
    Формат файлаdocx
    Имя файлаРевью модуль 3 сдал.docx
    ТипДокументы
    #734415

    Конструкторы:


    Может ли быть конструктор у абстрактного класса?

    - Да, может, но объект можно создать только при создании класса-наследника (конструктор по умолчанию / super)

    Будет ли в классе конструктор и какой, если при его создании ни один не был задан?

    - Будет конструктор по умолчанию.

    Зачем this в конструкторе абстрактного класса?

    - Абстрактный клаcс может расширяться неабстрактным классом, который унаследует его методы и свойства. И вот тогда пригодится конструктор.

    Будет ли создан автоматически конструктор по-умолчанию, если в созданном классе есть любой другой конструктор?

    - Нет

    Можно ли в классе вызвать один конструктор из другого? Как это сделать?

    - Можно. Вызываемый конструктор должен быть в первой строке кода. С помощью ключевого слова this

    public Foo() {

    this(1);

    }
    public Foo(int x) {

    this.x = x;

    }

    Интерфейсы:


    Синтаксические отличия интерфейса / абстрактного класса?

    1. при создании абстрактного класса указывается ключевое слово abstract, а при определении интерфейса — interface.

    2. Implements/extends

    3. Нет конструктора/есть конструктор

    4. Переменные всегда final/переменные могут быть изменяемыми

    5. Модификаторы доступа public и private(только к методам)/любые модификаторы доступа

    6. Есть default и static методы, которые не обязательно должны быть реализованы в класах/ метод могут иметь реализацию внутри класса, абстрактные методы должны быть реализованы в наследуемых классах

    7. Интерфейс не может реализовывать интерфейс, не может наследовать абстрактный класс, но может наследовать (используя ключевое слово extends) множество других интерфейсов/Абстрактный класс может наследовать как обычный класс, так и абстрактный. Может наследовать до (216-1) интерфейсов

    Можно ли создать поля в интерфейсе?

    - Да, они будут static и неявно final

    Какие методы в интерфейсе могут иметь реализацию?

    - Default методы.

    - Static методы.

    Сколько максимум можно имплементировать интерфейсов?

    - Абстрактный класс также может реализовать до 65 535 интерфейсов (это связано с ограничением константы interfaces_count в структуре ClassFile)

    Что такое интерфейс? Когда использовать интерфейс?

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

    Какие модификаторы доступа можно использовать в интерфейсе и абстрактом классе?

    - в интерфейсе модификаторы доступа public и private, в абстрактном классе любые модификаторы доступа

    Можно ли создавать статик методы в интерфейсах? зачем статик методы в интерфейсе

    - в интерфейсах допустимы статические методы (неявно являются public, но могут быть явно private). Статические методы похожи на методы по умолчанию, за исключением того, что мы не можем переопределить их в классах, реализующих интерфейс (можно создать метод с таким же именем в классе, реализующем интерфейс, но он будет простым методом класса, при попытке написать @Override компилятор выдаст ошибку). Этот функционал помогает нам избежать нежелательных результатов, которые могут появиться в дочерних классах.

    Как написать валидный код, который скомпилируется, в котором вы имплементите интерфейс в класс и не реализуете в классе ни один из методов интерфейса, хотя все методы интерфейса абстрактные?

    - имплементирующий класс объявить abstract.

    - interface Interface содержит метод void method1(). Class A implements Interface и реализует метод void method1(). Class B extends Class A implements Interface. Если в классе А реализация метода достаточна, то в классе B дополнительная реализация не требуется.

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


    Может ли быть конструктор у абстрактного класса? Для чего?

    - Да, может. В абстрактном классе могут быть неабстрактные поля (+ методы и свойства). Эти поля в конструкторе инициализируются. Абстрактные конструкторы часто используются для обеспечения соблюдения ограничений или инвариантов класса, таких как минимальное количество полей, необходимых для настройки класса.

    Может ли быть абстрактный класс без абстрактных методов?

    - Да, может.

    Какие модификаторы доступа можно использовать в интерфейсе и абстрактом классе?

    - Модификаторы доступа public и private в интерфейсах и любые модификаторы доступа в АК

    Как сделать из обычного класса абстрактный класс не используя ключевое слово abstract?


    - никак?

    ENUM:


    Перечислите методы именно класса Enum?

    1. values() — возвращает массив из всех хранящихся в Enum значений

    2. ordinal() — возвращает порядковый номер константы. Отсчет начинается с нуля.

    3. valueOf() — возвращает объект Enum, соответствующий переданному имени

    4. name()? – в общем случае то же что и toString, но метод final и его, в отличие от toString нельзя переопределить.

    Может ли Enum содержать конструктор?

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

    Может ли Enum содержать методы?

    - да, может.

    Может ли Enum имплементировать интерфейсы?

    - Да, может

    Может ли Enum наследовать (extends) класс? Почему?

    - Нет, не может, поскольку уже наследуется от абстрактного класса.

    NATIVE:


    ключевое слово native

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

    Что такое нативные методы, их плюсы и минусы

    - Методы, реализация которых написана на другом языке программирования. Не имеют тела и должны заканчиваться на “;”

    [public | protected| private] native [return type] method();

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

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

    - сложности с дебагом

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

    - При обращении к методам native свойства переносимости и безопасности, присущие коду Java, будут утрачены.

    EQUALS и HASH CODE:


    контрактмежду equals hashcode

    - переопределяя в своем коде метод equals, необходимо всегда переопределять и метод hashCode. Контракт:

    • Если объекты равны по equals() то их хеш-коды тоже равны

    • Если хеш-коды разные, то по equals() будет точно - falseЕсли объекты не равны по equals(), их хеш-коды могут быть равны

    • А если хеш-коды равны. Объекты могут быть равны, а могут и не равняться

    При переопределении метода equals разработчик должен придерживаться основных правил, определенных в спецификации языка Java.

    1. Рефлексивность

    для любого заданного значения x, выражение x.equals(x) должно возвращать true. Заданного — имеется в виду такого, что x != null

    1. Симметричность

    для любых заданных значений x и y, x.equals(y) должно возвращать true только в том случае, когда y.equals(x) возвращает true.

    1. Транзитивность

    для любых заданных значений x, y и z, если x.equals(y) возвращает true и y.equals(z) возвращает true, x.equals(z) должно вернуть значение true.

    1. Согласованность

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

    Для реализации хэш-функции в спецификации языка определены следующие правила:

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

    2. вызов метода hashCode над двумя объектами должен всегда возвращать одно и то же число, если эти объекты равны (вызов метода equals для этих объектов возвращает true).

    3. вызов метода hashCode над двумя неравными между собой объектами должен возвращать разные хэш-значения. Хотя это требование и не является обязательным, следует учитывать, что его выполнение положительно повлияет на производительность работы хэш-таблиц.

    для любого заданного значения x вызов x.equals(null) должен возвращать false.

    Из-за чего происходят коллизии? Почему нельзя написать hashcode гарантировано без коллизий?

    - Hashcode принимает значения int => всего может быть около 4млрд уникальных значений hashcode, чего может не хватить.

    Какой тип данных у hashcode? Может ли быть hashcode отрицательным?

    - int, да может

    ООП:


    Что такое ООП? В чем его плюсы?

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

    + Визуально код становится проще, и его легче читать.

    + Меньше одинакового кода. В ООП это решается наследованием.

    + Сложные программы пишутся проще. Каждую большую программу можно разложить на несколько блоков.

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

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

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

    Что такое Наследование, композиция, агрегирование

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

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

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

    Что такое инкапсуляция? Приведите пример инкапсуляции?

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

    разберитесь обязательно чем отличается параметрический полиморфизм от ad-hoc.

    - Параметрический – когда поведение меняется, но при этом не меняется набор аргументов

    - Ad-hoc – меняется еще и количество параметров (например, перегрузка метода)

    Методы:


    Что можно делать при переопределении метода, а что нельзя?

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

    Можно ли использовать статические методы в обычных? Наоборот? Почему?

    - Статические методы можно вызывать откуда угодно — из любого места программы. А значит, их можно вызывать и из статических методов, и из обычных.

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

    Переопределение метода.

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

    Ковариантность типа возвращаемого значения?

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

    Что будет если передать массив в метод, который изменит его значения, изменятся ли они вне метода? Почему? А если передать примитив?

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

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

    Указатели this и super

    - переменная this ссылается на текущий экземпляр класса, в котором она используется, тогда как super — на текущий экземпляр родительского класса.

    - Каждый конструктор при отсутствии явных вызовов других конструкторов неявно вызывает с помощью super() конструктор без аргументов родительского класса, при этом у вас всегда остается возможность явно вызвать любой другой конструктор с помощью либо this(), либо super()

    Могут ли нестатические методы перегрузить статические?

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

    Может ли метод быть статическим и абстрактным одновременно?

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

    Передача параметров в методы. По значению/по ссылке? Как передаются примитивы и объекты?

    - В java параметры в методы передаются по значению, то есть создаются копии параметров и с ними ведется работа в методе.

    Что такое контракт метода?

    - Контракт - это описание “правил” взаимодействия сущностей друг с другом в рамках кода. Сигнатура метода в сочетании с типом возвращаемого значения называется контрактом метода

    - public void moveTo(int x, int y) throws IOException — сигнатура

    public void moveTo(int x, int y) throws IOException — контракт

    Что такое сокрытие методов - "method hiding"?

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

    Перегрузка и переопределение методов:


    Переопределение метода

    - Переопределение – это изменение реализации уже существующего в суперклассе м етода (override). В новом методе должны быть те же сигнатура и тип возвращаемого результата, что и у метода родительского класса.

    Перегрузка метода

    - Перегрузка методов в Java — случай, когда в классе присутствуют два и более метода с одинаковым именем, но различными параметрами.

    STRING:


    Как реализована неизменность String?

    - final класс -> не наследуется

    - Строка представляет собой private final char[] + нет сеттера

    ПАМЯТЬ:


    В какой области памяти хранятся примитивы? В какой области памяти хранятся объекты? Где хранятся ссылки на объект?

    • примитивы и ссылки на объекты хранятся в стеке (steak)

    • объекты хранятся в куче (heap)

    Данные + модификаторы доступа:


    Какие модификаторы доступа бывают у классов?

    Внешние классы:

    - public и default

    Вложенные классы:

    - private, public, protected, default

    Как реализовать свой Immutable тип данных?

    1. Класс — final

    2. Все элементы — final

    3. Поля приватные

    4. Нет методов, меняющих состояние объекта

    Что такое позднее и раннее связывание?

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

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

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

    Что такое varargs? Какие есть ограничения при написании?

    - Varargs — это аргументы переменной длины. Позволяет передать в метод произвольное кол-во аргументов.

    1. Аргумент произвольной длины может быть указан только как аргумент некоторого метода

    2. Каждый такой аргумент переменной длины в теле метода является массивом

    3. Vararg аргумент должен быть последним в списке аргументов метода

    4. Несмотря на то, что varargs являются массивами, при вызове метода, который принимает аргументы переменной длины, не обязательно создавать массив. Достаточно и даже желательно просто перечислить необходимые аргументы через запятую.

    Для чего нужна аннотация Override

    - @Override используется для проверки того, что разработчик должен переопределить правильный метод в родительском классе или интерфейсе. Когда имя методов super меняется, компилятор может уведомить об этом случае.

    Перечислите все модификаторы доступа в порядке уменьшения закрытости, какую область видимости они имеют?

    1. Private — Он ограничивает видимость данных и методов пределами одного класса

    2. Default — в пределах всех классов, находящихся в том же пакете и в пределах всех классов-наследников в том же пакете

    3. Protected — в пределах всех классов, находящихся в том же пакете и в пределах всех классов-наследников нашего класса

    4. Public — видно везде

    В чем разница между передачей параметров по ссылке или по значению?

    - По ссылке — параметры передаются как ссылка (адрес) на исходную переменную. Вызываемый метод не создает свою копию, а ссылается на исходное значение.

    - По значению — значения фактических параметров копируются. Вызываемый метод создает свою копию значений аргументов и затем ее использует.

    Модификатор static

    - ключевым словом static помечают члены (поля или методы), которые принадлежат классу, а не экземпляру этого класса.

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

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

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

    Что такое final? Что может быть final? Как они работают?

    - Суть модификатора final - сделать дальнейшее изменение объекта невозможным. final может применяться к классам, методам, переменным.

    1. Для класса это означает, что класс не сможет иметь подклассов

    2. Для метода означает, что он не может быть переопределен в подклассах.

    3. Для переменных примитивного типа это означает, что однажды присвоенное значение не может быть изменено.

    4. Для ссылочных переменных это означает, что после присвоения объекта, нельзя изменить ссылку на данный объект. Это важно! Ссылку изменить нельзя, но состояние объекта изменять можно.


    В чём разница между instanceOf и getClass?

    - getClass() проверяет полную идентичность класса, то instanceof вернет true даже если объект будет всего лишь подтипом, что может дать нам большую гибкость при активном использовании полиморфизма

    instanceof проверяет, является ли ссылка на объект с левой стороны экземпляром типа с правой стороны или некоторым его подтипом. getClass() == ... Возвращает тип.

    Классы:


    Анонимные классы

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

    Класс Object, все методы кроме wait, notify, notifyAll, назвать и объяснить, как работают

    1. Метод getClass() — Возвращает класс времени исполнения (runtime class) этого Object

    2. hashCode() — Возвращает значение хэш-кода для объекта.

    3. Equals() — сравнивает ссылки на объект

    4. Clone() — Создает и возвращает копию этого объекта.

    5. toString() — возвращает строку, состоящую из имени класса и и шестнадцатеричного представления без знака хэш-кода объекта

    6. finalize() — Вызывается сборщиком мусора на объекте, когда сборщик мусора определяет, что больше нет ссылок на объект.

    Класс Object и класс Class.


    1. Что такое полиморфизм? Приведите пример полиморфизма?


    2. Что такое перегрузка метода в Java?


    3. Какие модификаторы доступа могут быть у класса?


    4. Может ли статический метод быть перегружен? Будет ли работать переопределение статического метода?


    5. Можно ли использовать статические методы в обычных? Наоборот? Почему?


    6. В чём разница между instanceOf и getClass?


    7. Из-за чего происходят коллизии? Почему нельзя написать hashcode гарантировано без коллизий?


    8. Может ли быть конструктор у абстрактного класса? Для чего?


    9. Передача параметров по ссылке или по значению? Как передаются объекты в метод?


    10. Можно ли создать поля в интерфейсе?


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


    12. Какие модификаторы доступа можно использовать в интерфейсе и абстрактом классе?


    1. Что может содержать в себе интерфейс?


    2. Что такое абстрактный класс? Чем отличается от обычного?


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


    4. Есть ли в Java множественное наследование? Зачем реализовывать интерфейс интерфейсу?



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