Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
170 changes: 170 additions & 0 deletions 001-oop.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,15 @@
+ [Что такое _«полиморфизм»_?](#что-такое-полиморфизм)
+ [Что такое _«абстракция»_?](#что-такое-абстракция)
+ [Расскажите про основные понятия ООП: _«класс»_, _«объект»_, _«интерфейс»_.](#расскажите-про-основные-понятия-ооп-класс-объект-интерфейс)
+ [Что такое _поле_/_атрибут_ класса?](#что-такое-поле-класса)
+ [Дайте определение понятию _“конструктор”_](#определение-конструктор)
+ [Чем отличаются _конструкторы по умолчанию_, _копирования_ и _конструктор с параметрами_?](#отличие-типов-конструкторов)
+ [Какие модификации уровня доступа вы знаете, расскажите про каждый из них.](#модификации-уровня-доступа)
+ [О чем говорят ключевые слова _“this”_, _“super”_, где и как их можно использовать?](#this-super)
+ [Дайте определение понятию _“метод”_](#определение-понятию-метод)
+ [Что такое _переопределение_ (_overriding_) методов?](#что-такое-переопределение)
+ [Что такое _сигнатура метода_?](#что-такое-сигнатура-метода)
+ [Какие методы называются _перегруженными_?](#какие-методы-называются-перегруженными)
+ [В чем заключаются преимущества и недостатки объектно-ориентированного подхода в программировании?](#в-чем-заключаются-преимущества-и-недостатки-объектно-ориентированного-подхода-в-программировании)
+ [Что подразумевают в плане принципов ООП выражения _«является»_ и _«имеет»_?](#что-подразумевают-в-плане-принципов-ооп-выражения-является-и-имеет)
+ [В чем разница между _композицией_ и _агрегацией_?](#в-чем-разница-между-композицией-и-агрегацией)
Expand Down Expand Up @@ -342,6 +351,167 @@ __Интерфейс__ – это набор методов класса, дос

[к оглавлению](#объектно-ориентированное-программирование)

## Что такое _поле_/_атрибут_ класса?
_Поле (атрибут)_ класса — это характеристика объекта. Например, для фигуры это может быть название, площадь, периметр.
```java
public class Circle implements Shape {

private String name;
private Double area;
private String perimeter;

}
```
[к оглавлению](#объектно-ориентированное-программирование)

## Дайте определение понятию _“конструктор”_
_Конструктор_ — это специальный метод, который вызывается при создании нового объекта.
_Конструктор_ инициализирует объект непосредственно во время создания.
Имя конструктора совпадает с именем класса, включая регистр, а по синтаксису конструктор похож на метод без возвращаемого значения.
```java
public class Circle implements Shape {

public Circle() {}
}
```
[к оглавлению](#объектно-ориентированное-программирование)

## Чем отличаются _конструкторы по умолчанию_, _копирования_ и _конструктор с параметрами_?
_Конструктор по умолчанию_ не принимает никаких параметров. </br>
_Конструктор копирования_ принимает в качестве параметра объект класса. </br>
_Конструктор с параметрами_ принимает на вход параметры (обычно необходимые для инициализации полей класса).
```java
//конструктор по умолчанию
public Circle() {
}

//конструктор копирования
public Circle(Circle circle) {
this(circle.getName(), circle.getArea(), circle.getPerimeter()); //будет вызван конструктор с параметрами ниже
}

//конструктор с параметрами
public Circle(String name, Double area, String perimeter) {
this.name = name;
this.area = area;
this.perimeter = perimeter;
}
```
[к оглавлению](#объектно-ориентированное-программирование)

## Какие модификации уровня доступа вы знаете, расскажите про каждый из них.
* _private (закрытый)_ — доступ к члену класса не предоставляется никому, кроме методов этого класса. Другие классы того же пакета также не могут обращаться к _private_-членам.
* _default, package, friendly_ - доступ по умолчанию, когда никакой модификатор не присутствует — член класса считается открытым внутри своего собственного пакета, но не доступен для кода, расположенного вне этого пакета. Т.е. если p```package2.Class2 extends package1.MainClass```, то в ```Class2``` методы без идентификатора из ```MainClass``` видны не будут.
* _protected (защищённый)_ — доступ в пределах пакета и классов наследников. Доступ в классе из другого пакета будет к методам _public_ и _protected_ главного класса. Т.е. если ```package2.Class2 extends package1.MainClass```, то внутри ```package2.Class2``` методы с идентификатором protected из ```MainClass``` будут видны.
* _public (открытый)_ — доступ для всех из любого другого кода проекта

Модификаторы в списке расположены по возрастающей видимости в программе.</br>
[к оглавлению](#объектно-ориентированное-программирование)

## О чем говорят ключевые слова _“this”_, _“super”_, где и как их можно использовать?
_super_ — используется для обращения к базовому классу, а _this_ к текущему. Пример:
```java
public class Animal {

public void eat() {
System.out.println("animal eat");
}
}

public class Dog extends Animal {

public void eat() {
System.out.println("Dog eat");
}
public void thisEat() {
System.out.println("Call Dog.eat()");
this.eat();
}

public void superEat() {
System.out.println("Call Animal.eat()");
super.eat();
}

}

public class Test {

public static void main(String[] args) {
Dog dog = new Dog();
dog.eat();
dog.thisEat();
dog.superEat();
}
}
Dog eat
Call Dog.eat()
Dog eat
Call Animal.eat()
animal eat
```
Если написать _super()_, то будет вызван конструктор базового класса, а если _this()_, то конструктор текущего класса. Это можно использовать, например, при вызове конструктора с параметрами:
```java
public Dog() {
System.out.println("Call empty constructor");
}

public Dog(String name) {
System.out.println("Call constructor with Name");
this.name = name;

}

public Dog(String name, Double weight) {
this(name);
this.weight = weight;
System.out.println("Call constructor with Name and Weight");
}
}
..
public static void main(String[] args) {
Dog dog1 = new Dog("name", 25.0);
}
//Вывод
Call constructor with Name
Call constructor with Name and Weight
```
[к оглавлению](#объектно-ориентированное-программирование)

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

[к оглавлению](#объектно-ориентированное-программирование)

## Что такое _переопределение_ (_overriding_) методов?
_Переопределение_ методов происходит, когда `child` хочет изменить поведение `parent` класса. Если нужно, чтоб выполнилось-таки то, что есть в методе `parent`, можно использовать в `child` конструкцию вида `super.methodName()`, что выполнит работу `parent` метода, а уже потом добавить логику.

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

[к оглавлению](#объектно-ориентированное-программирование)

## Что такое _сигнатура метода_?
_Сигнатура метода_ — это набор из названия метода и аргументов, какие принимает метод. В _сигнатуру_ метода не входит возвращаемое значение, бросаемые им исключения, а также модификаторы.
```java
public Object getByName(String name) {} // сигнатура - getByName(String name)
```
_Сигнатура метода_ является уникальным идентификатором для метода при перегрузке методов.

[к оглавлению](#объектно-ориентированное-программирование)

## Какие методы называются _перегруженными_?
Java позволяет создавать несколько методов с одинаковыми именами, но разными параметрами. Создание метода с тем же именем, но с другим набором параметров называется _перегрузкой_. Какой из _перегруженных методов_ должен выполняться при вызове, Java определяет на основе фактических параметров.
```java
public void method() { }

public void method(int a) { }

public void method(String str) { }
```
[к оглавлению](#объектно-ориентированное-программирование)

## В чем заключаются преимущества и недостатки объектно-ориентированного подхода в программировании?
Преимущества:

Expand Down