Контрольная работа по "Информатике"

Автор работы: Пользователь скрыл имя, 28 Мая 2013 в 00:03, контрольная работа

Описание

6. В чем преимущества объектно-ориентированных языков программирования?
Они представляют реальные объекты в жизни, например, Машина, Джип, Счет в банке и тд… Инкапсуляция, наследование и полиморфизм делает его еще мощнее.
9. Что вы подразумеваете под полиморфизмом, инкапсуляцией и динамическим связыванием?
Полиморфизм означает способность переменно данного типа, которая ссылается на объекты разных типов, при этом вызывается метод, характерный для конкретного типа ссылки на объект.

Работа состоит из  1 файл

Вопросы на собеседованиях.docx

— 43.88 Кб (Скачать документ)

И вот тут интересно, компилятор не выдает ошибок, так как метод уже  у нас реализован в классе родителе.

 

Инкапсуляция - это свойство которое позволяет  закрыть доступ к полям и методам  класса другим классам, а предоставлять  им доступ только через интерфейс(метод).

 

10. Для чего нужен оператор «assert» в джава?

 

  Это так называемый оператор  утверждений. Он проверяет некое  условие, если оно ложно, то  генерируется AssertationError

 

assert status: “message error”;

 

Тут проверяется булевская переменная “stats”.

 

11. В чем разница между абстрактным  классом и интерфейсом? И когда  их нужно использовать?

 

  Абстрактный класс это класс,  который помечен как «abstract», он может содержать абстрактные методы, а может их и не содержать.

  Экземпляр абстрактного класса  нельзя создать.

Класс, который наследуется от абстрактного класса может реализовывать абстрактные методы, а может и не реализовывать, тогда класс наследник должен быть тоже абстрактным. Также если класс наследник переопределяет реализованный в абстрактном классе родители метод, его можно переопределить с модификатором абстракт! Т.е отказаться от реализации. Соответственно данный класс должен быть также абстрактным также.

 

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

Интересный  момент, интерфейс может содержать  внутренние классы! И не абстрактные  методы в них.

 

Что же использовать Интерфейс или Абстрактный  класс?

Абстрактный класс используется когда нам нужна какая-то реализация по умолчанию. Интерфейс используется когда классу нужно указать конкретное поведение. Часто интерфейс и абстрактный класс комбинируют, т.е. имплементируют интерфейс в абстрактном классе, чтоб указать поведение и реализацию по умолчанию. Это хорошо видно на примере свига:

AbstractTableModel implements TableModel{

}

 

MyTableModel extends AbstractTableModel{

}

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

 

12. Почему в некоторых интерфейсах  вообще не определяют методов?

  Это так называемые интерфейсы  –маркеры. Они просто указывают что класс относится к определенной группе классов. Например интерфейс Clonable указывает на то, что класс поддерживает механизм клонирования.

Степень абстракции в данном случае доведен до абсолюта. В интерфейсе вообще нет никаких объявлений.

13. Объясните понятие переопределения  метода и перегрузки метода?

 

Переопределение методов действует при наследовании классов, т.е. в классе наследнике объявлен метод с такой же сигнатурой что  и в классе родителе. Значит этот метод переопределил метод своего суперкласса.

Несколько ньюансов по этому поводу:

Модификатор доступа в методе класса наследника должен быть НЕ уже чем в классе родителе, иначе будет ошибка компиляции.

Описание  исключения в переопределенном методе класса наследника должен быть НЕ шире чем в классе родителе, иначе ошибка компиляции.

Метод обьявленный как «private» в классе родителе нельзя переопределить!

 

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

 

14. Расскажите про Collection framework?

 

В основе фреймворка лежит два интерфейса, это «Collection» и «Map».

Сollection расширяет три интерфейса: List, Set, Queue.

 

List – хранит упорядоченные елементы(могут быть одинаковые);

Имеет такие реализации как LiskedList, ArrayList и Vector.

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

