Разбиране на конструктори

Да кажеш, че конструкторът е метод, е все едно да кажеш, че австралийският утконос е просто още един бозайник. За да разберем утконоса, е важно да знаем по какво се различава от другите бозайници. За да разберете конструктора, е също толкова важно да разберете как той се различава от метод. Всеки студент по Java, особено този, който учи за сертифициране, трябва да знае тези разлики; в тази статия ще ги напиша конкретно. Таблица 1, в края на тази статия, обобщава разграниченията между конструктора и метода на ключовете.

Цел и функция

Конструкторите имат една цел в живота: да създадат екземпляр на клас. Това също може да се нарече създаване на обект, както в:

Platypus p1 = нов Platypus (); 

Целта на методите, за разлика от това, е много по-обща. Основната функция на метода е да изпълнява Java код.

Разлики в подписите

Конструкторите и методите се различават в три аспекта на подписа: модификатори, тип на връщане и име. Подобно на методите, конструкторите могат да имат всеки от модификаторите за достъп: публичен, защитен, частен или никакъв (често наричан пакет или приятелски ). За разлика от методите, конструкторите могат да вземат само модификатори за достъп. Ето защо, конструктори не може да бъде abstract, final, native, static, или synchronized.

Типовете връщане също са много различни. Методите могат да имат всеки валиден тип на връщане или никакъв тип на връщане, като в този случай типът на връщане е даден като void. Конструкторите нямат тип връщане, дори void.

И накрая, по отношение на подписа, методите и конструкторите имат различни имена. Конструкторите имат същото име като техния клас; по конвенция методите използват имена, различни от името на класа. Ако програмата Java следва нормални конвенции, методите ще започват с малка буква, конструкторите с главна буква. Също така, имената на конструктори обикновено са съществителни, тъй като имената на класовете обикновено са съществителни; имената на методите обикновено показват действия.

Използването на "това"

Конструкторите и методите използват ключовата дума thisсъвсем различно. Методът използва, за thisда се отнесе към екземпляра на класа, който изпълнява метода. Статичните методи не използват this; те не принадлежат към екземпляр на клас, така че thisняма какво да се прави. Статичните методи принадлежат на класа като цяло, а не на екземпляр. Конструкторите използват thisза препращане към друг конструктор от същия клас с различен списък с параметри. Изучете следния код:

публичен клас Platypus {Име на низ; Птицечовка (въвеждане на низ) {име = вход; } Platypus () {this ("John / Mary Doe"); } публична статична празнота main (String args []) {Platypus p1 = new Platypus ("digger"); Platypus p2 = нов Platypus (); }}

В кода има два конструктора. Първият взема Stringвход, за да назове екземпляра. Вторият, без никакви параметри, извиква първия конструктор с името по подразбиране "John/Mary Doe".

Ако конструктор използва this, той трябва да е в първия ред на конструктора; пренебрегването на това правило ще доведе до възражение на компилатора.

Използването на "супер"

И методите, и конструкторите използват superза обозначаване на суперклас, но по различни начини. Методите се използват superза изпълнение на заменен метод в суперкласа, както илюстрира следният пример:

клас Mammal {void getBirthInfo () {System.out.println ("роден жив."); }} клас Platypus разширява Mammal {void getBirthInfo () {System.out.println ("люк от яйца"); System.out.print ("бозайник обикновено е"); super.getBirthInfo (); }}

В горната програма извикването на super.getBirthInfo()извиква метода на Mammalзаместване на суперкласа.

Конструкторите използват, за superда извикат конструктора на суперкласа. Ако конструктор използва super, той трябва да го използва на първия ред; в противен случай компилаторът ще се оплаче. Следва пример:

публичен клас SuperClassDemo {SuperClassDemo () {}} клас Child разширява SuperClassDemo {Child () {super (); }}

В горния (и тривиален!) Пример конструкторът Child()включва извикване на super, което води до създаване SuperClassDemoна инстанция на класа , в допълнение към Childкласа.

Предоставен от компилатора код

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

публичен клас Пример {} 

функционално е еквивалентно на писането:

публичен клас Пример {Пример () {}} 

Компилаторът също така автоматично предоставя код, когато не използвате super(като използвате нула или повече параметри) като първи ред на конструктор. В този случай компютърът автоматично се вмъква super. По този начин, ако пишете:

публичен клас TestConstructors {TestConstructors () {}} 

функционално е еквивалентно на писането:

публичен клас TestConstructors {TestConstructors () { super; }}

