Замяната и Претоварването

От наследяване. клас Object

Преди да продължим нашата дискусия за наследството, бих искал да се съсредоточи върху един важен момент. Както видяхме, за да наследи от всеки клас, трябва да напишете думата, се простира на името на новата класа и името на класа, от която ние искаме да бъде наследен. Но ние вече видяхме примери, в които няма думи разширява, ние не го направи. Означава ли това, че този клас е "скала". Или с други думи - не е наследен от някой от произволен клас напълно. Това не е така. Стандартният комплект от класовете на Java, има една и съща "крайъгълен камък" - най-клас обект, който е наследен от класа, който няма дума разширява. Ако не зададете извлечен клас, Вие автоматично каже на компилатора, че вие ​​наследявате от класа Object.
Т.е. определяне клас са изброени по-долу същото

обществени клас SimpleClass <…>
обществени клас SimpleClass простира Object <…>

Можете да използвате и двете форми, но на практика никой не пише простира на обекта. Ние ще се стремим да се говори за класа на обекта, който има някои доста полезни методи, но за сега ние само да спомена за нейното съществуване и неговата много важна роля в цялата йерархия на класове - от него в крайна сметка създават всички класове - това е техният дядо, прадядо и може би prapraprapradedushka.

Предимно и претоварване (Постоянна и претоварване)

По-рано, ние погледна един пример за това как можете да увеличите функциите на класа чрез разширяване на неговия обхват (наследството). Но този клас могат не само да добавят нови функции чрез създаване на нови методи. методи клас също могат да имат приоритет - направи замяна. Или претоварване - направи претоварване. Нека се опитаме да разберем това, което всеки термин.

Замяна (замяна)

Ново определяне се използва, когато замени (промени, имат приоритет) съществуващите методи. Например в класа на обекта има метод много популярен ToString (), която връща низ представителство на обекта. При изпълнението на обекта е по-скоро резултат грозно - име на класа с някои цифри (така наречените хеш-код). Нека да тече един много прост пример

Най-важното нещо е да се опише Robot клас, а именно метод нова ToString (). Нека да го разгледа по-подробно.
Тя започва метод @Override мистериозен дизайн. този дизайн е "Резюме" се нарича. Използва се за включване на допълнителна информация, която може да се чете и да се използва. Ще прегледаме резюмето по-късно, сега просто не забравяйте, че проектът, който започва с характер "@" са анотации и те не трябва да се страхуват :). За сега, само имайте предвид, че методите, които ви преимущество, по-добре е да се предвиди това пояснение. В този случай, компилаторът е в състояние да потвърдите, че сте замени метод, вместо да напише нов. По този начин, можете да избегнете някои грешки, дължащи се на разсеяност.

ВАЖНО. Анотации се появяват само във версията на Java 1.5 и по-ранни версии не ги подкрепят.

Е, тогава всичко е много проста - метод на заглавието ToString трябва да бъдат едни и същи с един и същ метод в класа на предшественик - име, връщане стойност, както и списък с опции. В този случай, ние нямаме параметри и връщане стойност е низ. Сега имаме клас, който замени съществуващите методи прародител. По този начин е възможно да се промени функционалността на класа и неговото поведение. И имайте предвид, че ние не използваме изходния код на обекта на класа - това не го правим. Независимо от това, ние бяхме в състояние да променят поведението си. Това е голямо удобство при разработването на програми. В обикновения живот, а Java програмист винаги нещо наследява, отменя. Но трябва да отбележим няколко важни точки.

Нека разгледаме един пример, използвайки нашия стар приятел робот. Така че, тук е нашият робот, който е в състояние да се движат от една точка до друга. Правили сме това например, така че тя едва ли трябва да ви изненада. Единственото допълнение - сега аз използвам пакети.

Доста трудно да се разбере необходимостта от предефиниране без да осъзнава, първоначално възможности на метода / ите.
Аз разбирам, че в изграждането на «Graphics гр» писмо «г» не е опция, а е името и може да се променя за всяка друга, например: «Graphics Овалния» и др Овалния превръща в обект с набор от методи и vsoystv.
Въз основа на запис «Oval.drawOval на (5, 5, getWidth () - 10, getHeight () - 10)," това е част от нашата овална форма, след като тя може да получава данни за дължината и ширината на формата, така директно.
Много чука, че всички транзакции (ако не греша), направени от свойствата и методите на една и съща форма, но ние трябваше да се напише три класа. Трудно е да се следи връзката между класове, без да осъзнава, възможности форма.
Въпреки, че начина, по който само за примера на проблема описване на свойствата на обектите, използвани не се поставят.

Т.е. ако съм разбрал правилно в този случай - «JComponent» е един вид канцеларски комплект хартия + молив + художник (които се нуждаят от инструкции за рисуване), «Graphics» набор от инструкции за рисуване + Painter мениджър (на зададените параметри) и «JFrame» нея масата, на която положи хартия за рисуване?

Извинете ме, аз също искам да се анализират подробно кодовия фрагмент:
@Override
защитен невалидни paintComponent (Графика ж) super.paintComponent (д);
// Използвайте графика за изготвяне на овала
// разчленена
g.drawOval (5, 5, getWidth () - 10, getHeight () - 10);
>
Минахме на Графичен обект в метода на родител клас, което е, без да се предефинира да изготви овалите не може, и след това да се използват вградените в методите на класа родител «JComponent» за изчисляване на широчината и дължината на правото?

Да, идеята е абсолютно прав. Обекти по този начин и трябва да се възприема.
Има JComponent - клас от упор. Той има метод paintComponent, която ще се нарича, когато се боядисва. И ние я имаме в класа ми изключения.
Ако копаят по-дълбоко, а след това, когато формата започва да се направи, тя работи около списъка на неговите компоненти, които тя регистрирани (ние наречения метод на добавка от формата и се прехвърля в тези компоненти - че те имат сега е). Всеки компонент (защото те са наследници на един клас Компонент) се причинява от метода на боя.
Вътре метод JComponent боя позовава paintCOmponent - така че реших да разработчиците, те знаят по-добре.
Но най-важното, което се дължи на полиморфизъм на боя от JComponent (защото нямахме отменено) вече е НАШАТА paintComponent. Т.е. Нашият клас е с боя (защото той е наследник JComponent), който причинява paintComponent (този метод ние предефинирани) и го нарича нашия paintComponent, вместо JComponent (това е същността на полиморфизъм - много готина работа в бъдеще).

Благодаря ви много, аз вече прочетете следващата глава и аз недвижими имоти под наем работа поне частично разбира същността на полиморфизъм. Много готино ... е, това е по-скоро тривиален пример (само за забавление) - ние приемаме, има някакъв клас "А" (Докладване Manager) в банковата система, която дава заданието към друг клас "В" (Доклади Designer), за да се направи доклад за извършената работа, и тук ние умело замени методи майки в извлечен клас "В1" (ochotov дизайнер + прехвърляне на пари по сметка), а след това направи следващата крачка в организацията на доклада за разговор:

линия
"В" = нов «Б»
промените в
"В" = нов «B1»

и след всеки път, когато поиска доклад за създаването на някои получите бонус като рейз, и докладва на управителя дори не осъзнават, че е имало някои промени 🙂

Отново се съсредоточи върху факта, че по примера на преувеличени (за смее се), а целта му е само да попитам дали правилно съм разбрал смисъла на полиморфизъм 🙂