From 5a594f7a7ee54927ba85cd69d8feaf02e715b4fe Mon Sep 17 00:00:00 2001 From: Mark Date: Sun, 12 Jun 2022 14:44:12 +0300 Subject: [PATCH] add questions in 001-oop.md --- 001-oop.md | 170 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) diff --git a/001-oop.md b/001-oop.md index 474c631..f489f3e 100644 --- a/001-oop.md +++ b/001-oop.md @@ -9,6 +9,15 @@ + [Что такое _«полиморфизм»_?](#что-такое-полиморфизм) + [Что такое _«абстракция»_?](#что-такое-абстракция) + [Расскажите про основные понятия ООП: _«класс»_, _«объект»_, _«интерфейс»_.](#расскажите-про-основные-понятия-ооп-класс-объект-интерфейс) ++ [Что такое _поле_/_атрибут_ класса?](#что-такое-поле-класса) ++ [Дайте определение понятию _“конструктор”_](#определение-конструктор) ++ [Чем отличаются _конструкторы по умолчанию_, _копирования_ и _конструктор с параметрами_?](#отличие-типов-конструкторов) ++ [Какие модификации уровня доступа вы знаете, расскажите про каждый из них.](#модификации-уровня-доступа) ++ [О чем говорят ключевые слова _“this”_, _“super”_, где и как их можно использовать?](#this-super) ++ [Дайте определение понятию _“метод”_](#определение-понятию-метод) ++ [Что такое _переопределение_ (_overriding_) методов?](#что-такое-переопределение) ++ [Что такое _сигнатура метода_?](#что-такое-сигнатура-метода) ++ [Какие методы называются _перегруженными_?](#какие-методы-называются-перегруженными) + [В чем заключаются преимущества и недостатки объектно-ориентированного подхода в программировании?](#в-чем-заключаются-преимущества-и-недостатки-объектно-ориентированного-подхода-в-программировании) + [Что подразумевают в плане принципов ООП выражения _«является»_ и _«имеет»_?](#что-подразумевают-в-плане-принципов-ооп-выражения-является-и-имеет) + [В чем разница между _композицией_ и _агрегацией_?](#в-чем-разница-между-композицией-и-агрегацией) @@ -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() {} +} +``` +[к оглавлению](#объектно-ориентированное-программирование) + +## Чем отличаются _конструкторы по умолчанию_, _копирования_ и _конструктор с параметрами_? +_Конструктор по умолчанию_ не принимает никаких параметров.
+_Конструктор копирования_ принимает в качестве параметра объект класса.
+_Конструктор с параметрами_ принимает на вход параметры (обычно необходимые для инициализации полей класса). +```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 (открытый)_ — доступ для всех из любого другого кода проекта + +Модификаторы в списке расположены по возрастающей видимости в программе.
+[к оглавлению](#объектно-ориентированное-программирование) + +## О чем говорят ключевые слова _“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) { } +``` +[к оглавлению](#объектно-ориентированное-программирование) + ## В чем заключаются преимущества и недостатки объектно-ориентированного подхода в программировании? Преимущества: