Доступ до членів

обєкта здійснюється за допомогою оператора – Наприклад, objmethod () Оператор може застосовуватися і для доступу до статичних членам або по імені класу, або за посиланням на обєкт Якщо для доступу до статичних членам використовується посилання на обєкт, то вибір класу здійснюється на підставі оголошеного типу посилання, а не фактичного типу обєкта Для доступу до елементів масивів служать квадратні дужки – наприклад, array [i]

Якщо використовувати або [] з посиланням, значення якої дорівнює null, то збуджується виключення NullPointerException (крім того випадку, коли ви використовуєте для виклику статичного методу) Якщо індекс масиву виходить за його межі, збуджується виключення IndexOutOfBounds Перевірка здійснюється при кожному зверненні до елементу масиву / Принаймні runtime-система поводиться саме так, але компілятор часто може уникнути перевірки в тих випадках, коли він дійсно впевнений, що все в порядку, наприклад, якщо значення змінної циклу завжди лежить в допустимому діапазоні /

Для правильного виклику методу необхідно надати аргументи на потрібному

кількості і правильного типу, щоб у класі знайшовся рівно один метод з збігається сигнатурою Якщо метод не перевантажувався, справа йде просто – з імям методу асоціюється всього один профіль Вибір виявляється нескладним і в тому випадку, якщо був оголошений всього один метод із заданим імям і кількістю аргументів

Якщо існує два і більше перевантажених методу з однаковою кількістю параметрів, вибір правильної версії стає трохи більш складним Для цього Java користується наступним алгоритмом, званим Алгоритмом самого точного збігу:

1 Знайти всі методи, до яких може відноситися даний виклик, – тобто побудувати список всіх перевантажених методів з потрібним імям і типами параметрів, яким можуть бути присвоєні значення всіх аргументів Якщо знаходиться всього один метод з усіма відповідними аргументами, викликається саме він

2 У нас залишився список методів, кожен з яких підходить для виклику Проробимо наступну процедуру Розглянемо перший метод в списку Якщо замість параметрів в першому методі можуть бути використані параметри ще якого-небудь методу зі списку – виключимо перший метод зі списку Ця процедура повторюється до тих пір, поки залишається можливість видалення методів

3 Якщо залишився рівно один метод, то збіг для нього виявляється найточнішим, і він буде викликатися в програмі Якщо ж залишилося кілька методів, то виклик є неоднозначним точного збігу не існує, а виклик виявляється неприпустимим

Наприклад, припустимо, що у нас є вдосконалена версія класу з десертами з розділу 32:

Припустимо також, що у нас є кілька перевантажених методів, які викликаються для конкретних комбінацій параметрів Dessert:

void moorge (Dessert d, Scone s) {/ * Перша форма * /} void moorge (Cake c, Dessert d) {/ * Друга форма * /} void moorge (ChocolateCake cc, Scone s) {/ * Третя форма * / }

Тепер розглянемо такі виклики moorge:

moorge (dessertRef, sconeRef) moorge (chocolateCakeRef, dessertRef) moorge (chocolateCakeRef, butteredSconeRef) moorge (cakeRef, sconeRef) / / НЕВІРНО

У першому виклику використовується перша форма moorge, тому що типи параметрів і аргументів в точності збігаються У другому виклику використовується друга форма, тому що тільки в ній передані аргументи можуть бути присвоєні відповідно до типу параметрів В обох випадках викликається метод визначається після виконання першого кроку описаного вище алгоритму

З третім викликом справа йде складніше Список потенційних кандидатів включає всі три форми, тому що посилання chocolateCakeRef може бути присвоєна першому параметру, а ButteredScone – другому параметру у всіх трьох формах, і ні для однієї з сигнатур чи не знаходиться точного збігу Отже, після кроку 1 у нас є набір з трьох методів-кандидатів

На кроці 2 з набору виключаються всі методи з менш точним збігом У нашому випадку перша форма виключається через те, що збіг для третьої форми виявляється більш точним Дійсно, розглянемо третій і перший методи Посилання на ChocolateCake (з третьої форми) може бути присвоєна параметру типу Desert (з першої форми), а посилання на Scone (з третьої форми) безпосередньо присвоюється параметру типу Scone (у першій формі) Друга форма виключається з набору по аналогічних міркувань У результаті кількість можливих методів скоротилося до одного (третього форми moorge), і саме цей метод і буде викликаний

Останній виклик є неприпустимим Після кроку 1 набір можливих методів складається з першої та другої форм Оскільки параметри будь-який з цих форм не можуть бути присвоєні параметрах другий, на кроці 2 цієї статті не вдається виключити з набору жодну з цих форм Отже, ми маємо справу з неоднозначним викликом, з приводу якого компілятор не може прийняти жодного рішення, що є неприпустимим

Ці ж правила відносяться і до примітивних типам Наприклад, значення int може бути присвоєно змінної float, і при розгляді перевантаженого виклику цей факт буде прийнятий до уваги – точно так само, як і можливість присвоювання посилання ButteredScone посиланням Scone

Перевантажені методи не можуть відрізнятися одним лише типом значення, що повертається і / або списком порушуваних винятків, оскільки в іншому випадку при виборі

запускається методу виникало б занадто багато неоднозначностей Наприклад, якби існувало два методи doppelgänger, які б відрізнялися тільки тим, що один з них повертає int, а інший – short, то віддати перевагу одному з них в наступному операторі було б неможливо:

double d = doppelgänger()

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

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*