ООП Flashcards

1
Q

ООП

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

класс

A

описание структуры данных

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

правильно организовать доступ к полям класса?

A

private. Доступ через методы get\set.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

конструктор

A

метод вызываемый при создании обьекта

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

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

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

модификации уровня доступа

A

private в пределах класса.
default, в пределах пакета
protected доступ в пределах пакета и классов наследников.
public доступ для всех из любого другого кода проекта

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Расскажите об особенностях класса с единственным закрытым (private) конструктором.

A

Невозможно создать объект класса у которого единственный private конструктор за пределами класса. Поэтому нельзя унаследоваться от такого класса. При попытке унаследоваться будет выдаваться ошибка: There is no default constructor available in имяКласса. А при попытке создать объект этого класса: ИмяКласса() has private access in ИмяКласса

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

О чем говорят ключевые слова “this”, “super”, где и как их можно использовать?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Дайте определение понятию “метод”.

A

Метод — это последовательность команд, которые вызываются по определенному имени. Можно сказать что это функция и процедура (в случае void метода).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

сигнатура метода?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Модификаторы метода

A

Ключевые слова public, protected, private, abstract, static, final, synchronized, native, strictfp в т.ч. аннотации для метода — это модификаторы и не являются частью сигнатуры.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Какие методы называются перегруженными?

A

с одинаковыми именами, но разными сигнатурами.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

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

A

Да. Это будут просто два разных метода для программы. Статический будет доступен по имени класса.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

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

A

Переопределить базовый статический метод нельзя

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

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

A
Да. массив:
public void method (String ... strings) {
        for (String s : strings) {
        }
    }
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Можно ли сузить уровень доступа/тип возвращаемого значения при переопределении метода?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

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

A

super.method();

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Чем отличается переопределение от перегрузки?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

instanceof

A

возвращает true, если объект является экземпляром класса или его потомком.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

блоки инициализации?

A
наборы выражений инициализации полей, заключенные в фигурные скобки и размещаемые внутри класса вне объявлений методов или конструкторов. Блок инициализации выполняется так же, как если бы он был расположен в верхней части тела любого конструктора. Бывают статические и нестатические блоки инициализации. Так же возможно создать такой блок в анонимном классе.
Пример статического
class Foo {
	static List abc;
	static {
		abc = new LinkedList();
		for (char c = 'A'; c <= 'Z'; ++c) {
			abc.add( c );
		}
	}
}
//Пример инициализации в анонимном классе
JFrame frame = new JFrame() {{
	add(new JPanel() {{
		add(new JLabel("Хабрахабр?") {{
			setBackground(Color.BLACK);
			setForeground(Color.WHITE);
		}});
	}});
}};
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Каков порядок вызова конструкторов и блоков инициализации двух классов: потомка и его предка?

A

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

22
Q

модификатор abstract

A

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

23
Q

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

A

Нет. abstract говорит, что метод будет реализован в другом классе, а static наоборот указывает, что этот метод будет доступен по имени класса.

24
Q

ключевое поле static

A

Модификатор static говорит о том, что метод или поле класса принадлежат не объекту, а классу.
На методы, объявленные как static, накладывается ряд ограничений.

Они могут вызывать только другие статические методы.
Они должны осуществлять доступ только к статическим переменным.
Они не могут ссылаться на члены типа this или super.

25
Q

Можно ли перегрузить static метод?

A

Перегрузить можно, но переопределить нельзя.

26
Q

статический класс, какие особенности его использования?

A

Это вложенный класс, который может обращаться только к статическим полям обертывающего его класса, в том числе и приватным. Доступ к нестатическим полям обрамляющего класса может быть осуществлен только через ссылку на экземпляр обрамляющего объекта. К классу высшего уровня модификатор static неприменим.Статические вложенные классы, не имеют доступа к нестатическим полям и методам обрамляющего класса, что в некотором роде аналогично статическим методам, объявленным внутри класса. Доступ к нестатическим полям и методам может осуществляться только через ссылку на экземпляр обрамляющего класса.

