6108 Programmering i Java Leksjon 6 Objekt Del 2: 6.4 6.5 Roy M. Istad 2015 Generelt oppsett av egendefinert klasse Eks: Student Evt. importsetninger public class Klasse { Objektvariabler - instansvariabler Konstruktør Evt. overlasting av konstruktør Objektmetoder Spes. tostring-metode Spes. equals-metode Klasse.java Innkapsling (private): set-og get-metoder 6108 Programmering i Java Leksjon 6 Del 2 side 2 1
Objektsamling Hvordan håndtere mange objekt i et program? Svar: Referansetabell. 6108 Programmering i Java Leksjon 6 Del 2 side 3 Verditabell kontra referansetabell int referansevariabel Verditabeller inneholder faktiske verdier i primitive datatyper Referansetabeller inneholder kun adresser til objekt (også til String) objekt 6108 Programmering i Java Leksjon 6 Del 2 side 4 2
Deklarasjon og oppretting av tabell Vare[] varetab; = new Vare[3]; varetab[0] = new Vare(1, "Spade", 220.50, 23); varetab[1] = new Vare(2, "Hakke", 199.00, 17); varetab[2] = new Vare(3, "Spett", 170.00, 58); varetab[0] varetab[1] varetab[2] varetab[0].pris 6108 Programmering i Java Leksjon 6 Del 2 side 5 Utskrift fra referansetabell for (int i=0; i<varetab.length; i++) { Vare envare = varetab[i]; out.println( envare.tostring() ); // Evt bare: out.println( varetab[i].tostring() ); // Objektmetode i Vare-klassen public String tostring(){ return nr+"; "+navn+"; "+pris+"; "+antall; tostring Det er standard å la klasser ha en parameterløs metode tostringsom returnerer en tekstlig (String-type) versjon av ethvert objekt. 6108 Programmering i Java Leksjon 6 Del 2 side 6 3
Sortering og søk Kan ikke sortere (og da heller ikke søke) vha Arrays-klassen fordi det ikke er en naturlig ordning av objekt fra egendefinerte datatyper (egne klasser). Hvordan sortere sykler? Triks: Lag varianter av tostring-metoder som legger søkekriterium (nøkkelvariabel) først, og så samle tekstversjonen av alle objektene i en egen String-tabell og «vips»... den kan Arrays-klassen sortere! 6108 Programmering i Java Leksjon 6 Del 2 side 7 Sortering etter studentnummer Student[] studtab = new Student[3]; studtab[0] = new Student(123456, "Per", "Karlsen"); studtab[1] = new Student(121212, "Anne", "Jonsen"); studtab[2] = new Student(112233, "Lars", "Modalen"); String[] studnrtab = new String[studTab.length]; // Legger studentene tekstlig i en tabell, som kan sorteres for (int i=0; i<studtab.length; i++) studnrtab[i] = studtab[i].tostring(); Arrays.sort(studNrTab); String uttekst = "Liste etter studentnr."+"\n"; for (int i=0; i<studnrtab.length; i++) uttekst += studnrtab[i] + "\n"; showmessagedialog(null, uttekst); Liste etter studentnr. 112233: Modalen, Lars 121212: Jonsen, Anne 123456: Karlsen, Per 6108 Programmering i Java Leksjon 6 Del 2 side 8 4
Objektmetoder for sortering public String tostring() { return studnr + ": " + etternavn + ", " + fornavn; public String skrivetternavn() { return etternavn + ", " + fornavn + ": " + studnr; public String skrivfornavn() { return fornavn + " " + etternavn + ": " + studnr; 6108 Programmering i Java Leksjon 6 Del 2 side 9 Søk i en referansetabell Student[] studtab = new Student[ ]; // Lengde via verdi // Søk i en referansetabell uten en egen ordning int søkenr = 123456; // For å slippe innlesing int pos = -1; // Antar at stud.nr. ikke er i tabellen for (int i=0; i< studtab.length; i++) if ( studtab[i].studnr == søkenr ) pos = i; uttekst = "Søkeresultat" + "\n" + "Studentnr "; if ( pos < 0 ) uttekst += søkenr + " finnes ikke i listen!"; else uttekst += studtab[pos].tostring(); //? out.println(uttekst); 6108 Programmering i Java Leksjon 6 Del 2 side 10 5
Referansetabeller og metoder 1) Deklarerer tabellen som en klassevariabel. Nyttig når et brukerprogram har flere metoder (ikke bare main) som skal jobbe på en og samme tabell. Sett modifikatoren static i deklarasjonen av tabellen. Gjøres før objektvariablerog metoder. Klassevariabler eksisterer, og kan brukes, uten noe objekt tilstede. Obs! Math-klassen har klassekonstanten PI (låst klassevariabel) Integer-klassen har klassekonstanten MAX_VALUE 6108 Programmering i Java Leksjon 6 Del 2 side 11 Eksempel på tabell som klassevariabel public class Test { static int[] talltab; public static void main(string[] args) { talltab = {4, 7, 2; doblingavtall(); out.println( Arrays.toString(tallTab) ); private static void doblingavtall() { for (int i=0; i<talltab.length; i++) talltab[i] = 2*tallTab[i]; Tabellen eksisterer og er tilgjengelig utenfor begge metodene (utenfor skopet) 6108 Programmering i Java Leksjon 6 Del 2 side 12 6
Referansetabeller og metoder 2) Parameteroverfører tabellen til en hjelpemetode: private static boolean søk(student[] tab, int søkenr) { // søker etter et gitt studentnr i tabellen // og returnerer true/false alt etter funn return søkeresultat; // Kall: boolean funnet = søk(register, nr); Tabellen referanseoverføres (to referanser til samme tabell), dvs. at metoden ikke får en kopi av den aktuelle parameteren (studenttabellen). Metode: søk tab I primitive datatyper (som for søkenr) får metoden en kopi av aktuell parameter. Da sier vi at parameteren er verdioverført. 6108 Programmering i Java Leksjon 6 Del 2 side 13 Eksempel på referanseoverføring public class Test { public static void main(string[] args) { int[] talltab = {4, 7, 2; doblingavtall(talltab); out.println( Arrays.toString(tallTab) ); talltab private static void doblingavtall(int[] tab) { for (int i=0; i<tab.length; i++) tab[i] = 2*tab[i]; tab 6108 Programmering i Java Leksjon 6 Del 2 side 14 7
Levetid/synlighet: Skop for variabler 6108 Programmering i Java Leksjon 6 Del 2 side 15 6108 Programmering i Java Slutt på leksjon 6 Del 2 8