Upload
hallvard
View
230
Download
0
Embed Size (px)
Citation preview
8/14/2019 enkle objekter
1/39
1
Enkle objekter
Enkle data-orienterte objekter felt instansiering
navigering mellom objekter enkle (instans)metoder toString()-metoden
8/14/2019 enkle objekter
2/39
2
Hvordan knytte sammen datasom utgjr en enhet?
Objekter lser et generelt problem:Hvordan knytte sammen data,som utgjr en enhet
Sammenhrende datamed tabeller String[] navnetabell = {Hallvard, Trond};
int[] kontornr = {115, 213};
Vi trenger noe annet enn tabeller, somkan holde p ulike typer data p ngang!
Hal.. Tro.
115 213
hrer sammen
8/14/2019 enkle objekter
3/39
3
Objekter
Objekter kan samle data av ulike typer,p samme mte som tabeller kan samledata av samme type, men objekter har navngitte feltmed verdier av definerte
typer, istedenfor heltallsindekser som tabeller objekter ligner p ark (eller visittkort), med feltene som
variabler
Ansatt
String navn =
int kontor =
8/14/2019 enkle objekter
4/39
4
Objekter
Objekter brukes nr et fenomen kan beskrives med data som hrer sammen (over tid) prosesser har behov for behandle data som n enhet det finnes mange konkrete og gjerne observerbare ting som har
essensielle strukturelle likheter alle X har Y
nr man gjr Z trenger man en X Terminologi Begrepet klasse har flere betydninger
Strukturen som er felles for alle instanser av et fenomen Settet med instanser som har essensielle likheter Java-mekanisme for knytte data (og metoder) sammn
Begrepet objekteller instans brukes om n bestemt ting med en viss struktur og et konkret/spesifikt innhold
Eksempel: Fenomenet ansatter noe generelt med faste data knyttet til seg: en klasse Dataene som beskriver den bestemte ansatte Hallvard, rom 115: et objekt
8/14/2019 enkle objekter
5/39
5
Objekter
Eksempel: En klasse:
Fenomenet ansatter noe generelt,som knytter samme spesifikke data,
et navn og et romnr.:
Et objekt:Dataene sombeskriver denbestemte ansatte
Hallvard, rom 115
Ansatt
String navn
int kontor
#1: Ansatt
String navn = Hallvard
int kontor = 115
instans
av
8/14/2019 enkle objekter
6/39
6
Eksempler: Kurs
kurskode navn
fagansvarlig
Noen problemer med denne modellen?
Kurs
String kode
String navn
String faglrer
#1: Kurs
String kode = TDT4100
String navn = Objekt-orientert programmering
String faglrer = Hallvard Trtteberg
8/14/2019 enkle objekter
7/39
7
Eksempler: CD-spor
navn lengde
pause
Noen problemer med denne modellen?
Spor
String navn
int lengde
int pause
#1: Spor
String navn = The Kids are on High Street
int lengde = 286
int pause = 3
8/14/2019 enkle objekter
8/39
8
Objekter
En klasse deklarerer strukturen til fenomenet, dvs.dataene som knyttes sammen Eksempel (i Ansatt.java):
public class Ansatt {public String navn;public int kontor;
}
Ansatt-ark (kalles instanser)lages med new Ansatt()
Felt leses og endres med .-notasjonen Ansatt ansatt = new Ansatt(); ansatt.navn = Hallvard
if (ansatt1.navn == ansatt2.navn) { ... }
Ansatt
String navn =
int kontor =
8/14/2019 enkle objekter
9/39
9
Objekter Eksempel:
// i Ansatt.javapublic class Ansatt {public String navn;public int kontor;
}// i Hovedprogram.javapublic class Hovedprogram {public static void main(String[] args) {
Ansatt a1 = new Ansatt();a1.navn = Hallvard;a1.kontor = 115;Ansatt a2 = new Ansatt();a2.navn = Trond;a2.kontor = 213;System.out.println(a1.navn + sitter p + a1.kontor);System.out.println(a2.navn + sitter p + a2.kontor);
}}
String[] args
8/14/2019 enkle objekter
10/39
10
Objekter Eksempel:
// i Ansatt.javapublic class Ansatt {public String navn;public int kontor;
}// i Hovedprogram.javapublic class Hovedprogram {public static void main(String[] args) {
Ansatt a1 = new Ansatt();a1.navn = Hallvard;a1.kontor = 115;Ansatt a2 = new Ansatt();a2.navn = Trond;a2.kontor = 213;System.out.println(a1.navn + sitter p + a1.kontor);System.out.println(a2.navn + sitter p + a2.kontor);
}} #1: Ansatt
String navn =
int kontor = 0String[] args
Ansatt a1 =
8/14/2019 enkle objekter
11/39
11
Objekter Eksempel:
// i Ansatt.javapublic class Ansatt {public String navn;public int kontor;
}// i Hovedprogram.javapublic class Hovedprogram {public static void main(String[] args) {
Ansatt a1 = new Ansatt();a1.navn = Hallvard;a1.kontor = 115;Ansatt a2 = new Ansatt();a2.navn = Trond;a2.kontor = 213;System.out.println(a1.navn + sitter p + a1.kontor);System.out.println(a2.navn + sitter p + a2.kontor);
}} #1: Ansatt
String navn = Hallvard
int kontor = 0String[] args
Ansatt a1 =
8/14/2019 enkle objekter
12/39
12
Objekter Eksempel:
// i Ansatt.javapublic class Ansatt {public String navn;public int kontor;
}// i Hovedprogram.javapublic class Hovedprogram {public static void main(String[] args) {
Ansatt a1 = new Ansatt();a1.navn = Hallvard;a1.kontor = 115;Ansatt a2 = new Ansatt();a2.navn = Trond;a2.kontor = 213;System.out.println(a1.navn + sitter p + a1.kontor);System.out.println(a2.navn + sitter p + a2.kontor);
}} #1: Ansatt
String navn = Hallvard
int kontor = 115String[] args
Ansatt a1 =
8/14/2019 enkle objekter
13/39
13
Objekter Eksempel:
// i Ansatt.javapublic class Ansatt {public String navn;public int kontor;
}// i Hovedprogram.javapublic class Hovedprogram {public static void main(String[] args) {
Ansatt a1 = new Ansatt();a1.navn = Hallvard;a1.kontor = 115;Ansatt a2 = new Ansatt();a2.navn = Trond;a2.kontor = 213;System.out.println(a1.navn + sitter p + a1.kontor);System.out.println(a2.navn + sitter p + a2.kontor);
}} #1: Ansatt
String navn = Hallvard
int kontor = 115
#2: Ansatt
String navn =
int kontor = 0
String[] args
Ansatt a1 =
Ansatt a2 =
8/14/2019 enkle objekter
14/39
14
Objekter Eksempel:
// i Ansatt.javapublic class Ansatt {public String navn;public int kontor;
}// i Hovedprogram.javapublic class Hovedprogram {public static void main(String[] args) {
Ansatt a1 = new Ansatt();a1.navn = Hallvard;a1.kontor = 115;Ansatt a2 = new Ansatt();a2.navn = Trond;a2.kontor = 213;System.out.println(a1.navn + sitter p + a1.kontor);System.out.println(a2.navn + sitter p + a2.kontor);
}} #1: Ansatt
String navn = Hallvard
int kontor = 115
#2: Ansatt
String navn = Trond
int kontor = 0
String[] args
Ansatt a1 =
Ansatt a2 =
8/14/2019 enkle objekter
15/39
15
Objekter Eksempel:
// i Ansatt.javapublic class Ansatt {public String navn;public int kontor;
}// i Hovedprogram.javapublic class Hovedprogram {public static void main(String[] args) {
Ansatt a1 = new Ansatt();a1.navn = Hallvard;a1.kontor = 115;Ansatt a2 = new Ansatt();a2.navn = Trond;a2.kontor = 213;System.out.println(a1.navn + sitter p + a1.kontor);System.out.println(a2.navn + sitter p + a2.kontor);
}} #1: Ansatt
String navn = Hallvard
int kontor = 115
#2: Ansatt
String navn = Trond
int kontor = 213
String[] args
Ansatt a1 =
Ansatt a2 =
8/14/2019 enkle objekter
16/39
16
Referanser til objekter
Klassenavn kan/m brukes i deklarasjoner Ansatt a = new Ansatt();// a kan ikke referere til noe annet enn Ansatt-instanser
Variabler, parametre og felt kan referere til objekter void setNavn(Ansatt a, String s) {
a.navn = s;}
Metoder kan returnere objekter Ansatt lavesteKontornr(Ansatt a1, Ansatt a2) {
return (a1.kontor < a2.kontor ? a1 : a2);}
Flere variabler kan referere til samme objekt Ansatt a1 = new Ansatt();
a1.navn = Hallvard;Ansatt a2 = a1;a2.navn = Trond;a1.navn.equals(Hallvard) => false
String navn =
int kontor = 0Ansatt a1 =
8/14/2019 enkle objekter
17/39
17
Referanser til objekter
Klassenavn kan/m brukes i deklarasjoner Ansatt a = new Ansatt();// a kan ikke referere til noe annet enn Ansatt-instanser
Variabler, parametre og felt kan referere til objekter void setNavn(Ansatt a, String s)
{ a.navn = s;}
Metoder kan returnere objekter Ansatt lavesteKontornr(Ansatt a1, Ansatt a2){ return (a1.kontor < a2.kontor ? a1 : a2);}
Flere variabler kan referere til samme objekt Ansatt a1 = new Ansatt();
a1.navn = Hallvard;Ansatt a2 = a1;
a2.navn = Trond;a1.navn.equals(Hallvard) => false
String navn = Hallvard
int kontor = 0Ansatt a1 =
8/14/2019 enkle objekter
18/39
18
Referanser til objekter
Klassenavn kan/m brukes i deklarasjoner Ansatt a = new Ansatt();// a kan ikke referere til noe annet enn Ansatt-instanser
Variabler, parametre og felt kan referere til objekter void setNavn(Ansatt a, String s)
{ a.navn = s;}
Metoder kan returnere objekter Ansatt lavesteKontornr(Ansatt a1, Ansatt a2){ return (a1.kontor < a2.kontor ? a1 : a2);}
Flere variabler kan referere til samme objekt Ansatt a1 = new Ansatt();
a1.navn = Hallvard;Ansatt a2 = a1;
a2.navn = Trond;a1.navn.equals(Hallvard) => false
String navn = Hallvard
int kontor = 0Ansatt a1 =
Ansatt a2 =
8/14/2019 enkle objekter
19/39
19
Referanser til objekter
Klassenavn kan/m brukes i deklarasjoner Ansatt a = new Ansatt();// a kan ikke referere til noe annet enn Ansatt-instanser
Variabler, parametre og felt kan referere til objekter void setNavn(Ansatt a, String s)
{ a.navn = s;}
Metoder kan returnere objekter Ansatt lavesteKontornr(Ansatt a1, Ansatt a2){ return (a1.kontor < a2.kontor ? a1 : a2);}
Flere variabler kan referere til samme objekt Ansatt a1 = new Ansatt();
a1.navn = Hallvard;Ansatt a2 = a1;
a2.navn = Trond;a1.navn.equals(Hallvard) => false
String navn = Trond
int kontor = 0Ansatt a1 =
Ansatt a2 =
8/14/2019 enkle objekter
20/39
20
Objektstrukturer
Felt i objekter kan referere til andre objekter feltet m vre deklarert til referere til riktig klasse feltet m settes til et spesifikt objekt
Eksempel:public class Ansatt {
String navn;
Ansatt venstreNabo, hyreNabo;
}
Ansatt a1 = new Ansatt(), a2 = new Ansatt(), a3 = new Ansatt();
a1.navn = jag; a2.navn = hal; a3.navn = krogstie;
a1.venstreNabo = a2; a2.hyreNabo = a1;
a2.venstreNabo = a3; a3.hyreNabo = a2;
String navn = jag
Ansatt venstreNabo =
Ansatt hyreNabo =
String navn = hal
Ansatt venstreNabo =
Ansatt hyreNabo =
String navn = krogstie
Ansatt venstreNabo =
Ansatt hyreNabo =
8/14/2019 enkle objekter
21/39
21
Objektstrukturer
Objekter kan kombineres med tabeller felt i objekter kan deklareres og settes til tabeller tabeller kan inneholde objekter
Eksempel:public class Ansatt {
String navn;
Ansatt[] naboer;
}
Ansatt a1 = new Ansatt(), a2 = new Ansatt(), a3 = new Ansatt();
a1.naboer = new Ansatt[]{a2};
a2.naboer = new Ansatt[]{a1, a3};
a3.naboer = new Ansatt[]{a2};
String navn = jag
Ansatt[] naboer =
String navn = hal
Ansatt[] naboer =
String navn = krogstie
Ansatt[] naboer =
8/14/2019 enkle objekter
22/39
22
Objektstrukturer
Navigering .- og []-notasjonene (og metodekall) kan brukes til
navigering mellom objekter i en objektstruktur (og til
tilordning med =)
Gitt
a1.venstreNabo.venstreNabo.navn = = krogstie
String navn = jag
Ansatt venstreNabo =Ansatt hyreNabo =
String navn = hal
Ansatt venstreNabo =Ansatt hyreNabo =
String navn = krogstie
Ansatt venstreNabo =Ansatt hyreNabo =
Ansatt a1 = , a2 = , a3 =
8/14/2019 enkle objekter
23/39
23
Objektstrukturer
Navigering .- og []-notasjonene (og metodekall) kan brukes til
navigering mellom objekter i en objektstruktur (og til
tilordning med =)
Gitt
a3.naboer[0].naboer[0].navn == jag
Ansatt a1 = , a2 = , a3 =
String navn = jagAnsatt[] naboer =
String navn = halAnsatt[] naboer =
String navn = krogstieAnsatt[] naboer =
8/14/2019 enkle objekter
24/39
24
Hva skjer nren referanse er uinitialisert/tom?
Referansen til ingenting kalles null null er ikke et objekt i seg selv, men en verdi som representerer intet
objekt teknisk sett kan alle (objekt)referanser vre null
(felt/attributter, variabler, returverdier og verdien av uttrykk)
Hva kan en gjre med null-verdier? kun testing av identitet (== og !=) og type (instanceof) gir mening nr en prver lese eller sette et attributt eller kalle en metode p
null-referansen, s krsjer programmet
Ansatt a; // ikke initialisert med f.eks. new Ansatt()!!!a.navn = Hallvard // tryner med NullPointerException!!!
gjre noe med null er tull
8/14/2019 enkle objekter
25/39
25
Instansmetoder
Metoder merket med static utfres kun i kontekst av destatiske variablene (som i Java-terminologi ogs kalles felt) statiske variabler er globale, som ses av statiske metoder arket med globale variabler omslutter all kode
Metoder uten static (i praksis det vi betrakter som vanligmetoder) kjrer i kontekst av enkeltobjekter
instanser kan ses p som sm-ark (omtrent som kartotek- eller visittkort) instansmetoder (metoder uten static) kjrer innenfor arket
public class Ansatt {public String navn;
public int kontor;public String getNavn() {return navn;
}public void setNavn(String nyttNavn) {navn = nyttNavn;
}}
8/14/2019 enkle objekter
26/39
26
Instansmetoder public class Ansatt {
public String navn;public int kontor;public String getNavn() {
return navn;}public void setNavn(String s) {
navn = s;}
} public class Hovedprogram {
public static void main(String[] args) {Ansatt a = new Ansatt();a.setNavn(hal);// .-notasjonen og metodenavnif (a.getNavn() == hal) {
System.out.println(Ja, det virker!);
}}
}
Arkmodellen m utvides ved at instansarket/kortet omsluttermetodens ark
String[] args
Ansatt a =
String navn =
int kontor = 0
8/14/2019 enkle objekter
27/39
27
Instansmetoder public class Ansatt {
public String navn;public int kontor;public String getNavn() {
return navn;}public void setNavn(String s) {
navn = s;}
} public class Hovedprogram {
public static void main(String[] args) {Ansatt a = new Ansatt();a.setNavn(hal);// .-notasjonen og metodenavnif (a.getNavn() == hal) {
System.out.println(Ja, det virker!);
}}}
Arkmodellen m utvides ved at instansarket/kortet omsluttermetodens ark
String[] args
Ansatt a =
String navn =
int kontor = 0
8/14/2019 enkle objekter
28/39
28
Instansmetoder public class Ansatt {
public String navn;public int kontor;public String getNavn() {
return navn;}public void setNavn(String s) {
navn = s;}
} public class Hovedprogram {
public static void main(String[] args) {Ansatt a = new Ansatt();a.setNavn(hal);// .-notasjonen og metodenavnif (a.getNavn() == hal) {
System.out.println(Ja, det virker!);
}}}
Arkmodellen m utvides ved at instansarket/kortet omsluttermetodens ark
String[] args
Ansatt a =
String navn = hal
int kontor = 0
String s = hal
8/14/2019 enkle objekter
29/39
29
Instansmetoder m/this-referanse public class Ansatt {
public String navn;public int kontor;public String getNavn() {
return navn;}public void setNavn(String s) {
navn = s;}
} public class Hovedprogram {
public static void main(String[] args) {Ansatt a = new Ansatt();a.setNavn(hal);// .-notasjonen og metodenavnif (a.getNavn() == hal) {
System.out.println(Ja, det virker!);
}}}
Metodens ark har en spesiell referanse til instansen, i form at en konstant med navn this.Denne brukes for n objektet selv, samt felt med samme navn som variabler.
String[] args
Ansatt a =
String navn =
int kontor = 0
this =
String s = hal
8/14/2019 enkle objekter
30/39
8/14/2019 enkle objekter
31/39
31
Instansmetoder m/this-referanse public class Ansatt {
public String navn;public int kontor;public String getNavn() {
return navn;}public void setNavn(String s) {
navn = s;}
} public class Hovedprogram {
public static void main(String[] args) {Ansatt a = new Ansatt();a.setNavn(hal);// .-notasjonen og metodenavnif (a.getNavn() == hal) {
System.out.println(Ja, det virker!);
}}}
Metodens ark har en spesiell referanse til instansen, i form at en konstant med navn this.Denne brukes for n objektet selv, samt felt med samme navn som variabler.
String[] args
Ansatt a =
String navn = hal
int kontor = 0
8/14/2019 enkle objekter
32/39
32
statiske vs. ikke-statiske metoder Metodekall
Statiske metoder kalles ved navn, evt. med.
Ikke-statiske metoder (heretter kun kalt metoder) kalles med.
Metoder utfres i kontekst av et objekt metoden har en implisitt this-referanse this-referansen refererer til verdien til
Navn brukt som referanser i uttrykk inni metoder refererer enten tilvariabler i metoden eller felt i objektet
Referanse til felt:String getNavn() { return navn;}
Referanse til bde felt og variabel:void setNavn(String s) { navn = s;}
this kan brukes som referanse til objektet selv i uttrykk,f.eks. for gjre uttrykket entydig eller bruke objektet som parameter void setNavn(String navn) { this.navn = navn;}
8/14/2019 enkle objekter
33/39
33
Eksempler pstatiske vs. ikke-statiske metoder Typiske statiske metoder
Metoder som ikke er knyttet til noen instans// lage spesiell instans, bruker ikke eksisterende instansstatic Ansatt createAnsatt() { ... }
Metoder som behandler to eller flere instanser likt kan godt vre statiske// sammenligne to objekterstatic Ansatt compareAnsatt(Ansatt a1, Ansatt a2) { ... }
Hjelpemetoder som behandler ikke-objekt-verdier, som tabeller og tall// sorter tabellstatic void sort(Ansatt[] ansatte) { ... }
Typiske ikke-statiske metoder metoder som kun gir mening med et objekt av en bestemt type
// converter objekt til HTML, for visning i web-sideString toHTML() { ... }
metoder som returnerer verdier som er direkte avledet av felt i objektet// returner etasjen til en ansatt
int etasje() { return kontor / 100;} metoder som endrer p ikke-statiske felt i et objekt
// endre ansattes fornavnvoid setFornavn() { ... }
Det er statiske metoder som er unntaket!
8/14/2019 enkle objekter
34/39
34
Initialisering av objekter medkonstruktrer
De fleste objekter m initialiseres fr de fr en meningsfyltinnhold/tilstand Ansatt a = new Ansatt();
a.navn = ...
En konstruktr (eng: constructor) er en spesielle metode som brukes tilndvendig initialisering ifm. bruk av new-operatoren public class Ansatt {
String navn;public Ansatt(String navn) {this.navn = navn;// en konstruktr har ingen eksplisitt retur-verdi
}}Ansatt a = new Ansatt(Hallvard);
Konstruktren deklareres som en metode uten returtype og medklassens navn evt. med klassen som returtype og uten navn
Konstruktren vs. new-operatoren konstruktren kalles automatisk av new-operatoren, etter at objektet er laget new-operatoren tar de samme parametrene som konstruktren
8/14/2019 enkle objekter
35/39
35
Litt omobjekter vs. ikke-objekter
Sannhetsverdier, tall og tegn er ikke objekter i noenforstand (siden skal vi se objektvarianter av disse typene)
kan ikke bruke 1.pluss(2) for hver ikke-objekttype finnes en klasse med hjelpemetoder for denne typen, f.eks.
int/Integer, double/Double, char/Character
Integer (og tilsvarende for Double) Integer.toString(int) konverterer int til String Integer.valueOf(String) konverterer String som int
Character Character.isUpperCase(char) og Character.isLowerCase(char) sjekker om en
bokstav er stor (upper) eller liten (lower)
Character.toUpperCase(char) og Character.toLowerCase(char) konverterer en litenbokstav til en stor og omvendt
Tabeller tabeller ligner p objekter, fordi de har skalt identitet, kan endres p og deles tabeller har ikke metoder, kun length-attributtet
8/14/2019 enkle objekter
36/39
36
Litt om String og objekter
String er en klasse String-klassen har noen nyttige statiske konverteringsmetoder
String-instanser er objekter og har en rekke nyttigemetoder (merk at String-konstanter er String-uttrykk)
indexOf og lastIndexOf finner hvor en String eller char finnes i Stringen:Hallvard.indexOf(ll) => 2
startsWith(String) og endsWith(String) for test p prefiks og suffiks:Hallvard.startsWith(Hall) => true
substring lager en ny String som bestr av en bit av Stringen:Hallvard.substring(2, 4) => ll
String-klassen ligner p ikke-objekter p to mter String-objekter hndteres spesielt av +-operatoren:Ha + ll + vard => Hallvard
String-objekter kan ikke endres det finnes ingen mter/metoder som endrer p eksisterende String-objekter String-objekter kan deles uten at endringer et sted synes et annet
8/14/2019 enkle objekter
37/39
37
Verdier og objekter
referanse (pil) kan endres har metoderboolean/int o.l.
String pga. impl.tabell
objekt avhengig avimpl.
klasse refereres baremed navn
8/14/2019 enkle objekter
38/39
38
Objekter, tekst og utskrift:toString()-metoden
Noen operasjoner krever at objektreferansergjres om til tekst (String) + operatoren, nr venstre side er en tekst, f.eks. Ansatt: + ansatt
Metoder som println vil gjre om objektreferanser til tekst
Konvertering til String null-referansen blir til null objekter konverteres ved kalle String.valueOf(obj), som i sin tur
kaller toString()-metoden, deklarert som public String toString() objekter uten en slik egendefinert metode blir skrevet ut som
@
8/14/2019 enkle objekter
39/39
toString()-metoden
toString()-metoden brukes ved konvertering avobjekter til tekst (String), f.eks. ved utskrift medprintln og print
Ved definere toString()-metoden i egne klasser,endrer en hvordan egne objekter gjres om tiltekst
Den returnerte verdien (av typen String) br vre knapp, dvs. ikke ta for mye plass informativ nok til gjenkjenne objektet vise egenskaper som er essensielle ved feilfinning
Vr toString()-metode bruker en vanligkonvensjon
[ ]