ArrayList – его преимущество в навигации по коллекции.

LinkedList – Его преимущество в во вставке и удалении элементов в коллекции.

 

Set – коллекции, которые не содержат повторяющихся елементов.

Основные  реализации: HashSet, TreeSet, LinkedHashSet

TreeSet – упорядочивает элементы по их значениям;

HashSet – упорядочивает элементы по их хэш ключах, хотя на первый взляд может показаться что элементы хранятся в случайном порядке.

LinkedHashSet – хранит элементы в порядке их добавления

 

Queue – интерфейс для реализации очереди в джава.

Основные  реализации: LinkedList, PriorityQueue.

Очереди работают по принципу FIFO – first in first out.

 

Map – интерфейс для реализации так называемой карты, где елементы хранятся с ихними ключами.

Основные  реализации: HashTable, HashMap, TreeMap, LinkedHashMap

HashTable – синхронизированна, объявлена уставревшей.

HashMap – порядок елементов рассчитывается по хэш ключу;

TreeMap – элементы хранятся в отсортированном порядке

LinkedHashMap – элементы хранятся в порядке вставки

Ключи в Мар не могут быть одинаковыми!

 

Синхронизировать  не синхронизированные коллекции и  карты можно посредством класса Collections.synchronizedMap(MyMap)\ synchronizedList(MyList)

 

15 Как сравниваются елементы коллекций?

 

Для сравнения элементов коллекций  используется метод equals() и hashcode();

Эти методы унаследованы от класса Object.

  Если наш пользовательский класс  переопределяет equals(), то он должен и переопределить hashcode()

Если  два объекта эквивалентны, то и  хэш коды этих объектов тоже должны быть равны

Если  поле не используется в equals(), то оно и не должно использоваться в hashcode().

 

15. Какая основная разница между String, StringBuffer, StringBuilder?

 

String – неизменяемый класс, тоесть для для добавление данных в уже существующую строку, создается новый объект строки.

 

StringBuffer и StringBuilder могут изменятся и добавление строки не такое дорогостоющее с точки зрения памяти. Первы – синхронизированный, второй – нет. Это их единственное различие.

 

Правда  если нам нужно сделать подстроку  строки, то лучше использовать String, так как ее массив символов не меняется и не создается заново для новой строки. А вот в StringBuffer и StringBuilder для создания подстроки создается новый массив символов.

 

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

 

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

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

 

В случае же кода мы передаем String, то состояние не будет менятся, так как String неизменяемый.

 

16. Что такое сериализация? Как Вы исключите поля из сериализации? transient что значит?

 

Сериализация – это процес чтения или записи объекта. Это процесс сохранения состояния объекта и считывание этого состояния.

Для реализации сериализации нужен интерфейс – маркер Serializable

 

Для того чтоб исключить поля из сериализуемого потока, необходимо пометить поле модификатором transient

 

17. Расскажите про потоки ввода-вывода  Java.

 

Потоки  ввода-вывода бывают двух видов:

- байтовый поток(InputStream и OutputStream);

- символный поток(Reader и Writer);

 

Это все абстрактные классы – декораторы, которым можно добавлять дополнительный функционал, например:

InputStream in = new FileInputStream(new File(“file.txt”));

 

18 Расскажите про клонирование объектов. В чем отличие между поверхностным и глубоким клонированием?

 

Чтобы объект можно было клонировать, он должен реализовать интерфейс Cloneable(маркер). Использование этого интерфейса влияет на поведение метода «clone» класс Object. Таким образом

myObj.clone() создаст нам клон нашего объекта, но этот клон будет поверхностный.

 

Что значит поверхностным? Это значит что клонируется только примитивные поля класса, ссылочные поля не клонируются!

 

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

 

19 чем разница между переменно  экземпляра и статической переменной? Приведите пример.

 

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

 

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

 

20. Приведите пример когда можно использовать статический метод?

 

