Similar presentations:
Java Урок 10 ООП. Класи (1)
1.
Тема уроку: класи2.
Java – що таке класи та об’єкти?Класи та об’єкти є двома основними аспектами об’єктно-орієнтованого програмування.
Подивіться на наступну ілюстрацію, щоб побачити різницю між класом та об’єктами:
Отже, клас – це шаблон для об’єктів, а об’єкт – екземпляр класу.
Під час створення окремих об’єктів вони успадковують усі змінні та методи класу.
Ви дізнаєтеся набагато більше про класи та об’єкти в наступному розділі.
3.
КласКлас – логічний опис чогось, шаблон, за допомогою якого можна створювати реальні екземпляри
цього самого чогось. Іншими словами, це просто опис того, якими мають бути створені сутності: які
властивості та методи повинні мати.
Властивості – характеристики сутності.
Методи – дії, які може виконувати.
public class Student {
private String name, group, specialty;
public Student(String name, String group, String
specialty) {
this.name = name;
this.group = group;
this.specialty = specialty;
}
// getters/setters
}
Хорошим прикладом класу з реального життя, що дає розуміння, що ж таке клас, можна вважати креслення:
креслення використовуються для опису конструкцій (катапульта, викрутка), але креслення – це не конструкція.
Інженери використовують креслення, щоб створювати конструкції, так і в програмуванні класи використовуються
для того, щоб створювати об'єкти, що мають описані властивості та методи.
4.
Клас. Коротко• Клас (class) описує ознаки стану і поведінки
множини схожих об’єктів
• Клас – це користувачевий тип даних
class Car {
String name;
int speed;
int fuel;
objects
class
auto1
void setName(String newName) {…}
void speedUp(int delta) {…}
void applyBrakes(int delta) {…}
void addFuel(int delta) {…}
void printState() {…}
}
auto2
auto3
Car auto1 = new Car();
Car auto2 = new Car();
Car auto3 = new Car();
Car
5.
Клас. Оголошення• Публічні (public) класи
• оголошуються зі специфікатором public
• доступні всередині і зовні пакету
• допускається наявність тільки одного
публічного класу в файлі
public class Car {
String name;
int speed;
void setName(String newName) {
name = newName;
}
void speedUp(int delta) {
speed = speed + delta;
}
void applyBrakes(int delta) {
speed = speed - delta;
}
int getSpeed() {
return speed;
}
• Непублічні (package private) класи
• оголошуються без специфікатора
доступу
• доступні тільки всередині пакету
• Рекомендації по іменуванню класів:
• Ім’я класу складається з одного або
кількох слів
• Перша літера кожного слова заголовна,
інші літери – в нижньому регістрі
}
class Point
{
int x;
int y;
}
6.
Клас. ВидиУ Java є 4 види класів усередині іншого класу:
1. Вкладені внутрішні класи – нестатичні класи
всередині зовнішнього класу.
2. Вкладені статичні класи – статичні класи
всередині зовнішнього класу.
3. Локальні класи Java – класи усередині методів.
4. Анонімні Java класи - класи, що створюються
на ходу.
7.
Методи. Модифікатори доступу. ООПВказують допустиму область видимості для членів класу, тобто обмеження місць, у
яких дозволяється використовувати якусь змінну чи метод.
8.
Клас. Його елементи• Елементи класу (class members):
public class Car {
private String name;
private int speed;
• Поля (fields)
• Методи (methods)
• Специфікатори доступу:
public void setName(String newName) {
name = newName;
}
public String getName() {
return name;
}
public void speedUp(int delta) {
speed = speed + delta;
}
public void applyBrakes(int delta) {
speed = speed - delta;
}
public int getSpeed() {
return speed;
}
• public – елемент класу є
загальнодоступним
• private – елемент доступний тільки
методам класу
• protected – елемент доступний тільки
методам класу і дочірніх класів
• (не заданий) – package-private – елемент
доступний всередині пакету
• Рекомендується приховувати поля класу
від зовнішнього доступу
Спец.
Клас
Пакет
Нащадок
Зовнішн
public
Y
Y
Y
Y
protected
Y
Y
Y
N
-
Y
Y
N
N
private
Y
N
N
N
}
9.
Звернення до елементів класуpublic class Car {
private String name;
private int speed;
public void setName(String newName) {
name = newName;
}
public String getName() {
return name;
}
...
public class HelloWorld {
public static void main(String[] args) {
Car myLittleCar = new Car();
myLittleCar.name = "Славута";
myLittleCar.setName("Славута");
System.out.println(myLittleCar.name);
System.out.println(myLittleCar.getName());
}
}
10.
Перевантаження методівpublic class Car {
private String name;
private int speed;
public void setName(String newName) {
name = newName;
}
public String getName() {
return name;
}
public void speedUp(int delta) {
speed = speed + delta;
}
public void applyBrakes(int delta) {
speed = speed - delta;
}
public void applyBrakes() {
speed = 0;
}
public int getSpeed() {
return speed;
}
}
public class HelloWorld {
public static void main(String[] args) {
Car myLittleCar = new Car();
myLittleCar.speedUp(10);
System.out.println(
myLittleCar.getSpeed()); // 10
myLittleCar.speedUp(15);
System.out.println(
myLittleCar.getSpeed()); // 25
myLittleCar.applyBrakes(5);
System.out.println(
myLittleCar.getSpeed()); // 20
myLittleCar.applyBrakes();
System.out.println(
myLittleCar.getSpeed()); // 0
}
}
11.
Конструктори• Конструктор (constructor)
• метод, призначений для
ініціалізації об’єкту
• викликається автоматично при
створенні об’єкта
• не повертає значення
• може приймати на вхід
параметри
• може бути перевантаженим
• конструктор за умовчанням
(default constructor) –
конструктор, який не приймає
на вхід параметрів
public class Car {
private String name;
private int speed;
public Car() {
name = "Славута";
speed = 0;
}
public Car(String iName, int iSpeed){
name = iName;
speed = iSpeed;
}
...
public class HelloWorld {
public static void main(String[] args) {
Car car1 = new Car();
Car car2 = new Car("Volvo",90);
System.out.println(car1.getName());
System.out.println(car2.getName());
}
}
12.
Приклад використання конструкторівpublic class Point {
public int x = 0;
public int y = 0;
}
public class Line {
private Point point1;
private Point point2;
public class HelloWorld {
public static void main(String[] args) {
Line l1 = new Line(0,0,3,4);
System.out.println(l1.getLength());
Line l2 = new Line();
System.out.println(l2.getLength());
}
}
public Line() {
point1 = new Point();
point2 = new Point();
}
public Line(int x1, int y1, int x2, int y2) {
point1 = new Point();
point2 = new Point();
point1.x = x1; point1.y = y1;
point2.x = x2; point2.y = y2;
}
public double getLength() {
return Math.sqrt(
Math.pow(point1.x-point2.x, 2) +
Math.pow(point1.y-point2.y, 2));
}
}
13.
Посилання this• this – посилання на поточний об’єкт класу
public class Line {
private Point point1;
private Point point2;
public class Point {
public int x = 0;
public int y = 0;
public void setCoord(int x, int y) {
this.x = x;
this.y = y;
}
}
public Line() {
point1 = new Point();
point2 = new Point();
}
public Line(int x1, int y1, int x2, int y2) {
this();
point1.x = x1; point1.y = y1;
point2.x = x2; point2.y = y2;
}
public double getLength() {
return Math.sqrt(
Math.pow(point1.x-point2.x, 2) +
Math.pow(point1.y-point2.y, 2));
}
}
14.
Статичні поляСтатичні поля (static fields) є загальними для всіх об’єктів класу
public class Point {
public static int pointsCreated = 0;
public int x;
public int y;
public Point(int x, int y)
{
pointsCreated++;
this.x = x;
this.y = y;
}
}
public class PointDemo {
public static void main(String[] args) {
Point p1 = new Point(99,99);
Point[] ptri = {new Point(0,0), new Point(10,0),
new Point(10,10)};
System.out.println(p1.x); // 99
System.out.println(ptri[1].x); // 10
System.out.println(Point.x);
System.out.println(Point.pointsCreated); // 4
System.out.println(p1.pointsCreated); // 4
}
}
15.
Статичні методи• Статичні методи (static methods)
• Викликаються для класу, а не для конкретного об’єкту
• Можуть звертатись напряму тільки до статичних елементів класу
public class Point {
private static int pointsCreated = 0;
public int x;
public int y;
public Point(int x, int y)
{
pointsCreated++;
this.x = x;
this.y = y;
}
public static int getPointsCount() {
return pointsCreated;
}
public static void main(String [] arguments) {
Point[] ptri = {new Point(0,0), new Point(10,0),
new Point(10,10)};
System.out.println(Point.getPointsCount()); // 3
}
}
16.
Специфікатор finalСпецифікатор final використовується для оголошення змінних, які не міняють
своє значення
public class HelloWorld {
public static final double PI = 3.1415;
public static void main(String[] args) {
final double E = 2.7182;
System.out.println("Число Пі: " + HelloWorld.PI);
System.out.println("Число Ейлера: " + E);
}
}
public class Point {
public final int x;
public final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public static void main(String [] arguments) {
Point p = new Point(2,3);
p.x=2;
}
}
17.
Ініціалізація полів(1)
(2)
public class Point {
private static int pointsCreated = 0;
public int x = 0;
public int y = 0;
...
public class Point {
private static int pointsCreated;
public int x;
public int y;
static {
pointsCreated = 0;
System.out.println("Ініціалізую статичне поле");
}
public Point() {
pointsCreated++;
x = 0;
y = 0;
System.out.println("Ініціалізую об єкт");
}
18.
Ініціалізація полів(3)
public class Point {
private static int pointsCreated = initStatV();
public int x = initInstV();
public int y = initInstV();
private static int initStatV() {
System.out.println("Ініціалізую статичне поле");
return 0;
}
private int initInstV() {
System.out.println("Ініціалізую поле об єкта");
return 0;
}
…
(4)
public class Point {
public int x;
public int y;
{
System.out.println("Ініціалізую об єкт");
x=0;
y=0;
}
…
19.
Модифікатор finalПочнемо з final-змінних. Вони називаються константами. По-перше (і що головне),
перше значення, присвоєне константі, не можна змінити. Воно присвоюється один
раз і назавжди.
public class Main {
private static final int CONSTANT_EXAMPLE = 333;
public static void main(String[] args) {
CONSTANT_EXAMPLE = 999;//помилка! Не можна присвоїти нове значення
final-змінній!
}
}
Константу необов'язково ініціалізувати відразу ж. Це можна зробити і пізніше. Але значення,
присвоєне першим, так і залишиться назавжди.
public static void main(String[] args) {
final int CONSTANT_EXAMPLE;
CONSTANT_EXAMPLE = 999;//так робити можна
}
20.
Модифікатор finalПо-друге, зверни увагу на назву нашої змінної. Для констант у Java прийнята інша
угода про іменування. Це не звичний нам camelCase. У випадку зі звичайною
змінною ми б назвали її constantExample, але назви констант пишуться капсом, а
між словами (якщо їх кілька) ставиться нижнє підкреслення –
"CONSTANT_EXAMPLE".
Наприклад, вони стануть у пригоді, якщо ти постійно використовуєш якесь
незмінне значення в програмі. Скажімо, ти вирішив увійти в історію і самотужки
написати гру "Відьмак 4".
У грі вочевидь буде постійно використовуватися ім'я головного героя – "Ґеральт з
Рівії".
Цей рядок та імена інших героїв краще виділити в константу: потрібне тобі
значення зберігатиметься в одному місці, і ти точно не помилишся, друкуючи його
в мільйонний раз.
21.
Модифікатор finalpublic class TheWitcher4 {
private static final String GERALT_NAME = "Ґеральт з Рівії";
private static final String YENNEFER_NAME = "Йеннефер з Венґерберґу";
private static final String TRISS_NAME = "Трісс Мерігольд";
public static void main(String[] args) {
System.out.println("Відьмак 4");
System.out.println("Це вже четверта частина Відьмака, а " +
GERALT_NAME + " ніяк не визначиться хто йому" + " подобається більше: " +
YENNEFER_NAME + " або " + TRISS_NAME);
System.out.println("Але якщо ви ніколи не грали у Відьмака – почнемо
спочатку.");
System.out.println("Головного героя звуть " + GERALT_NAME);
System.out.println(GERALT_NAME + " - відьмак, мисливець на
чудовиськ");
}
}
22.
Перевантаження методівПеревантаження методів - це використання одного і того ж імені методу кілька разів при його оголошенні у класі.
З погляду синтаксису мови, може бути двох однакових імен у деякому локальному просторі. Але при цьому
допускається оголошення методів з однаковими іменами, але різними аргументами. Іншими словами, клас містить
у собі перевантажені, коли є два і більше методів з однаковими назвами, але різними вхідними даними:
public class Constructor {
public String constructHelloSentence(String name) {
String resultSentence = "Hello world! My name is " + name;
System.out.println(resultSentence);
return resultSentence;
}
protected String constructHelloSentence(String firstName, String
secondName) {
String resultSentence = "Hello " + firstName + "! My name is " +
secondName;
System.out.println(resultSentence);
return resultSentence;
}
}
Тут бачимо, що методи мають містити однаковий модифікатор доступу (як і тип, що повертається). Якщо
викликається перевантажений метод, з кількох оголошених методів компілятор автоматично визначає потрібний за
параметрами, які вказуються під час виклику.
23.
this. ООПЧасто в коді можна побачити ключове слово this, як наприклад у сеттерах:
public void setValue(Long value) { this.value = value; }
І що воно означає? thisJava — це посилання на поточний об'єкт цього класу. Наприклад, якщо ми
створабо об'єкт:
StringConstructor stringConstructor = new StringConstructor();
то this всередині об'єкта stringConstructor буде посиланням на той самий об'єкт. this
використовується як посилання на змінну об'єкта (як у сеттері вище), так виклику деякого
методу. Ми можемо трохи переписати наш клас:
public class StringConstructor {
public String constructHelloSentence(String name) {
String resultSentence = this.getSentence() + name;
System.out.println(resultSentence);
return resultSentence;
}
private String getSentence() {
return "Hello world! My name is ";
}
}
24.
this. ОOПЧерез this ми викликаємо метод даного об'єкта для взяття необхідного рядка. Але все
ж таки як правило для методів цього майже не використовується, так як і без нього
йде посилання на метод даного об'єкта, в основному він використовується для змінної
об'єкта.