Остроокият начинаещ може да се чуди как горната програма може да извика конструктора на родителския клас, когато TestConstructorне разширява нито един клас. Отговорът е, че Java разширява Objectкласа, когато не разширявате изрично клас. Компилаторът автоматично предоставя конструктор без аргумент, ако не е изрично деклариран конструктор, и автоматично предоставя superизвикване без аргумент, когато конструкторът няма изрично извикване към super. Така че следните два кодови фрагмента са функционално еквивалентни:

публичен клас Пример {} 

и

публичен клас Пример {Example () { super; }}

Наследяване

Какво не е наред със следния сценарий? Адвокат чете волята на A. Class. Членовете на Classсемейството се събират около голяма конферентна маса, някои нежно ридаят. Адвокатът гласи: "Аз, A. Classкато здрав ум и тяло, оставям всичките си конструктори на децата си."

Проблемът е, че конструкторите не могат да бъдат наследявани. За щастие на Classдецата, те автоматично ще наследят някой от методите на родителите си, така че Classдецата няма да станат напълно обеднели.

Не забравяйте, че Java методите се наследяват, а конструкторите не. Помислете за следния клас:

публичен клас Пример {public void sayHi {system.out.println ("Hi"); } Пример () {}} публичен клас SubClass разширява Пример {}

В SubClassкласа автоматично наследява sayHiоткрити в родителския клас метод. Конструкторът Example()обаче не се наследява от SubClass.

Обобщаване на разликите

Точно както утконосът се различава от типичния бозайник, така и конструкторите се различават от методите; по-специално в тяхното предназначение, подпис и използване на thisи super. Освен това конструкторите се различават по отношение на наследяването и предоставения от компилатора код. Поддържането на всички тези детайли прави може да бъде скучна работа; следващата таблица предоставя удобно обобщение на изтъкнатите точки. Можете да намерите повече информация относно конструкторите и методите в раздела Ресурси по-долу.

Таблица 1. Различия между конструкторите и методите

Тема Конструктори Методи
Предназначение Създайте екземпляр на клас Групирайте Java изрази
Модификатори Не може да бъде abstract, final, native, static, илиsynchronized Може да бъде abstract, final, native, static, илиsynchronized
Тип връщане Няма тип връщане, дори void void или валиден тип връщане
Име Същото име като класа (първата буква е главна с главна буква) - обикновено съществително име Всяко име с изключение на класа. Имената на методите започват с малка буква по конвенция - обикновено името на действие
this Отнася се до друг конструктор от същия клас. Ако се използва, това трябва да е първият ред на конструктора Отнася се до екземпляр на притежаващия клас. Не може да се използва от статични методи
super Извиква конструктора на родителския клас. Ако се използва, трябва да е първият ред на конструктора Извиква заменен метод в родителския клас
Наследяване Конструкторите не се наследяват Методите се наследяват
Компилаторът автоматично предоставя конструктор по подразбиране Ако класът няма конструктор, автоматично се предоставя конструктор без аргумент Не се прилага
Компилаторът автоматично доставя повикване по подразбиране към конструктора на суперклас Ако строителят не прави нулеви или-повече аргументи разговори към super, че няма спор за обаждания в superе направена Не се прилага
Робърт Нилсен е програмист Java 2, сертифициран от Sun. Притежава магистърска степен по образование, специализирано в компютърно асистирано обучение и от няколко години преподава в компютърната област. Освен това е публикувал свързани с компютър статии в различни списания.

Научете повече за тази тема

  • Някои книги, които обхващат основите на конструкторите и методите, са
  • Пълното ръководство за сертифициране на Java 2, Саймън Робъртс и др. (Sybex, 2000) //www.amazon.com/exec/obidos/ASIN/0782128254/qid=969399182/sr=1-2/102-9220485-9634548
  • Java 2 (изпит), Бил Брогдън (The Coriolis Group, 1999):

    //www.amazon.com/exec/obidos/ASIN/1576102912/qid%3D969399279/102-9220485-9634548

  • Java накратко, Дейвис Фланаган (O'Reilly & Associates, 1999) // www.amazon.com/exec/obidos/ASIN/1565924878/o/qid=969399378/sr=2-1/102-9220485-9634548
  • Посетете уебсайта на Sun Microsystems за повече информация за методите и конструкторите

    //java.sun.com/docs/books/tutorial/trailmap.html

  • За повече съдържание на Java за начинаещи прочетете новата серия колони Java 101 на JavaWorld

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

Тази история „Разбиране на конструкторите“ първоначално е публикувана от JavaWorld.