Статические методы могут быть использованы для  инициализации статических переменных. Часто статические методы используются в классах утилитах, таких как  Collections, Math, Arrrays

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

 

-public(используется в классах, конструкторах, интерфейсах, внутренних классах, методах и полях класса) – Модификатор доступа общественный, доступен всем.

-protected(используется конструкторах, внутренних классах, методах и полях класса) – Модификатор доступа на уровне пакета и в иерархии наследования

-private(используется конструкторах, внутренних классах, методах и полях класса) – Доступ разрешен только в текущем классе

-friend(используется в классах, конструкторах, интерфейсах, внутренних классах, методах и полях класса) - на уровне пакета

Заметьте  что protected не равен friend, их нельзя сравнивать!

 

22. Где и как вы можете использовать  закрытый конструктор?

 

Например в качестве паттерна Синглетон. В том же классе создается статический метод. Где и создается экземпляр класса, конечно если он уже не создан, тогда он просто возвращается методом.

 

23. Что такое final модификатор? Объясните другие модификаторы.

 

Нельзя  наследоваться от файнал класса. Нельзя переопределить файнал метод. Нельзя изменить сначение файнал поля.

 

volatile – указывает на то, что поле синхронизировано для нескольких потоков

synchronized – указывает на то что метод синхронизированный или же в методе может находится такой блок синхронизации.

transient – указывает на то, что переменная не подлежит сериализации

native – говорит о том, что реализация метода написана на другой программной платформе

 

24. Что такое final, finally и finalize()?

final – Нельзя наследоваться от файнал класса. Нельзя переопределить файнал метод. Нельзя изменить сначение файнал поля.

finally – используется при обработке ошибок, вызывается всегда, даже если произошла ошибка(кроме System.exit(0)). Удобно использовать для освобождения ресурсов.

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

25. Расскажите про модель памяти  в джава?

 

  В Джаве память устроена следующим  образом, есть два вида:

- куча

- стек

 

В стеке происходит весь процесс выполнения программы, а также хранятся примитивные  типы полей и переменных.

 

Куча  состоит из статического контекста  и самой кучи

В статическом контексте находятся  загружаемые классы.

Перейдем  к куче. Куча состоит из двух частей:

-Так  называемая новая куча

- старая куча

 

Новая куча в свою очередь состоит из двух частей:

-Eden(назовем ее первая) куча

- Survival(выжившая) куча

 

Итак, как работает гебедж коллектор?

Во-первых что стоит сказать… у сборщика мусора есть несколько алгоритмов работы, он не один.

 

Когда происходит очистка памяти? Если память в Первой куче полностью заполнена, то туда идет сборщик мусора и делает свою работу) Какую именно, зависит  от обстоятельств… Например если в  первой кучи много мусора(т.е. объектов с нулевой ссылкой), то сборщик мусора помечает эти объекты, далее те что остались объекты со ссылками он их переносит в Выжившую кучу, а в первой куче он просто все удаляет.

Ситуация  другая… в первой кучи мало мусора, но очень много рабочих объектов. Как поступает в этом случае сборщик  мусора?

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

 

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

 

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

 

26. Расскажите про внутренние классы. Когда вы их будете использовать?

 

Внутренний  класс – это класс, который  находится внутри класса или интерфейса. При этом он получает доступ ко всем полям и методам своего внешнего класса.

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

 

Какие внутренние классы бывают?

Есть  так называемый вложенный (с модификатором  static)

А также есть анонивный внутренний класс.

 

27 . Расскажите про привидение типов.  Что такое понижение и повышение  типа? Когда вы получаете ClassCastException?

 

Приведение  типов это установка типа переменной или объекта отличного от текущего. В ждава есть два вида приведения:

- автоматическое 

- не автоматическое

 

Автоматическое  происходит например:

 

byte-> short->int->long->float->double

 

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

Информация о работе Контрольная работа по "Информатике"