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

Собеседование по Java – ООП (вопросы и ответы). Часть 1.

Вопросы и ответы по теме ООП (объектно ориентированное программирование) для собеседования по Java.

К списку вопросов по всем темам

Список всех вопросов по ООП

1. Назовите принципы ООП и расскажите о каждом.
2. Дайте определение понятию “класс”.
3. Что такое поле/атрибут класса?
4. Как правильно организовать доступ к полям класса?
5. Дайте определение понятию “конструктор”.
6. Чем отличаются конструкторы по умолчанию, копирования и конструктор с параметрами?
7. Какие модификации уровня доступа вы знаете, расскажите про каждый из них.
8. Расскажите об особенностях класса с единственным закрытым (private) конструктором.
9. О чем говорят ключевые слова “this”, “super”, где и как их можно использовать?
10. Дайте определение понятию “метод”.
11. Что такое сигнатура метода?
12. Какие методы называются перегруженными?
13. Могут ли нестатические методы перегрузить статические?
14. Расскажите про переопределение методов.
15. Может ли метод принимать разное количество параметров (аргументы переменной длины)?
16. Можно ли сузить уровень доступа/тип возвращаемого значения при переопределении метода?
17. Как получить доступ к переопределенным методам родительского класса?
18. Какие преобразования называются нисходящими и восходящими?
19. Чем отличается переопределение от перегрузки?
20. Где можно инициализировать статические/нестатические поля?

21. Зачем нужен оператор instanceof?
22. Зачем нужны и какие бывают блоки инициализации?
23. Каков порядок вызова конструкторов и блоков инициализации двух классов: потомка и его предка?
24. Где и для чего используется модификатор abstract?
25. Можно ли объявить метод абстрактным и статическим одновременно?
26. Что означает ключевое слово static?
27. К каким конструкциям Java применим модификатор static?
28. Что будет, если в static блоке кода возникнет исключительная ситуация?
29. Можно ли перегрузить static метод?
30. Что такое статический класс, какие особенности его использования?
31. Какие особенности инициализации final static переменных?
32. Как влияет модификатор static на класс/метод/поле?
33. О чем говорит ключевое слово final?
34. Дайте определение понятию “интерфейс”.
35. Какие модификаторы по умолчанию имеют поля и методы интерфейсов?
36. Почему нельзя объявить метод интерфейса с модификатором final или static?
37. Какие типы классов бывают в java (вложенные… и.т.д.)
38. Какие особенности создания вложенных классов: простых и статических.
39. Что вы знаете о вложенных классах, зачем они используются? Классификация, варианты использования, о нарушении инкапсуляции.
40. В чем разница вложенных и внутренних классов?
41. Какие классы называются анонимными?
42. Каким образом из вложенного класса получить доступ к полю внешнего класса?

43. Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли какие-нибудь ограничения для такой переменной?
44. Как связан любой пользовательский класс с классом Object?
45. Расскажите про каждый из методов класса Object.
46. Что такое метод equals(). Чем он отличается от операции ==.
47. Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
48. Если equals() переопределен, есть ли какие-либо другие методы, которые следует переопределить?
49. В чем особенность работы методов hashCode и equals? Каким образом реализованы методы hashCode и equals в классе Object? Какие правила и соглашения существуют для реализации этих методов? Когда они применяются?
50. Какой метод возвращает строковое представление объекта?
51. Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы?
52. Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode?
53. Как вы думаете, будут ли какие-то проблемы, если у объекта, который используется в качестве ключа в hashMap изменится поле, которое участвует в определении hashCode?
54. Чем отличается абстрактный класс от интерфейса, в каких случаях что вы будете использовать?
55. Можно ли получить доступ к private переменным класса и если да, то каким образом?
56. Что такое volatile и transient? Для чего и в каких случаях можно было бы использовать default?
57. Расширение модификаторов при наследовании, переопределение и сокрытие методов. Если у класса-родителя есть метод, объявленный как private, может ли наследник расширить его видимость? А если protected? А сузить видимость?
58. Имеет ли смысл объявлять метод private final?
59. Какие особенности инициализации final переменных?
60. Что будет, если единственный конструктор класса объявлен как final?
61. Что такое finalize? Зачем он нужен? Что Вы можете рассказать о сборщике мусора и алгоритмах его работы.
62. Почему метод clone объявлен как protected? Что необходимо для реализации клонирования?

