Objektid programmeerimisel "Arvutimaailm lendab lõhki! Ja suurimaks probleemiks pole mitte viirused. Pole ka häkkerid ja kräkkerid. Suurimaks probleemideks programmides on vead!" Suurelt jaolt vigade leidmise jaoks hakatigi otsima programmeerimisse uusi vahendeid. Objektorienteeritud programmeerimine on viimase paarikümne aasta jooksul aidanud vigu leida ning tal on ka muid kasulikke omadusi. Suuremate projektide korral aitab objektideks jagamine tõsta abstraktsiooni taset ning valmistada ja kontrollida iseseisvaid programmi osi eraldi. Samuti nagu alamprogrammide loomine aitab orienteeruda suures käskude jadas, aitab objektide loomine orienteeruda alamprogrammide rägastikus. Valmis programmilõike saab korduvalt kasutada vaid siis, kui on võimalik nad arhiivist üles leida. Ka siin on kasu kõrgemast abstraktsioonitasemest. Mõnikord on lihtsalt mugav reaalset elu jäljendavaid programme panna kokku objektidest, sest ka tegelikus elus on meil tegemist suhteliselt iseseisvate üksustega (auto, inimene ... ). Java programmis peab olema kogu kirjutatav kood meetodi sees. Meetod omakorda klassi ehk objektitüübi sees. Klassid omakorda moodustavad paketi. Lihtsama programmi puhul public class Tervitus{ public static void main(String argumendid[]){ System.out.println("Tere"); } } on koodiks System.out.println("Tere"); meetodiks main ning klassiks Tervitus. Lühikeste programmide korral saab kogu programmi teksti kirjutada main()- meetodi sisse ning objektitüüp tema ümber ei ole millekski kasulik. Kui aga programmis tuleb luua uus tüüp ning sellest tüübist isendiga suhtlema hakata, siis saab programmi teksti muuta tavakeelele lähemaks ning isendeid kergemini eraldi kontrollida. class Punkt4{ int x, y; public Punkt4(){ this(0, 0); } public Punkt4(int uus_x, int uus_y){ x=uus_x; y=uus_y; } public String kirjutaAndmed(){ return "x="+x+" y="+y; } public double kaugusNullist(){ return Math.sqrt(Math.pow(x, 2)+Math.pow(y, 2)); } } public class Punktid4{ public static void main(String argumendid[]){ Punkt4 p=new Punkt4(3, 4); System.out.println(p.kirjutaAndmed()); System.out.println("Kaugus koordinaatide alguspunktist= "+ p.kaugusNullist()); } } Kas või selle näite koostamisel oli klassideks jagamine abiks. Kirjutasin programmi valmis ning panin käima. Selgus, et käivitamisel pakkus ta x ja y väärtuste 3 ja 4 juures kauguse nullist 2.2 juures. Kuna peaprogrammis on vaid palve saata oma kaugus, siis seal polnud arvutusviga teha võimalik. Seetõttu nägin, et punkt "käitub imelikult" ning teadsin kohe tema juurest viga otsima minna. Selgus, et olin ruutjuure lihtsalt kaks korda võtnud. Pärimine Kui soovida klassile Punkt4 omadusi lisada, siis pole selleks vaja terve klassi koodi uuesti ümber kopeerida. Saab luua laiendatud võimalustega klassi, mis pärib klassist Punkt4 tema omadused ning lisaks saab talle meetodeid juurde kirjutada. class Punkt4Laiend extends Punkt4{ public void liiguParemale(){ x++; } } class Punktid4a{ public static void main(String argumendid[]){ Punkt4Laiend p=new Punkt4Laiend(); System.out.println(p.kirjutaAndmed()); p.liiguParemale(); System.out.println(p.kirjutaAndmed()); } } Lisaks ümberkirjutamise vaeva vähenemisele näitab selline toimimine ka paremini välja, millise klassi isend mida oskab ning millised oskused tal võrreldes eelnevaga on juurde tulnud. Kuna sama koodi on vaid kord, siis muutmise vajaduse puhul tuleb teda muuta samuti vaid ühes kohas. Kui soovin muuta väljatrükki ilmekamaks, siis piisab, kui muudan klassis Punkt4 meetodi kirjutaAndmed(). Uut koodi kasutatakse siis ka klassi Punkt4Laiend isendi andmete välja kirjutamisel. Samuti piisab ka vea leidmisel ühes kohas parandamisest. Kuna isend klassist Punkt4Laiend oskab teha kõike, mida klassi Punkt4 isend, siis teda saab kasutada kõikjal, kus Punkt4-gi. Analoogia tavaelust võiks olla, et näiteks lendur suudab kõike, mis tavaline inimenegi (süüa, juua, magada, kellaaega öelda jne.), kuid lisaks sellele suudab ta veel lennukit juhtida. Kellaaega võime küsida ükskõik millise inimese käest, kuid lennukijuhtimist saame paluda vaid lendurilt. Seetõttu on omistamine inimene=lendur ehk Punkt4=Punkt4Laiend täiesti lubatud ja võime levinumat tegevust (nt. kirjutaAndmed()) küsida Punkt4 tüüpi muutuja käest teadmata, et tegemist on tegelikult isendiga tüübist Punkt4Laiend sarnaselt nagu võime kella küsida vastutulevalt inimeselt, teadmata, et vastutulija on ametilt lendur. Kui aga on vaja paluda ülemklassile ainuomast tegevust, siis tuleb enne veenduda, et meil kasutada olev isend ka selleks võimeline on. Samuti nagu lennujuhti vajades teeme kindlaks, et rooliasuja tõepoolest ikka lendur on. Et ülemklassi meetod välja kutsuda, tuleb muutujas peituva isendi tüüp muundada vastavaks. Kui kirjutaksime (Punkt4Laiend)p.liiguParemale(), siis saaks kompilaator aru, et tuleks kõigepealt muutuja p poolt osutatud isendil paluda paremale liikuda ning seejärel saadud tulemus muundada tüübiks Punkt4Laiend. Sel juhul aga kompilaator vaatab, et Punkt4-l palutakse paremale liikuda, mida ta aga ei oska ning tekib veateade. Kui aga lisada veel ühed sulud, siis on tulemuseks ((Punkt4Laiend)p) ehk muutujas p olnud isend Punkt4Laiend'iks muundatuna ning temal juba on võimalik lasta paremale liikuda. Juhul, kui muutujas p siiski aga pole Punkt4Laiendi tüüpi isendit tekib viga. Samuti nagu inimesel, kes pole lendur, pole võimalik lenduritunnistust näidata. Kui aga tüüp vastab oodatule, on kõik korras. class Punktid4b{ public static void main(String argumendid[]){ Punkt4 p=new Punkt4Laiend(); System.out.println(p.kirjutaAndmed()); ((Punkt4Laiend)p).liiguParemale(); System.out.println(p.kirjutaAndmed()); } } Üksikjuhul paistab säärasest muundamisest vähe kasu olema, kuid sellise omistamisvõimaluse tõttu saab ühest allikast põlvnevate isendite andmeid ühes massiivis koos hoida. Lisaks saab neilt paluda seda, mida nad kõik oskavad ning kui oleme kindlaks teinud, et vastaval isendil rohkem oskusi on, saame temalt ka nende rakendamist küsida. Nii saame inimeste andmed üheskoos hoida, sõltumata sellest, kas mõned neist on lendurid või mitte. Kui oleme aga inimese käest teada saanud, et ta lendur on, siis saame tal paluda lennuki rooli asuda. Operaator instanceof kontrollib, kas kontrollitav isend suudab vastavale klassile seatud ülesandeid täita, s.t. kas ta on sellest klassist või tema alamklassist andes vastuseks true või false. class Punktid4c{ public static void main(String argumendid[]){ int pArv=3; Punkt4 pd[] = new Punkt4[pArv]; pd[0]=new Punkt4(2, 1); pd[1]=new Punkt4Laiend(); pd[2]=new Punkt4(5, 5); for(int nr=0; nr