Створення власних класів у Java властивості, методи, конструктори

Створення класу: властивості та методи

Розглянемо приклад створення найпростішого класу. Давайте за його допомогою змоделюємо кола на координатній площині.

Кожне таке коло, як відомо, визначатиметься своїм центром (тобто точкою з двома числовими координатами) і радіусом (тобто його довжиною, що подається у вигляді числа). Таким чином, коло на координатній площині характеризують 3 речові числа. Значить у нашому класі має бути три відповідні властивості.

Поки не намагатимемося вирішувати серйозних завдань за допомогою класу, а наділимо його наступними можливостями: створене на основі класу коло має бути можливо виводити на екран (у вигляді опису його характеристик), переміщати (тобто здійснювати перетворення руху, змінюючи координати її центру) ) і масштабувати (тобто здійснювати перетворення подоби, змінюючи радіус кола).

Конструктори

Коли ми створюємо об'єкт командою Circle o1 = new Circle(); використовується так званий конструктор за умовчанням (або конструктор без параметрів) - це спеціальний метод класу, ми його не визначали явно, але навіть якщо його не визначити він створюється автоматично, виконується при створенні кожного нового об'єкта та надає початкові значення його властивостям (ініціалізує їх) . Значення за замовчуванням властивостей залежать від їх типу (0 або 0.0 для чилових типів, false для логічного типу тощо).

Конструктор за замовчуванням можна описати явно і при цьому встановити початкові значення для властивостей нового об'єкта, відмінні від значень за замовчуванням.

Від інших методів конструктор відрізняється тим, що має те саме ім'я, що і весь клас, а також не має типу значення, що повертається(По суті, в результаті своєї роботи конструктор повертає новий об'єкт потрібного класу).

Оскільки методи можна перевантажувати, а конструктор є методом, за допомогою перевантаження можна створити додаткові варіанти конструкторів. Наприклад, зручно мати конструктор, який дозволить при створенні об'єкта явно вказувати координати його центру та довжину радіусу.

Описати подібний конструктор можна на додаток до основного так:

Тепер при створенні об'єктів можна користуватися будь-яким конструктором на вибір:

Потрібно враховувати наступний факт: якщо в класі явно описано хоча б один конструктор з параметрами, то конструктор за замовчуванням (без параметрів) створюватися автоматичні вже не буде (його в такій ситуації треба описувати явно). Хоча, якщо вам потрібно лише конструктор з параметрами (як другий з нашого прикладу), то можна обійтися і без конструктора за умовчанням (описати в класі тільки один конструктор з параметрами).

Доступ до членів класу з тіла методів

Додамо в наш клас метод, що обчислює площу того кола, до якого метод застосований. Метод описуватиме так:

Результат роботи методу можна побачити так:

Зверніть увагу: всередині кожного методу класу доступні властивості об'єкта, для якого метод буде викликатися. Тобто якщо ми викликаємо метод для об'єкта o2, то всередині методу при його виконанні ми будемо працювати саме з властивостями об'єкта o2 (o2.x буде доступним x, o2.r буде доступним як r і т.д.).

Може виникнути ситуація, коли для формальних параметрів методу ви захочете використовувати імена, що вже належать властивостям класу.

Наприклад, можна було б розпочати опис методу для масштабування таким чином:

Як же в такому разізвертатися до властивостей об'єкта (адже імена цих властивостей перекриваються формальним параметром)?

Рішення такої неоднозначності існує: до будь-якої властивості всередині методу можна звертатися не тільки на ім'я, але й через посиланняthis. Тобто всередині методу можна написатиx=13;, а можнаthis.x=13; - ефект буде ідентичний. Відповідно, коли ім'я формального параметра перекриває ім'я властивості, до імені властивості слід звертатися через посиланняthis. Тоді метод можна переписати таким чином:

Зрозуміло, що зручніше не допускати перекриття імен властивостей іменами локальних параметрів у методах. Іноді, втім, потрібно всередині методу застосувати якийсь інший метод до поточного об'єкта, тоді без посилання це не обійтися.

Додамо в клас метод, що перевіряє, чи збігаються два кола по площі.

У цьому методі повинні брати участь два об'єкти: той, для якого метод викликаний і другий учасник порівняння, який може бути переданий метод через параметр. При цьому параметр матиме відповідний тип (не якийсь вбудований, а як клас Circle).