Ответы. Часть 1

1. Назовите принципы ООП и расскажите о каждом.

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

Основные принципы ООП: абстракция, инкапсуляция, наследование, полиморфизм.

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

Пример: описание должностей в компании. Здесь название должности значимая информация, а описание обязанностей у каждой должности это второстепенная информация. К примеру главной характеристикой для “директор” будет то, что это должность чем-то управляет, а чем именно (директор по персоналу, финансовый директор, исполнительный директор) это уже второстепенная информация.

Инкапсуляция – свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе. Для Java корректно будет говорить, что инкапсуляция это “сокрытие реализации”. Пример из жизни – пульт от телевизора. Мы нажимаем кнопочку “увеличить громкость” и она увеличивается, но в этот момент происходят десятки процессов, которые скрыты от нас. Для Java: можно создать класс с 10 методами, например вычисляющие площадь сложной фигуры, но сделать из них 9 private. 10й метод будет называться “вычислитьПлощадь()” и объявлен public, а в нем уже будут вызываться необходимые скрытые от пользователя методы. Именно его и будет вызывать пользователь.

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

Полиморфизм – свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Пример (чуть переделанный) из Thinking in Java:

Источник

BestProg

C++. Классы. Часть 2. Конструктор класса. Особенности использования конструкторов в классах. Конструктор по умолчанию. Параметризированные конструкторы. Примеры классов, содержащих конструкторы

В данной теме рассматривается понятие конструктора на примере unmanaged ( native ) классов. Материалы данной темы также касаются и конструкторов managed- классов.

Содержание

Поиск на других ресурсах:

1. Что называется конструктором класса? Какое назначение конструктора?

Конструктор класса – это специальный метод (функция) класса. Конструктор вызывается при создании объекта класса. Как правило, конструктор используется для:

Конструктор предназначен для формирования экземпляра объекта класса. Имя конструктора класса совпадает с именем класса.

2. В какой момент работы программы осуществляется вызов конструктора класса?

Вызов конструктора осуществляется при создании объекта класса. Конструктор класса вызывается компилятором.

3. Может ли конструктор иметь параметры? Примеры конструкторов с разным количеством параметров

Конструктор может иметь любое количество параметров. Также конструктор может быть без параметров (конструктор по умолчанию).

Объявление класса и его методов имеет вид

Демонстрация вызова конструкторов при объявлении объектов класса

4. Обязательно ли в классе описывать конструктор?

Не обязательно. При создании объекта класса, который не содержит ни одного конструктора, будет вызываться неявно заданный конструктор по умолчанию (default constructor), выделяющий память для объекта класса. Однако, в классе можно объявить собственный конструктор по умолчанию. Такой конструктор называется: явно заданный конструктор по умолчанию.

5. Что такое конструктор по умолчанию ( default constructor )? Примеры

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

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

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

компилятор выдаст ошибку.

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

6. Сколько конструкторов по умолчанию может иметь класс?

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

7. Может ли конструктор возвращать значение?
8. Пример объявления и использования класса, который содержит несколько конструкторов. Реализация типа string в классе

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

Реализация конструкторов и деструктора класса

9. Как работает конструктор класса в случае, когда в классе объявлен объект другого класса (подобъект)? Пример

Объявление объекта класса CMyLine

После такого объявления конструкторы вызовутся в следующей последовательности:

10. Как работает конструктор класса в случае, когда создается объект класса, который есть производным (унаследованным) от другого класса?

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

Да, может. Такой конструктор называется приватным конструктором (private constructor).

12. В каких случаях могут создаваться приватные конструкторы?

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

Чтобы использовать приватные конструкторы, нужно выполнение одного из трех условий:

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

В этом случае будет ошибка компиляции.

Попытка создать объект класса приведет к ошибке компиляции

То же самое будет, если попробовать создать статический объект

14. Может ли в классе быть объявлено два конструктора, которые принимают одинаковое количество параметров?

Да, может. Однако с условием, что типы параметров будут отличаться. Для класса должно выполняться правило:

