Successfully reported this slideshow.
Your SlideShare is downloading. ×

Урок 9. ООП в языке Java

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 156 Ad

Урок 9. ООП в языке Java

Download to read offline

ООП в языке Java.
Лекции, задания, видео, тесты и вопросы на:
https://www.examclouds.com/ru/java/java-core-russian/lesson7
Подписывайтесь на страницу:
https://www.facebook.com/Examclouds
Подписывайтесь на канал
https://www.youtube.com/c/tatyanamilkina

ООП в языке Java.
Лекции, задания, видео, тесты и вопросы на:
https://www.examclouds.com/ru/java/java-core-russian/lesson7
Подписывайтесь на страницу:
https://www.facebook.com/Examclouds
Подписывайтесь на канал
https://www.youtube.com/c/tatyanamilkina

Advertisement
Advertisement

More Related Content

Slideshows for you (16)

Similar to Урок 9. ООП в языке Java (20)

Advertisement

Recently uploaded (15)

Урок 9. ООП в языке Java

  1. 1. Урок 9 ООП в языке Java 1. Две методики программирования. 2. Модель и принципы ООП. 3. Классы и объекты. 4. Методы и конструкторы. 5. Ключевое слово this. 6. Перегрузка методов и конструкторов. 7. Stack и Heap 8. Применение объектов в качестве параметров. 9. Аргументы переменной длины. 10. Рекурсия. www.examclouds.com
  2. 2. 11. Сборка "мусора". 12. Наследование. 13. Ключевое слово super. 14. Управление доступом. 15. Уровни доступа для класса. 16. Концепции JavaBeans. 17. Переопределение методов. 18. Абстрактные классы и методы. 19. Ключевое слово final. www.examclouds.com
  3. 3. Две методики программирования ⚫Процедурное программирование. Инструкции для решения задачи выполняются одна за другой, сверху вниз, иногда возникают изменения в их последовательности. ⚫ООП (Объектно-ориентированное программирование). Парадигма программирования, в которой основными концепциями являются понятия объектов и классов. www.examclouds.com
  4. 4. Три принципа ООП ⚫ Инкапсуляция — это свойство системы, позволяющее объединить данные и методы в классе, и скрыть детали реализации от пользователя. ⚫ Наследование — это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником или производным классом. ⚫ Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. “Один интерфейс, множество методов”. www.examclouds.com
  5. 5. Абстракция Абстрагирование — это способ выделить набор значимых характеристик объекта, исключая из рассмотрения не значимые. Соответственно, абстракция — это набор всех таких характеристик. www.examclouds.com
  6. 6. Классы и объекты 1. Класс - это шаблон для создания объекта, а объект - это экземпляр класса. 2. Класс определяет структуру и поведение, которые будут совместно использоваться набором объектов. 3. Класс содержит переменные и методы, которые называются элементами класса, членами класса. 4. Класс составляет основу инкапсуляции в Java. 5. Каждый объект данного класса содержит структуру и поведение, которые определены классом. 6. Иногда объекты называют экземплярами класса. www.examclouds.com
  7. 7. Классы и объекты www.examclouds.com
  8. 8. 2… Производитель СPU Количество ядер Модель процессора Чипсет Тип ОЗУ Частота ОЗУ Объем ОЗУ Class Компьютер … Производитель СPU Intel Количество ядер 2 шт. Модель процессора Intel Core i3-3220, 3,3 ГГц Тип ОЗУ DDR-3 Частота ОЗУ 1333 МГц Объем ОЗУ 4 Гб Объект Fujitsu Esprimo P400 MT Acer Aspire M1935 www.examclouds.com
  9. 9. Упрощенная общая форма определения класса class ИмяКласса{ тип переменнаяЭкземпляра1; тип переменнаяЭкземпляра2; / / ... тип переменнаяЭкземпляраN; тип имяМетода 1 ( список параметров) { // тело метода } тип имяМетода2 (список параметров) { // тело метода } … тип имяМетодаN (список параметров ) { // тело метода } } www.examclouds.com
  10. 10. Простой класс ⚫Класс определяет новый тип данных. public class Box1 { double width; double height; double depth; } www.examclouds.com
  11. 11. Задание 1 ⚫Создайте класс Phone, который содержит переменные number, model и weight. www.examclouds.com
  12. 12. Ключевые моменты 1. Объявление класса создает только шаблон, но не конкретный объект. 2. Чтобы создать объект класса Вох1, нужно воспользоваться оператором наподобие следующего: Вох1 myBox = new Вох1(); 3. При создании экземпляра класса, создается объект, который содержит собственную копию каждой переменной экземпляра, определенной в данном классе. www.examclouds.com
  13. 13. Объявление объектов Создание объектов класса представляет собой двухэтапный процесс: 1. Объявление переменной типа класса. Эта переменная не определяет объект. Она является лишь переменной, которая может ссылаться на объект. Вох myBox; 2. Создание объекта. С помощью оператора new динамически (т.е. во время выполнения) резервируется память для объекта и возвращается ссылку на него. myBox = new Вох() ; www.examclouds.com
  14. 14. Вох mуBох; mуBох =new Вох(); null Heap Вох mуBох; mуBох = new Вох(); double width; double height; double depth; Bох www.examclouds.com
  15. 15. Объявление объекта типа Вох1 public class BoxDemo1 { public static void main(String[] args) { Box1 myBox = new Box1(); // присвоить значение переменным экземпляра mybox myBox.width = 10; myBox.height = 20; myBox.depth = 15; // рассчитать объем параллелепипеда double volume = myBox.width * myBox.height * myBox.depth; System.out.println("Oбъeм равен " + volume); } } www.examclouds.com
  16. 16. Объявление двух объектов класса Вох1 ⚫ Изменения в переменных экземпляра одного объекта не влияют на переменные экземпляра другого. public class BoxDemo7 { public static void main(String[] args) { Box1 myBox1 = new Box1(); Box1 myBox2 = new Box1(); double volume; // присвоить значения переменным экземпляра myBox1 myBox1.width = 10; myBox1.height = 20; myBox1.depth = 15; //присвоить другие значения переменным экземпляра myBox2 myBox2.width = 3; myBox2.height = 6; myBox2.depth = 9; // рассчитать объем первого параллелепипеда volume = myBox1.width * myBox1.height * myBox1.depth; System.out.println("Oбъeм равен " + volume); // рассчитать объем второго параллелепипеда volume = myBox2.width * myBox2.height * myBox2.depth; System.out.println(" Oбъeм равен " + volume); } } www.examclouds.com
  17. 17. Задание 2 ⚫Создайте три экземпляра класса Phone. ⚫Выведите на консоль значения их переменных. www.examclouds.com
  18. 18. Присваивание переменным ссылок на объекты Вoх b1 = new Вох(); Вoх b2 = b1; b2 double width;3 double height;10 double depth;20 Heap Bох b1 Stack www.examclouds.com
  19. 19. Присваивание переменным ссылок на объекты public class BoxDemo6 { public static void main(String[] args) { Box1 b1 = new Box1(); Box1 b2 = b1; b1.width = 10; b1.height = 20; b1.depth = 15; b2.width = 3; System.out.println("Width: " + b1.width); System.out.println("Width: " + b2.width); } } www.examclouds.com
  20. 20. Добавляем метод в класс public class Box1 { double width; double height; double depth; /** * Подсчитать объем коробки * * @return Объем */ double getVolume() { return width * height * depth; } } www.examclouds.com
  21. 21. Добавляем метод в класс public class BoxDemo5 { public static void main(String[] args) { Box1 myBox1 = new Box1(); Box1 myBox2 = new Box1(); myBox1.width = 10; myBox1.height = 20; myBox1.depth = 15; myBox2.width = 1; myBox2.height = 5; myBox2.depth = 5; System.out.println("Объем: " + myBox1.getVolume()); System.out.println("Объем: " + myBox2.getVolume()); } } www.examclouds.com
  22. 22. Добавление метода с параметрами public class Box1 { double width; double height; double depth; … /** * Установить размер коробки * * @param w - ширина * @param h - высота * @param d - глубина */ void setDim(double w, double h, double d) { width = w; height = h; depth = d; } } www.examclouds.com
  23. 23. Добавление метода с параметрами public class BoxDemo2 { public static void main(String[] args) { Box1 myBox1 = new Box1(); Box1 myBox2 = new Box1(); myBox1.setDim(10, 20, 15); myBox1.setDim(1, 5, 5); System.out.println("Объем: " + myBox1.getVolume()); System.out.println("Объем: " + myBox2.getVolume()); } www.examclouds.com
  24. 24. Задание 3 ⚫Добавить в класс Phone методы: ❖receiveCall, имеет один параметр – имя звонящего. Выводит на консоль сообщение “Звонит {name}”. ❖getNumber – возвращает номер телефона. Вызвать эти методы для каждого из объектов. www.examclouds.com
  25. 25. Конструкторы 1. Конструктор инициализирует объект непосредственно во время его создания. 2. Конструктор вызывается с помощью оператора new. Box myBox = new Box(); www.examclouds.com
  26. 26. Добавляем конструктор в класс public class Box2 { double width; double height; double depth; Box2() { System.out.println("Конструирование объекта Вох2"); width = 10; height = 10; depth = 10; } /** * Подсчитать объем коробки * * @return объем */ double getVolume() { return width * height * depth; } } www.examclouds.com
  27. 27. Добавляем конструктор в класс public class BoxDemo3 { public static void main(String[] args) { Box2 myBox1 = new Box2(); Box2 myBox2 = new Box2(); System.out.println("Объем: " + myBox1.getVolume()); System.out.println("Объем: " + myBox2.getVolume()); } } www.examclouds.com
  28. 28. Конструкторы 1. Его имя совпадает с именем класса, в котором он находится, а синтаксис аналогичен синтаксису метода. 2. Конструкторы не имеют возвращаемого типа. Это объясняется тем, что неявно заданным возвращаемым типом конструктора класса является тип самого класса. www.examclouds.com
  29. 29. Конструктор по умолчанию 1. Если конструктор класса не определен явно, то в Java для класса создается конструктор по умолчанию. 2. Конструктор по умолчанию инициализирует все переменные экземпляра устанавливаемыми по умолчанию значениями. 3. Как только в классе будет определен собственный конструктор, конструктор по умолчанию больше не используется. www.examclouds.com
  30. 30. Конструктор по умолчанию public class Box2 { double width; double height; double depth; Box2() {} … } www.examclouds.com
  31. 31. Параметризированные конструкторы public class Box3 { double width; double height; double depth; /** * Конструктор класса Box3 * * @param w - щирина * @param h - высота * @param d - глубина */ Box3(double w, double h, double d) { width = w; height = h; depth = d; } … } www.examclouds.com
  32. 32. Параметризированные конструкторы public class BoxDemo4 { public static void main(String[] args) { Box3 myBox1 = new Box3(10, 20, 15); Box3 myBox2 = new Box3(3, 6, 9); //Не можем использовать конструктор по умолчанию //Box3 myBox3 = new Box3(); System.out.println("Объем: " + myBox1.getVolume()); System.out.println("Объем: " + myBox2.getVolume()); www.examclouds.com
  33. 33. Задание 4 ⚫Добавить конструктор в класс Phone, который принимает на вход три параметра для инициализации переменных класса - number, model и weight. ⚫Добавить конструктор, который принимает на вход два параметра для инициализации переменных класса - number, model. ⚫Добавить конструктор без параметров. www.examclouds.com
  34. 34. Конструкторы ⚫Код конструктора должен заниматься только инициализацией объекта. ⚫Следует избегать вызовов из конструктора других методов, за исключением final. Метод может быть переопределен в подклассе и исказить процесс инициализации объекта. www.examclouds.com
  35. 35. Ключевое слово this ⚫Иногда требуется, чтобы метод ссылался на вызвавший его объект. ⚫Ключевое слово this используется в теле любого метода для ссылки на текущий объект. www.examclouds.com
  36. 36. Применение ключевого слова this ⚫ В этом коде разрешаются конфликты в пространстве имен: Box4(double width, double height, double depth) { this.width = width; this.height = height; this.depth = depth; } ⚫ Избыточное применение ключевого слова this: Box4(double w, double h, double d) { this.width = w; this.height = h; this.depth = d; } www.examclouds.com
  37. 37. Использование this() в конструкторе ⚫С помощью this() можно вызвать один конструктор из другого. ⚫Вызов this() может находиться только в первой строчке конструктора. www.examclouds.com
  38. 38. Использование this() в конструкторе public class Toy { String name; int cost; String manufacturer; int age; public Toy(String name, int cost, String manufacturer, int age) { this(name, cost, manufacturer); this.age = age; System.out.println("В конструкторе с четырьмя параметрами"); } public Toy(String name, int cost, String manufacturer) { this(); this.name = name; this.cost = cost; this.manufacturer = manufacturer; System.out.println("В конструкторе с тремя параметрами"); } public Toy() { System.out.println("В конструкторе по умолчанию"); } } www.examclouds.com
  39. 39. Использование this() в конструкторе public class ToyDemo { public static void main(String[] args) { Toy toy = new Toy("Кукла", 34, "Disney", 3); } } www.examclouds.com
  40. 40. Задание 5 ⚫Вызвать из конструктора с тремя параметрами конструктор с двумя (класс Phone). www.examclouds.com
  41. 41. Перегрузка методов ⚫ В Java разрешается в одном и том же классе определять два или более метода с одним именем, если только объявления их параметров отличаются. public class Overloading1 { void test(int a) { System.out.println("a: " + a); } void test(int a, int b) { System.out.println("a и b: " + a + " " + b); } public static void main(String[] args) { Overloading1 ob = new Overloading1(); ob.test(10); ob.test(10, 20); } } ⚫ При вызове перегружаемого метода для определения нужного его варианта в Java используется тип и/или количество аргументов метода. www.examclouds.com
  42. 42. Перегрузка методов ⚫Перегрузка методов является одним из способов поддержки полиморфизма в Java. www.examclouds.com
  43. 43. Перегрузка методов public class Overloading2 { void test() { System.out.println("Без параметров"); } //неправильная перегрузка методов /* int test() { System.out.println("Без параметров"); return 1; }*/ double test(double a) { System.out.println("double a: " + a); return a * a; } public static void main(String[] args) { Overloading2 ob = new Overloading2(); ob.test(); double result = ob.test(123.25); System.out.println("Результат вызова метода ob.test(123.25): " + result); } } Возвращаемые типы перегружаемых методов могут отличаться, но самого возвращаемого типа недостаточно для того, чтобы отличать два разных варианта метода. www.examclouds.com
  44. 44. Задание ⚫Добавьте в класс Phone перегруженный метод receiveCall, который принимает два параметра - имя звонящего и номер телефона звонящего. ⚫Вызвать этот метод. www.examclouds.com
  45. 45. Перегрузка конструкторов /** * В этом примере класс Вох определяет три конструктора для инициализации * размеров коробки различными способами. */ public class Box6 { double width; double height; double depth; Box6(double w, double h, double d) { width = w; height = h; depth = d; } Box6() { width = -1; // используем -1 для height = -1; // обозначения непроинициализированной depth = -1; // коробки } Box6(double len) { width = len; height = len; depth = len; } double getVolume() { return width * height * depth; } } www.examclouds.com
  46. 46. Перегрузка конструкторов public class OverloadCons { public static void main(String[] args) { Box6 myBox1 = new Box6(10, 20, 15); Box6 myBox2 = new Box6(); Box6 myBox3 = new Box6(7); System.out.println("Объем myBox1: " + myBox1.getVolume()); System.out.println("Объем myBox2: " + myBox2.getVolume()); System.out.println("Объем myBox3: " + myBox3.getVolume()); } } www.examclouds.com
  47. 47. Heap память ⚫Java Heap (куча) используется Java Runtime для выделения памяти под объекты и JRE классы. ⚫Создание нового объекта также происходит в куче. ⚫Здесь работает сборщик мусора: освобождает память путем удаления объектов, на которые нет каких-либо ссылок. ⚫Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться с любой части приложения. www.examclouds.com
  48. 48. Stack память ⚫ Стековая память в Java работает по схеме LIFO (Последний- зашел-Первый-вышел). ⚫ Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе. ⚫ Как только метод заканчивает работу, блок также перестает использоваться, тем самым предоставляя доступ для следующего метода. ⚫ Размер стековой памяти намного меньше объема памяти в куче. ⚫ Всякий раз, когда создается объект, он всегда хранится в куче, а в памяти стека содержится ссылка на него. Память стека содержит только локальные переменные примитивных типов и ссылки на объекты в куче. www.examclouds.com
  49. 49. www.examclouds.com
  50. 50. Изменение объектов и примитивных типов в методе public class TestDemo { static void changeObject(Box6 o) { o.width *= 2; o.height /= 2; o.depth += 2; } static void changePrimitives(int a, int b) { a *= 2; b /= 2; } public static void main(String[] args) { Box6 box = new Box6(5, 6, 7); int x = 10; int y = 10; System.out.println("x и y перед вызовом: " + x + " " + y); changePrimitives(x, y); System.out.println("x и y после вызова: " + x + " " + y); System.out.println("box перед вызовом: " + box.width + " " + box.height + " " + box.dept changeObject(box); System.out.println("box после вызова: " + box.width + " " + box.height + " " + box.depth } } ⚫ Объекты допускается передавать методам в качестве параметров. ⚫ Объекты передаются по ссылке на них. www.examclouds.com
  51. 51. Возврат объектов public class ReturnObject { int a; ReturnObject(int i) { a = i; } ReturnObject incrementByTen() { ReturnObject temp = new ReturnObject(a + 10); return temp; } public static void main(String[] args) { ReturnObject ob1 = new ReturnObject(2); ReturnObject ob2 = ob1.incrementByTen(); System.out.println("ob1.a: " + ob1.a); System.out.println("ob2.a: " + ob2.a); } } www.examclouds.com
  52. 52. Методы с аргументами переменной длины ⚫ Метод, который принимает переменное количество аргументов, называется методом с аргументами переменной длины (var-args). ⚫ Для указания аргументов переменной длины служат три точки ( . . . ). Например: static void test(int... array) www.examclouds.com
  53. 53. Методы с аргументы переменной длины ⚫ Наряду с параметром переменной длины у метода могут быть и "обычные" параметры. Но параметр переменной длины должен быть последним среди всех параметров, объявляемых в методе. Например: static void test(double d, int... array) ⚫ Метод должен содержать только один параметр с переменным количеством аргументов. www.examclouds.com
  54. 54. Применение аргументов переменной длины public class VarArgs { static void test(int... array) { System.out.println("Количество аргументов: " + array.length); for (int a : array) { System.out.print(a + " "); } System.out.println(); } public static void main(String[] args) { test(); test(1); test(1, 2); test(new int[]{1, 3}); } } www.examclouds.com
  55. 55. Перегрузка методов с аргументами переменной длины public class VarArgs2 { static void test(double... array) { System.out.println("test(double... array)"); System.out.println("Количество аргументов: " + array.length); for (double a : array) { System.out.print(a + " "); } System.out.println(); } static void test(int... array) { System.out.println("test(int... array)"); System.out.println("Количество аргументов: " + array.length); for (int a : array) { System.out.print(a + " "); } System.out.println(); } static void test(int a) { System.out.println("test(int a)"); } public static void main(String[] args) { test(); test(3); test(1.0); test(1, 2); } } www.examclouds.com
  56. 56. Аргументы переменной длины и неоднозначность ⚫При перегрузке метода, принимающего аргументы переменной длины, могут происходить непредвиденные ошибки. Они связаны с неоднозначностью, которая может возникать при вызове перегружаемого метода с аргументами переменной длины. public class VarArgs3 { … } www.examclouds.com
  57. 57. Задание ⚫Создать метод sendMessage в классе Phone с аргументами переменной длины. ⚫Данный метод принимает на вход номера телефонов, которым будет отправлено сообщение. ⚫Метод выводит на консоль номера этих телефонов. www.examclouds.com
  58. 58. Рекурсия ⚫В Java рекурсия - это средство, которое позволяет методу вызывать самого себя. Такой метод называется рекурсивным. ⚫Когда рекурсивный метод вызывает самого себя, новым локальным переменным и параметрам выделяется место в стеке и код метода выполняется с этими новыми исходными значениями. ⚫При каждом возврате из вызова рекурсивного метода прежние локальные переменные и параметры удаляются из стека, а выполнение продолжается с точки вызова в самом методе. www.examclouds.com
  59. 59. Пример рекурсии public class Recursion { static int factorial(int n) { int result; if (n < 2) { return 1; } result = factorial(n - 1) * n; return result; } public static void main(String[] args) { System.out.println("Факториал 3: " + factorial(3)); System.out.println("Факториал 4: " + factorial(4)); System.out.println("Факториал 5: " + factorial(5)); } } www.examclouds.com
  60. 60. Сборка мусора ⚫Освобождение памяти выполняется автоматически. ⚫Используемая для выполнения этой задачи технология называется сборкой мусора. ⚫Процесс проходит следующим образом: при отсутствии каких либо ссылок на объект программа заключает, что этот объект больше не нужен, и занимаемую объектом память можно освободить. www.examclouds.com
  61. 61. System.gc() ⚫Есть возможность запросить сборку мусора самим, для чего используется метод System.gc(). ⚫НО - JVM сама решит выполнять ли ваш запрос! www.examclouds.com
  62. 62. Пример с System.gc() public class Spoon { } public class Cup { Spoon spoon; Cup(Spoon spoon) { this.spoon = spoon; } public static void main(String[] args) { Cup cup = new Cup(new Spoon()); cup = null; System.gc(); } } www.examclouds.com
  63. 63. Пример наследования www.examclouds.com
  64. 64. Наследование 1. Используя наследование, можно создать класс, который определяет характеристики, общие для набора связанных элементов. 2. Затем этот общий класс может наследоваться другими, более специализированными классами, каждый из которых будет добавлять свои особые характеристики. 3. В терминологии Jаvа наследуемый класс называется суперклассом, а наследующий класс – подклассом. 4. Подкласс наследует все члены, определенные в суперклассе, добавляя к ним собственные, особые элементы. www.examclouds.com
  65. 65. Пример наследования public class ColorBox extends Box6 { String color; public ColorBox(int width, int height, int depth, String color) { this.width = width; this.height = height; this.depth = depth; this.color = color; } public ColorBox() { } } www.examclouds.com
  66. 66. Пример наследования public class HeavyBox extends Box6 { int weight; public HeavyBox() { } public HeavyBox(int width, int height, int depth, int weight) { this.width = width; this.height = height; this.depth = depth; this.weight = weight; } } www.examclouds.com
  67. 67. Пример наследования public class DifferentBoxDemo1 { public static void main(String[] args) { Box6 box = new Box6(15, 10, 25); HeavyBox heavyBox = new HeavyBox(15, 10, 20, 5); ColorBox colorBox = new ColorBox(25, 12, 20, "красный"); System.out.println("Объём коробки: " + box.getVolume()); System.out.println("Объём коробки: " + heavyBox.getVolume() + " Вес коробки: " + heavyBox.weight); System.out.println("Объём коробки: " + colorBox.getVolume() + " Цвет коробки: " + colorBox.color); } } www.examclouds.com
  68. 68. Ключевые моменты 1. Общая форма объявления класса, который наследуется от суперкласса: class ИмяПодкласса extends ИмяСуперКласса { // тело класса } 2. Для каждого создаваемого подкласса можно указать только один суперкласс. 3. Класс не может стать суперклассом для самого себя. 4. Набор классов, связанных отношением наследования, называют иерархией. www.examclouds.com
  69. 69. Задание ⚫Создайте пример наследования, реализуйте класс Student и класс Aspirant, аспирант отличается от студента наличием некой научной работы. ⚫Класс Student содержит переменные: ⚫String firstName, lastName, group; ⚫double averageMark - содержащую среднюю оценку. www.examclouds.com
  70. 70. Переменная суперкласса может ссылаться на объект подкласса ⚫Ссылочной переменной суперкласса может быть присвоена ссылка на любой подкласс: Box heavyBox = new HeavyBox(15, 10, 20, 5); Box colorBox = new ColorBox(25, 12, 20, "красный"); ⚫Обратное не верно! Нельзя написать так: HeavyBox heavyBox = new Box(15, 10, 20); www.examclouds.com
  71. 71. Переменная суперкласса может ссылаться на объект подкласса Доступные члены класса определяются типом ссылочной переменной, а не типом объекта, на который она ссылается. public class DifferentBoxDemo2 { public static void main(String[] args) { Box6 box = new Box6(15, 10, 25); Box6 heavyBox = new HeavyBox(15, 10, 20, 5); Box6 redBox = new ColorBox(25, 12, 20, "красный"); ColorBox blueBox = new ColorBox(25, 12, 20, "голубой"); System.out.println("Ширина коробки: " + box.width); System.out.println("Ширина тяжелой коробки: " + heavyBox.width); System.out.println("Ширина красной коробки: " + redBox.width); System.out.println("Ширина голубой коробки: " + blueBox.width); System.out.println("Цвет голубой коробки: " + blueBox.color); //System.out.println("Цвет красной коробки: " + redBox.color); //System.out.println("Вес тяжелой коробки: " + heavyBox.weight); } } www.examclouds.com
  72. 72. Задание ⚫Создать переменную типа Student, которая ссылается на объект типа Aspirant. www.examclouds.com
  73. 73. Создание многоуровневой иерархии Можно строить иерархии, состоящие из любого количества уровней наследования. www.examclouds.com
  74. 74. Пример многоуровневой иерархии public class Shipment extends HeavyBox1 { public double cost; public Shipment(int width, int height, int depth, int weight, double cost) { super(width, height, depth, weight); this.cost = cost; } public Shipment(double cost) { this.cost = cost; } } public class DemoShipment { public static void main(String[] args) { Shipment shipment = new Shipment(2, 3, 4, 5, 5.3); System.out.println(shipment.cost); System.out.println(shipment.depth); System.out.println(shipment.height); System.out.println(shipment.weight); System.out.println(shipment.width); } } www.examclouds.com
  75. 75. Порядок вызова конструкторов public class E { public E() { System.out.println("В конструкторе E"); } } public class F extends E { public F() { System.out.println("В конструкторе F"); } } public class G extends F { public G() { System.out.println("В конструкторе G"); } } public class CallingConstructors { public static void main(String[] args) { G g = new G(); } } В иерархии классов конструкторы выполняются в порядке наследования, начиная с суперкласса и кончая подклассом. Результат выполнения кода: В конструкторе E В конструкторе F В конструкторе G www.examclouds.com
  76. 76. Ключевое слово super Ключевое слово super используется когда подклассу требуется сослаться на его непосредственный суперкласс. www.examclouds.com
  77. 77. Ключевое слово super У ключевого слова super имеются две общие формы: 1. Для вызова конструктора суперкласса: super(списокАргументов); 2. Для обращения к члену суперкласса, скрываемому членом подкласса: suреr.member; www.examclouds.com
  78. 78. Вызов конструкторов суперкласса с помощью ключевого слова super • Когда метод super() вызывается из подкласса, вызывается конструктор его непосредственного суперкласса. Это справедливо даже для многоуровневой иерархии. • Вызов метода super() должен быть всегда в первом операторе, выполняемом в теле конструктора подкласса. • Если в иерархии классов требуется передать параметры конструктору суперкласса, то все подклассы должны передавать эти параметры вверх по иерархии. www.examclouds.com
  79. 79. Вызов конструкторов суперкласса с помощью ключевого слова super public class HeavyBox1 extends Box6 { public int weight; public HeavyBox1(int width, int height, int depth, int weight) { super(width, height, depth); this.weight = weight; } public HeavyBox1() { this.weight = -1; } } www.examclouds.com
  80. 80. Вызов конструкторов суперкласса с помощью ключевого слова super ⚫ Если в конструкторе наследника нет явного вызова super(), как например во втором конструкторе класса HeavyBox1, JVM сама его подставляет первой строкой: public HeavyBox1() { super(); this.weight = -1; } Из этого следует, что суперкласс должен иметь конструктор без параметров, иначе возникнет ошибка компиляции. www.examclouds.com
  81. 81. Обращения к члену суперкласса с помощью ключевого слова super public class C { public int i; public void print() { System.out.println("C.i = " + i); } } public class D extends C { public String i; public D(String a, int b) { i = a; super.i = b; } public void print() { System.out.println("D.i = " + i); super.print(); } } public class UseSuper { public static void main(String[] args) { D d = new D("someString", 2); d.print(); System.out.println(d.i); } } www.examclouds.com
  82. 82. Задание ⚫Вызвать конструктор класса Student из класса Aspirant для инициализации его переменных. www.examclouds.com
  83. 83. Уровни доступа ⚫public (открытый), ⚫private (закрытый), ⚫protected (защищенный) - применяется только при наследовании, ⚫уровень доступа, предоставляемый по умолчанию. www.examclouds.com
  84. 84. Уровни доступа 1. Когда член объявляется с модификатором доступа public, он становится доступным из любого другого кода. 2. Когда член класса объявляется с модификатором доступа private, он доступен только другим членам этого же класса. 3. В отсутствие модификатора доступа по умолчанию член класса считается открытым в своем пакете, но недоступным для кода, находящегося за пределами этого пакета. www.examclouds.com
  85. 85. Отличие модификаторов package oop; public class ModificatorsDemo1 { public static void main(String[] args) { Modificators object = new Modificators(); object.defaultVar = 10; object.publicVar = 20; //object.privateVar = 100; // Ошибка компиляции! } } package oop; public class Modificators { public int publicVar; // открытый уровень доступа private int privateVar; // закрытый уровень доступа int defaultVar; // уровень доступа по умолчанию public String toString() { return "Modificators{" + "publicVar=" + publicVar + ", privateVar=" + privateVar + ", defaultVar=" + defaultVar + '}'; } } package oop.p2; import oop.Modificators; public class ModificatorsDemo2 { public static void main(String[] args) { Modificators object = new Modificators(); // Ошибка компиляции! //object.defaultVar = 10; object.publicVar = 20; // Ошибка компиляции! //object.privateVar = 100; } } www.examclouds.com
  86. 86. Доступ по умолчанию vs protected ⚫Доступ по умолчанию раскрывает область видимости только для классов определенных в том же пакете. ⚫Protected модификатор раскрывает область видимости для классов определенных в том же пакете или для классов-наследников. www.examclouds.com
  87. 87. Доступ по умолчанию vs protected Определяем класс наследник в другом пакете Нет доступа к default членам класса Parent Есть доступ к protected членам класса Parent package oop.p1; public class Parent { public void publicAccessMethod() { } void defaultAccessMethod() { } protected void protectedAccessMethod() { } } package oop.p2; import oop.p1.Parent; public class Child extends Parent { public void someMethod() { publicAccessMethod(); //defaultAccessMethod(); protectedAccessMethod(); } } www.examclouds.com
  88. 88. Доступ по умолчанию vs protected package oop.p2; import oop.p1.Parent; public class AccessClass { public static void main(String[] args) { Parent parent = new Parent(); parent.publicAccessMethod(); // parent.defaultAccessMethod(); // parent.protectedAccessMethod(); } } package oop.p1; public class AccessClass { public static void main(String[] args) { Parent parent = new Parent(); parent.publicAccessMethod(); parent.defaultAccessMethod(); parent.protectedAccessMethod(); } } www.examclouds.com
  89. 89. Управление доступом к разным членам класса ⚫Способ доступа к члену класса определяется модификатором доступа, присутствующим в его объявлении. ⚫Модификатор доступа предшествует остальной спецификации типа члена. Это означает, что оператор объявления члена должен начинаться с модификатора доступа, например: public int i; private double j; private static int myMethod (int а , char b ) { / / . . . www.examclouds.com
  90. 90. Уровни доступа для класса ⚫Для класса, не являющегося вложенным, может быть указан только один из двух возможных уровней доступа: ❖по умолчанию - если у класса имеется уровень доступа по умолчанию, такой класс оказывается доступным только для кода из данного пакета. ❖открытый (public) - если класс объявлен как public, он доступен из любого другого кода. www.examclouds.com
  91. 91. Что значит иметь доступ к классу? ⚫Когда мы говорим, что код из одного класса (class A) имеет доступ к коду из другого класса (class B), это означает что класс A может делать одну из трех вещей: ❖создать экземпляр класса B. ❖наследовать класс B. ❖иметь доступ к определенным членам класса B. www.examclouds.com
  92. 92. Попытка наследовать класс к которому нет доступа package oop.p1; class HotBeverage { } package oop.p2; //import oop.p1.HotBeverage; public class Tea //extends HotBeverage { } www.examclouds.com
  93. 93. Содержимое файла Beverage.java Если класс оказывается открытым, он должен быть единственным открытым классом, объявленным в файле, а имя этого файла должно совпадать с именем класса. package oop.p1; public class Beverage { } class HotBeverage { } www.examclouds.com
  94. 94. Принцип инкапсуляции ⚫Ограничение уровня доступа к членам класса - это еще один механизм реализации принципа инкапсуляции. www.examclouds.com
  95. 95. getter и setter методы 1. Если переменная имеет уровень доступа private, к ней невозможно обратиться извне класса, в котором она объявлена. 2. Это достигается с помощью объявления специальных public методов. 3. Методы, которые возвращают значение свойств, называются getter методы. 4. Методы, которые изменяют значение свойств, называются setter методы. www.examclouds.com
  96. 96. getter методы private int age; private boolean retired; public int getAge() { return age; } public boolean isRetired() { return retired; } www.examclouds.com
  97. 97. Setter методы private int age; public void setAge(int age) { this.age = age; } www.examclouds.com
  98. 98. Правила написания getter и setter методов 1. Если свойство НЕ типа boolean, префикс getter метода должно быть get. Например: getName() это корректное имя getter метода для переменной name. 2. Если свойство типа boolean, префикс имени getter метода может быть get или is. Например, getPrinted() или isPrinted() оба являются корректными именами для JavaBeans свойства типа boolean. 3. Имя setter метода должно начинаться с префикса set. Например, setName() корректное имя для переменной name. www.examclouds.com
  99. 99. Правила написания getter и setter методов 4. Для создания имени getter или setter метода, первая буква свойства должна быть изменена на большую и прибавлена к соответствующему префиксу (set, get или is). 5. Setter метод должен быть public, возвращать void тип и иметь параметр соответствующий типу свойства. Например: public void setAge(int age) { this.age = age; } 6. Getter метод должен быть public, не иметь параметров метода, и возвращать значение соответствующее типу свойства. Например: public int getAge() { return age; } www.examclouds.com
  100. 100. Пример использования getter и setter методов public class Person { private String fullName; private int age; private boolean retired; public Person() { } public Person(String fullName, int age, boolean retired) { this.fullName = fullName; this.age = age; this.retired = retired; } public String getFullName() { return fullName; } public void setFullName(String fullName) { this.fullName = fullName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean isRetired() { return retired; www.examclouds.com
  101. 101. Пример использования getter и setter методов public class PersonDemo { public static void main(String[] args) { Person person = new Person(); person.setFullName("Петров Иван Иванович"); person.setAge(56); person.setRetired(false); System.out.println("Полное имя " + person.getFullName()); System.out.println("Возраст " + person.getAge()); System.out.println("Пенсионер? " + person.isRetired()); } } www.examclouds.com
  102. 102. Концепция JavaBeans ⚫JavaBeans классы - это классы содержащие свойства. В Java мы можем рассматривать свойства как private переменные класса. ⚫Т.к. они private, доступ к ним извне класса может быть осуществлен только с помощью методов класса. www.examclouds.com
  103. 103. Задание ⚫Изменить класс Phone в соответствии с концепцией JavaBean. www.examclouds.com
  104. 104. Класс без геттеров и сеттеров public class CircleWrong { int radius; int diam; } public class CircleWrongDemo { public static void main(String[] args) { CircleWrong circle = new CircleWrong(); circle.diam = 25; circle.radius = 10; System.out.println("Диаметр: " + circle.diam); System.out.println("Радиус: " + circle.radius); } } www.examclouds.com
  105. 105. Пример использования getter и setter методов public class Circle { private int radius; private int diam; public int getRadius() { return radius; } public void setRadius(int radius) { this.radius = radius; this.diam = radius * 2; } public int getDiam() { return diam; } public void setDiam(int diam) { this.diam = diam; this.radius = diam / 2; } } public class CircleDemo { public static void main(String[] args) { Circle circle = new Circle(); circle.setDiam(25); circle.setRadius(10); System.out.println(circle.getDiam()); System.out.println(circle.getRadius()); } } www.examclouds.com
  106. 106. Пример использования getter и setter методов public class User { private String login; private String password; public User(String login, String password) { this.login = login; this.password = password; } public String getLogin() { return login; } public void setLogin(String login) { this.login = login; } public String getPassword() { return password.charAt(0) + "*****"; } public void setPassword(String password) { this.password = password; } } public class UserDemo { public static void main(String[] args) { User user = new User("mylogin", "mypassword"); System.out.println("Логин: " + user.getLogin()); System.out.println("Пароль: " + user.getPassword()); } } www.examclouds.com
  107. 107. Доступ к членам класса и наследование ⚫ Несмотря на то что подкласс включает в себя все члены своего суперкласса, он не может иметь доступ к тем членам суперкласса, которые объявлены как private. public class B extends A { public int sum() { // return value1 + value2; return value1 + getValue2(); } } public class A { public int value1; private int value2; public int getValue2() { return value2; } } Доступ к ним можно получить через геттер методы. www.examclouds.com
  108. 108. Переопределение методов ⚫Если в иерархии классов совпадают имена и сигнатуры типов методов из подкласса и суперкласса, то говорят, что метод из подкласса переопределяет метод из суперкласса. ⚫Переопределение методов выполняется только в том случае, если имена и сигнатуры типов обоих методов одинаковы. В противном случае оба метода считаются перегружаемыми. www.examclouds.com
  109. 109. public class N extends M { public int k; public N(int i, int j, int k) { super(i, j); this.k = k; } public void print() { System.out.println("Print in N" + " k = " + k); } public void someMethod() { print(); } } Переопределение методов Когда переопределенный метод вызывается из своего подкласса, он всегда ссылается на свой вариант, определенный в подклассе. А вариант метода, определенный в суперклассе, будет скрыт. public class M { public int i; public int j; public M(int i, int j) { this.i = i; this.j = j; } private void print() { System.out.println("Print in M " + " i = " + i + " j = " + j); } } www.examclouds.com
  110. 110. Переопределение методов public class OverrideDemo { public static void main(String[] args) { M obj1 = new M(7, 8); obj1.print(); N obj2 = new N(4, 5, 6); obj2.print(); M obj3 = new N(1, 2, 3); obj3.print(); } } Результат выполнения: Метод M i = 7 j = 8 Метод N k = 6 Метод N k = 3 ⚫Выбор необходимого переопределенного метода выбирается JVM на основе ТИПА ОБЪЕКТА, а не типа переменной!!! www.examclouds.com
  111. 111. Динамическая диспетчеризация методов ⚫Динамическая диспетчеризация методов - это механизм, с помощью которого вызов переопределенного метода разрешается во время выполнения, а не компиляции. www.examclouds.com
  112. 112. Полиморфизм и переопределение методов ⚫Переопределение методов это одна из форм реализации полиморфизма. ⚫Полиморфизм позволяет определить в общем классе методы, которые станут общими для всех производных от него классов, а в подклассах - конкретные реализации некоторых или всех этих методов. www.examclouds.com
  113. 113. Пример переопределения методов public class Figure { double dim1; double dim2; public Figure(double dim1, double dim2) { this.dim1 = dim1; this.dim2 = dim2; } public double area() { System.out.println("Площадь фигуры не определена."); return 0; } } www.examclouds.com
  114. 114. Пример переопределения методов public class Rectangle extends Figure { public Rectangle(double dim1, double dim2) { super(dim1, dim2); } public double area() { System.out.println("B области четырехугольника."); return dim1 * dim2; } } public class Triangle extends Figure { public Triangle(double dim1, double dim2) { super(dim1, dim2); } public double area() { System.out.println("B области треугольника."); return dim1 * dim2 / 2; } } www.examclouds.com
  115. 115. Пример переопределения методов public class FindAreas { public static void main(String[] args) { Figure[] figures = new Figure[3]; figures[0] = new Figure(10, 10); figures[1] = new Rectangle(10, 10); figures[2] = new Triangle(10, 10); for (Figure figure : figures) { figure.area(); } } } www.examclouds.com
  116. 116. Задание 1. Создать метод getScholarship() для класса Student, который возвращает сумму стипендии. Если средняя оценка студента равна 5, то сумма 100 грн, иначе 80. 2. Переопределить метод в классе Aspirant. Если средняя оценка аспиранта равна 5, то сумма 200 грн, иначе 180. 3. Создать массив типа Student, содержащий объекты класса Student и Aspirant. 4. Вызвать метод getScholarship() для каждого элемента массива. www.examclouds.com
  117. 117. Методы подставки ⚫После выхода Java 5 появилась возможность при переопределении методов указывать другой тип возвращаемого значения, в качестве которого можно использовать только типы, находящиеся ниже в иерархии наследования, чем исходный тип. ⚫Такие типы еще называются ковариантными. www.examclouds.com
  118. 118. Пример подставки public class R { Box6 getInstance() { return new Box6(); } } public class S extends R { HeavyBox getInstance() { return new HeavyBox(); } } www.examclouds.com
  119. 119. “Переопределение” статических методов ⚫Статические методы НЕ могут быть переопределены. ⚫ Класс наследник может объявлять метод с такой же сигнатурой, что и суперкласс, но это не будет переопределением. ⚫При вызове переопределенного метода JVM выбирает нужный вариант основываясь на типе объекта. Вызов же статического метода происходит без объекта. Версия вызываемого статического метода всегда определяется на этапе компиляции. ⚫При использовании ссылки для доступа к статическому члену компилятор при выборе метода учитывает тип ссылки, а не тип объекта, ей присвоенного. www.examclouds.com
  120. 120. Пример “переопределения” статических методов public class Base { public void go() { System.out.println("метод из Base"); } } public class Sub extends Base { public void go() { System.out.println("метод из Sub"); } } public class Runner { public static void main(String[] args) { Base ob = new Sub(); ob.go(); Sub.go(); } } www.examclouds.com
  121. 121. Переопределение методов в классах наследниках ⚫private методы никто, кроме самого класса не видит. Поэтому их наличие/отсутствие никак не отражается на классах-наследниках. ⚫Они с легкостью могут объявлять методы с такой же сигнатурой и любыми модификаторами. Но это плохой тон! ⚫Также класс наследник может расширить видимость protected метода до public. ⚫Сузить видимость класс-наследник не может. www.examclouds.com
  122. 122. Аннотация @Override ⚫Необязательная аннотация @Override используется с методом для указания того, что он переопределен. ⚫Если метод переопределен неверно, код не скомпилируется. public class S extends R { @Override HeavyBox getInstance() { return new HeavyBox(); } } www.examclouds.com
  123. 123. Абстрактные методы ⚫Абстрактные методы – это методы у которых отсутствует реализация. ⚫Общая форма: аbstract тип имяМетода(списокПараметоров); ⚫Пример: public abstract double area(); ⚫Абстрактные методы должны быть переопределены в подклассе. www.examclouds.com
  124. 124. Абстрактные классы 1. Любой класс, содержащий один или больше абстрактных методов, должен быть также объявлен как абстрактный. 2. Для этого достаточно указать ключевое слово abstract перед ключевым словом class в начале объявления класса. ⚫public abstract class Figure2 { … public abstract double area(); } www.examclouds.com
  125. 125. Абстрактные классы ⚫ public abstract class Figure2 { … public abstract double area(); public static void main(String[] args) { Figure2 figure1 = new Figure2(); Figure2 figure2 = new Rectangle(); } } У абстрактного класса не может быть никаких объектов. Но абстрактные классы можно применять для создания ссылок на объекты. www.examclouds.com
  126. 126. Абстрактные классы ⚫ Также нельзя объявлять абстрактные конструкторы или абстрактные статические методы. www.examclouds.com
  127. 127. Пример использования абстрактного класса www.examclouds.com
  128. 128. Пример использования абстрактного класса public abstract class Figure2 { double dim1; double dim2; public Figure2(double dim1, double dim2) { this.dim1 = dim1; this.dim2 = dim2; } public abstract double area(); } www.examclouds.com
  129. 129. Пример использования абстрактного класса public class Triangle2 extends Figure2 { public Triangle2(double dim1, double dim2) { super(dim1, dim2); } public double area() { System.out.println("B области треугольника."); return dim1 * dim2 / 2; } } Любой подкласс, производный от абстрактного класса, должен реализовать все абстрактные методы из своего суперкласса или же сам быть объявлен абстрактным. public class Rectangle2 extends Figure2 { public Rectangle2(double dim1, double dim2) { super(dim1, dim2); } public double area() { System.out.println("B области четырехугольника."); return dim1 * dim2; } } www.examclouds.com
  130. 130. Пример использования абстрактного класса public class FindAreas2 { public static void main(String[] args) { Figure2[] figures = new Figure2[3]; figures[0] = new Rectangle2(20, 10); // figures[0] = new Figure2(10, 10); figures[1] = new Rectangle2(10, 10); figures[2] = new Triangle2(10, 10); for (Figure2 figure : figures) { figure.area(); } } } www.examclouds.com
  131. 131. Задание ⚫Создайте суперкласс Shape и его наследники Circle, Rectangle. ⚫Класс Shape содержит абстрактный метод draw() и переменную хранящую цвет. ⚫Классы Circle, Rectangle содержат координаты точек. ⚫Создать массив содержащий эти фигуры. ⚫В цикле нарисовать их (вызвать метод draw). www.examclouds.com
  132. 132. final переменные 1. Поле может быть объявлено как final. Это позволяет предотвратить изменение содержимого переменной, сделав ее, по существу, константой. 2. final переменная класса, объявленная как не static, должна инициализироваться при объявлении или в теле конструктора или блоке инициализации, иначе произойдет ошибка компиляции. 3. Кроме полей, объявленными как final могут быть параметры метода и локальные переменные. 4. final переменные, объявленные как static, должны быть проинициализированы при объявлении или в блоке инициализации, также объявленном как static. В противном случае, опять получится ошибка компиляции. www.examclouds.com
  133. 133. Пример final переменных public class FinalVariables { public static final int FILE_NEW = 1; private final String someString = "something"; public static void print(final double d) { // FILE_NEW = 2; final String str; str = "someString"; // str = ""; // d = 4; System.out.println("FILE_NEW = " + FILE_NEW); System.out.println("str = " + str); System.out.println("d = " + d); } public static void main(String[] args) { print(3); } } www.examclouds.com
  134. 134. Константы ⚫Константы – это переменные, значение которых не меняется. ⚫Константами в Java принято называть public static final переменные класса. ⚫Имена констант следует задавать только заглавными буквами, а слова в имени разделять знаком подчеркивания: MAX_WEIGHT. www.examclouds.com
  135. 135. Константы и магические числа ⚫Константы часто используются для борьбы c магическими (волшебными) числами, т.е. непонятно что означающими числами или строками. www.examclouds.com
  136. 136. Магические числа public class PhysicsMagicNumber { public static double potentialEnergy(double mass, double height) { return mass * height * 9.81; } public static double getVelocity(double time) { return time * 9.81; } public static double getDistance(double time) { return 9.81 * time * time / 2; } } www.examclouds.com
  137. 137. Константы и магические числа public class Physics { public static final double ACCELERATION = 9.81; public static double potentialEnergy(double mass, double height) { return mass * height * ACCELERATION; } public static double getVelocity(double time) { return time * ACCELERATION; } public static double getDistance(double time) { return ACCELERATION * time * time / 2; } } www.examclouds.com
  138. 138. final методы ⚫Чтобы запретить переопределение метода, в начале его объявления следует указать ключевое слово final. ⚫Не имеет смысла объявлять метод private final так как private метод не виден в наследниках, соответственно не может быть переопределен. ⚫Конструктор не может быть final. www.examclouds.com
  139. 139. Пример завершенного метода public class O { final void method() { System.out.println("Это завершенный метод"); } } public class P extends O { //Этот метод не может быть переопределен /* void method() { System.out.println("Недопустимо"); }*/ } www.examclouds.com
  140. 140. final классы ⚫Для предотвращения наследование класса в начале объявления класса следует указать ключевое слово final. ⚫Объявление класса завершенным неявно делает завершенными и все его методы. ⚫Одновременное объявление класса как abstract и final недопустимо. www.examclouds.com
  141. 141. Пример завершенного класса final class А{ //… } class B extends A {/ / ОШИБКА! Класс А не может //иметь подклассы //… } www.examclouds.com
  142. 142. Вопрос 1 ⚫Может ли ссылка на объект быть присвоена другому объекту? www.examclouds.com
  143. 143. Вопрос 1 ⚫Может ли ссылка на объект быть присвоена другому объекту? ⚫Да, только если этот объект не объявлен final. www.examclouds.com
  144. 144. Вопрос 2 ⚫ Как реализовать инкапсуляцию? www.examclouds.com
  145. 145. Вопрос 2 ⚫ Как реализовать инкапсуляцию? 1. Объявите переменные класса защищенными (используя модификаторы доступа, обычно private). 2. Создайте public "геттеры" и "сеттеры" методы. И используйте их для доступа к переменным. 3. "Геттеры" и "сеттеры" методы должны соответствовать JavaBeans naming conventions. www.examclouds.com
  146. 146. Вопрос 3 ⚫Можно ли изменить тип ссылочной переменной? www.examclouds.com
  147. 147. Вопрос 3 ⚫Можно ли изменить тип ссылочной переменной? ⚫Нет, тип ссылочной переменной остается неизменный. Но он может содержать ссылку на подкласс. www.examclouds.com
  148. 148. Вопрос 4 ⚫Какие члены суперкласса наследует подкласс? www.examclouds.com
  149. 149. Вопрос 4 ⚫Какие члены суперкласса наследует подкласс? ⚫Protected, public методы и переменные. Default, если классы находятся в одном пакете. www.examclouds.com
  150. 150. Вопрос 5 ⚫Что означает термин "полиморфизм"? www.examclouds.com
  151. 151. Вопрос 5 ⚫Что означает термин "полиморфизм"? ⚫Много форм. www.examclouds.com
  152. 152. Вопрос 6 ⚫Что определяет возможность вызова члена класса - ссылочный тип переменной или тип объекта? www.examclouds.com
  153. 153. Вопрос 6 ⚫Что определяет возможность вызова члена класса - ссылочный тип переменной или тип объекта? ⚫Ссылочный тип переменной. www.examclouds.com
  154. 154. Вопрос 7 ⚫Правильный ли это код: class Potato extends Vegetable, Cookable { // more code } www.examclouds.com
  155. 155. Вопрос 7 ⚫Правильный ли это код: class Potato extends Vegetable, Cookable { // more code } Нет. www.examclouds.com
  156. 156. Лекции, задания, видео, тесты и вопросы на: ⚫ https://www.examclouds.com/ru/java/java-core- russian/lesson7 Подписывайтесь на страницу: ⚫ https://www.facebook.com/Examclouds ⚫ Подписывайтесь на канал https://www.youtube.com/c/tatyanamilkina www.examclouds.com

×