27
Q

Какие особенности инициализации final static переменных?

A

Переменные должны быть инициализированы во время объявления или в static блоке.

28
Q

Как влияет модификатор static на класс/метод/поле?

A

Модификатор static говорит о том, что метод или поле класса принадлежат не объекту, а классу.

Внутри static метода нельзя вызвать не статический метод по имени класса.

Про static класс смотрите ответ выше.

29
Q

. О чем говорит ключевое слово final?

A

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

30
Q

Дайте определение понятию “интерфейс”.

A

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

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

31
Q

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

A

Интерфейс может содержать поля, но они автоматически являются статическими (static) и неизменными (final). Все методы и переменные неявно объявляются как public.

32
Q

Почему нельзя объявить метод интерфейса с модификатором final или static?

A

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

33
Q

Какие типы классов бывают в java

A
Обычные классы
Интерфейсы 
Перечисления 
Статические вложенные классы 
Внутренние классы-члены
Локальный класс 
Анонимные классы
34
Q

Вложенный(внутренний) класс

A

это класс, который объявлен внутри объявления другого класса. Вложенные классы делятся на статические и нестатические (non-static). Собственно нестатические вложенные классы имеют и другое название — внутренние классы (inner classes).
Внутренние классы в Java делятся на такие три вида:

внутренние классы-члены (member inner classes);
локальные классы (local classes);
анонимные классы (anonymous classes).
Внутренние классы-члены ассоциируются не с самим внешним классом, а с его экземпляром. При этом они имеют доступ ко всем его полям и методам.

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

35
Q

Локальные классы

A

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

36
Q

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

A

это локальный класс без имени

37
Q

Каким образом из вложенного класса получить доступ к полю внешнего класса?

A

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

38
Q

Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы?

A

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

39
Q

Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode?

A

Те, которые используют при определении метода equals(). Хэш код должен быть равномерно распределен на области возможных принимаемых значений.

40
Q

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

A

Будут. При обращении по ключу мы можем не найти значение.

41
Q

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

A

Абстрактные классы используются только тогда, когда есть «is a» тип отношений; интерфейсы могут быть реализованы классами которые не связаны друг с другом.Абстрактный класс может реализовывать методы; интерфейс может реализовывать статические методы начиная с 8й версии.Интерфейс может описывать константы и методы. Все методы интерфейса по умолчанию являются публичными (public) и абстрактными (abstract), а поля — public static final. С java 8 в интерфейсах можно реализовывать default и статические методы.В Java класс может наследоваться (реализовывать) от многих интерфейсов, но только от одного абстрактного класса.С абстрактными классами вы теряете индивидуальность класса, наследующего его; с интерфейсами вы просто расширяете функциональность каждого класса.

42
Q

Что такое volatile и transient? Для чего и в каких случаях можно было бы использовать default?

A

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

transient — указание того, что при сериализации/десериализации данное поле не нужно сериализовать/десериализовывать.

43
Q

Если у класса-родителя есть метод, объявленный как private, может ли наследник расширить его видимость?

A

Действует общий принцип: расширять видимость можно, сужать нельзя. private методы видны только внутри класса, для потомков они не видны. Поэтому их и расширить нельзя.

44
Q

Имеет ли смысл объявлять метод private final?

A

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

45
Q

Какие особенности инициализации final переменных?

A

Для поля. Поле помеченное при помощи слова final не может изменить свое значение после инициализации.
Не статическое final поле можно инициализировать: при описании, в конструкторе (во всех), в статическом блоке, в динамическом блоке.
Статическое final поле (static final) инициализируется либо в статическом блоке, либо при описании.
Значение локальных переменных, а так же параметров метода помеченных при помощи слова final не могут быть изменены после присвоения.

46
Q

Что будет, если единственный конструктор класса объявлен как final?

A

К конструктору не применимо ключевое слово final.

47
Q

Что такое finalize? Зачем он нужен? Что Вы можете рассказать о сборщике мусора и алгоритмах его работы

A

Метод finalize() вызывается перед тем, как объект будет удален garbage collector (сборщик мусора, далее gc). Существует много различных реализаций gc. Основа работы следующая: gc помечает объекты, на которые больше не ссылаются другие объекты для их удаления. Затем на одном из проходов помеченные объекты удаляются.
Вызов finalize() не гарантируется, т.к. приложение может быть завершено до того, как будет запущена ещё одна сборка мусора. Да, можно отменить сборку объекта с помощью метода finalize(), присвоив его ссылку какому-то статическому методу.

48
Q

Почему метод clone объявлен как protected? Что необходимо для реализации клонирования?

A

Это указывает на то, что хоть метод и есть в классе Object и разработчик желает им воспользоваться, то его нужно переопределить. Для этого нужно реализовать интерфейс Clonable, чтобы соблюсти контракт.

49
Q

Если класс имплементируется от 2-х интерфесов которые содержат одинаковые поля, что произойдет при обращении к полю?

A

Пример

Так как непонятно из какого интерфейса унаследовано поле mixedClass.commonString, то попытка обратиться к нему совершенно законно вызывает ошибку компиляции (указана в комментариях). Для того чтобы устранить неоднозначность, нам необходимо преобразовать mixedClass к одному из родительских интерфесов. Таким образом в этом случае Java ведет себя совершенно естественно.

interface Interface1 {
String commonString = “commonString from Interface1”;
}

interface Interface2 {
String commonString = “commonString from Interface2”;
}

class MixedClass1 implements Interface1,Interface2 {
}
public class Test1 {
    public static void main(String[] args) {
System.out.println("Test N1");
System.out.println(
  "Two interfaces have property with the same signature");

MixedClass1 mixedClass = new MixedClass1();
    /* reference to commonString is ambiguous,
    both variable commonString in Interface1
    and variable commonString in Interface2 match */
//System.out.println(mixedClass.commonString);

Interface1 Interface = mixedClass;
System.out.println(Interface.commonString);
System.out.println(((Interface2) mixedClass).commonString);  } }
/*
Output:
    Test N1
    Two interfaces have property with the same signature
    commonString from Interface1
    commonString from Interface2
*/
50
Q

Если класс имплементируется от 2-х интерфесов которые содержат одинаковые метода, что произойдет при обращении к методу?

A
Нужно реализовать одну реализацию для 2-х интерфейсов, как с полями поступить нельзя. Такое поведение не совсем логично и лучше таких ситуаций избегать.
Пример:
interface FirstInterface {
    String getInfo();
}
interface SecondInterface {
    String getInfo();
}

class MixedClass2 implements FirstInterface, SecondInterface {

/*
It is impossible to have two implementation getInfo()
function from both interfaces
it could be support something like this:

 public String FirstInterface.getInfo() {
  return "getInfo() from FirstInterface";
}
     public String SecondInterface.getInfo() {
      return "getInfo() from SecondInterface";
    }
    */
public String getInfo() {
  return "MixedClass2.getInfo() belongs to both interfaces";
} }
public class Test2 {
    public static void main(String arg[]) {
      System.out.println("Test N2");
      System.out.println(
 "Two interfaces have methods with the same signature");
      MixedClass2 testClass = new MixedClass2();
      System.out.println(testClass.getInfo());
    }
}
/*
Output:
    Test N2
    Two interfaces have methods with the same signature
    MixedClass2.getInfo() belongs to both interfaces
*/
51
Q

Если класс A наследуется от класса B с методом Х и имплементирет интерфейс который содержит метод X , нужно ли его реализовывать в A?

A

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

52
Q

возможен ли полиморфизм без наследования или интерфейсов

A

да через перегрузку методов