Этот вопрос тесно связан с темой перегрузки функций.

15. Какие конструкторы называются параметризованными?

Параметризованный конструктор – это конструктор класса, который имеет параметры.

16. Какие существуют способы инициализации членов объекта с помощью конструктора, который получает один параметр? Пример

Для конструктора, получающего один параметр существует два способа инициализации:

Общий вид объявления класса

Объявить объект класса CMyInt с использованием конструктора с 1 параметром можно двумя способами

Источник

Урок №116. Конструкторы

На этом уроке мы рассмотрим конструкторы в языке С++.

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

Когда все члены класса (или структуры) являются открытыми, то мы можем инициализировать класс (или структуру) напрямую, используя список инициализаторов или uniform-инициализацию (в C++11):

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

Как тогда инициализировать класс с закрытыми переменными-членами? Использовать конструкторы.

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

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

конструкторы всегда должны иметь то же имя, что и класс (учитываются верхний и нижний регистры);

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

Конструкторы по умолчанию

Конструктор, который не имеет параметров (или содержит параметры, которые все имеют значения по умолчанию), называется конструктором по умолчанию. Он вызывается, если пользователем не указаны значения для инициализации. Например:

Источник

Конструкторы и деструкторы

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

Конструктор — функция, предназначенная для инициализации объектов класса. Рассмотрим класс date :

Если конструктор требует аргументы, их следует указать:

Если необходимо обеспечить несколько способов инициализации объектов класса, задается несколько конструкторов:

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

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

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

При создании объекта вызывается конструктор, за исключением случая, когда объект создается как копия другого объекта этого же класса, например:

Однако имеются случаи, в которых создание объекта без вызова конструктора осуществляется неявно:

Во всех этих случаях транслятор не вызывает конструктора для вновь создаваемого объекта:

Вместо этого в них копируется содержимое объекта-источника:

Конструктор копии

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

Деструкторы

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

. Так, для класса X деструктор будет иметь имя

Поля, имеющие тип класса

Конструкторы членов класса всегда выполняются до конструктора класса, в котором эти члены описаны. Порядок выполнения конструкторов для членов класса определяется порядком объявления членов класса. Если конструктору члена класса требуются аргументы, этот член с нужными аргументами указывается в списке инициализации. Деструкторы вызываются в обратном порядке.

Источник

Конструкторы на C++

В этом руководстве мы узнаем о конструкторе C++ и его типе на примерах. Конструктор – это особый тип функции, которая вызывается автоматически при создании объекта.
В С++ конструктор имеет то же имя, что и класс, и не имеет возвращаемого типа. Например:

Здесь функция Wall() является конструктором класса Wall. Обратите внимание, что конструктор:

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

Конструктор без параметров называется конструктором по умолчанию. В приведенном выше примере Wall() является конструктором по умолчанию.

Пример 1

Здесь при создании объекта wall1 вызывается конструктор Wall(). Это устанавливает переменную длины объекта в 5.5.

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

Параметризованный конструктор

В C++ конструктор с параметрами известен как параметризованный конструктор. Это предпочтительный метод инициализации данных членов.

Пример 2

Здесь мы создали параметризованный конструктор Wall() с двумя параметрами: double len и double hgt. Значения, содержащиеся в этих параметрах, используются для инициализации длины и высоты переменных.

Когда мы создаем объект класса Wall, мы передаем значения для переменных в качестве аргументов. Код для этого:

С инициализированными переменными мы можем теперь вычислить площадь стены с помощью функции calculateArea().

Конструктор копирования

Конструктор копирования в C++ используется для копирования данных одного объекта в другой.

Пример 3

В этой программе мы использовали конструктор копирования для копирования содержимого одного объекта класса Wall в другой. Код конструктора копирования:

Обратите внимание, что параметр этого конструктора имеет адрес объекта класса Wall.

Затем мы присваиваем значения переменных первого объекта соответствующим переменным второго объекта. Так копируется содержимое объекта.

Затем в main() мы создаем два объекта wall1 и wall2, а затем копируем содержимое первого объекта во второй с помощью кода:

Примечание. Конструктор в основном используется для инициализации объектов и для запуска кода по умолчанию при создании объекта.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *