Objektorienterad Programmering DAT043

Relevanta dokument
Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Administrativt. Programmeringsteknik för I1. Dagens program. Objektorienterad programmering

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

DAT043 - Föreläsning 7

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Java, klasser, objekt (Skansholm: Kapitel 2)

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Lösningsförslag övning 2.

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Enkla variabler kontra referensvariabel

Vad är ett objekt? Tillstånd och beteende. Vad är ett objekt? Exempel

JAVAUTVECKLING LEKTION 11

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Objekt och klasser - Introduktion

TUTORIAL: KLASSER & OBJEKT

Grundläggande programmering med C# 7,5 högskolepoäng

Föreläsning 8 - del 1: Objektorienterad programmering (forts.) - Exempel

Malmö högskola 2008/2009 CTS

Laboration 1 - Grunderna för OOP i Java

Ett objekt... Exempel: Om ni tittar er runt i föreläsningssalen ser in många olika fysiska föremål:

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

JAVA Mer om klasser och objektorientering

725G61 - Laboration 5 Grundläggande objektorientering. Johan Falkenjack

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Classes och Interfaces, Objects och References, Initialization

Lösningar för tenta 3 DAT043,

DD1342 Programkonstruktion för F1,

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

TDDD78 Objektorientering: Lagring och livstid

Programmering för språkteknologer II, HT2011. Rum

Sammanfattning och repetition utgående från typiska tentamensuppgifter

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

DAT043 Objektorienterad Programmering

Programmering för språkteknologer II, HT2014. Rum

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

SMD 134 Objektorienterad programmering

Modeller, Objekt och Klasser

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Objektorientering: Lagring och livstid

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Tentamen OOP

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Objektorienterad programmering Föreläsning 4

Objekt och referenser

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Objekt och klasser - Introduktion. Objekt. SparKonto.java 2. SparKonto.java 1. Konton.java. Ett objekt har: Ett bankkonto

Mer om klasser och objekt

Föreläsning 8: Exempel och problemlösning

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Klasser och objekt. Henrik Johansson. August 20, 2008

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

TENTAMEN OOP

TENTAMEN OOP

Malmö högskola 2007/2008 Teknik och samhälle

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Objektorienterad Programmering (TDDC77)

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Föreläsning 5-6 Innehåll

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Objektorientering: Lagring, räckvidd och livstid

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Klasser i Java kan ha metoder och egenskaper. Metoder beskriver funktioner som klassen kan utföra. Egenskaper beskriver innehållet i klassen.

Överlagring, static, testning, formella metoder och undantag! Förelasning 13!! TDA540 Objektorienterad Programmering!

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

OOP Objekt-orienterad programmering

Objektorienterad programmering i Java

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

Objektorienterad programmering Föreläsning 5

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Del A (obligatorisk för alla)

Objektorienterad Programmering DAT043. Föreläsning 1 15/1-18 Moa Johansson

2203$( Föreläsning ii - Mer om Java bla this och konstruktorer. Exempel: lampa

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Programmeringsteknik I. Föreläsning 3: Klasser och arrayer

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Objektorienterad programmering Föreläsning 6. Mer om klasser och typer Namnrymder Inkapsling Synlighet Statiska variabler Statiska metoder

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 5. Föreläsning 5. Klasser och objekt. Klasser och objekt. Klasser och objekt

Transkript:

Objektorienterad Programmering DAT043 Föreläsning 3 22/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material) 1 Kom ihåg: Visa Javas API. Nämn att slidesens också har tillhörande text på kurshemsidan. Påminn om att kod som lämnas in till labbarna ska vara tydlig, välstrukturerad, kommenterad etc. enligt instruktioner på labsidan. Annars kan man få retur på labben trots att programmet producerar rätt svar.

Dagens föreläsning Objekt - hur definierar vi nya klasser och objekt? Objekttyper. Konstruktor-metoder: att skapa nya objekt. Inkapsling och synlighet: public/private 2 På förra förläsningen talade vi lite kort om några Objekttyper: t.ex. String. Idag går vi mer på djupet och går igenom hur man skapar egna objekttyper och konstruerar objekt av dessa typer, samt hur Java organiserar kod i klasser.

Repetition: Objektorienterad programmering Ur SAOL: 2 språkv. satsdel som uttrycker föremål för handling I sammansättn. objekt- (vanl. till objekt 1), objekts- (vanl. till objekt 2). Ada Lovelace programmerade den första datorn. Programmet skriver ut Hello World i terminalförstret. Jag flyttar tornet två steg åt höger. Ta bort alla siffror ur strängen. 3 Från föreläsning 1: Namnet objektorienterad programmering kommer från språkvetenskapen, där det benämner en satsdel som är föremål för handling. Alltså: Inom objektorienterad programmering struktureras programmen efter vilka objekt som vi vill modellera.

Repetition: Objektorienterad programmering Objekt: modeller av det programmet hanterar, e.g. terminalfönster, spelpjäser i ett schackprogram Klasser: moduler i Java, innehåller, t.ex. Beskrivning av en objekttyp. Metoder: vilka handlingar kan man utföra på objekten. Konstruktorer: hur vi konstruerar objekt. 4 Objekt är alltså modeller av det programmet hanterar (e.g. meddelanden som skrivs ut, spelpjäser i ett schackspelsprogram). Beskrivningar/definitioner av objekt tillsammans med *metoder* (handlingar man kan göra med/på) objekten (jmfr. med funktioner) samlas i Java i *klasser*. Den här föreläsningen handlar om att definiera våra egna objekt

Skapa objekt och klasser I Java: public class Person{ public String förnamn; public String efternamn; public int ålder; public double längd; public double vikt;...... I Haskell: data Person = Person { firstname :: String, lastname :: String, age :: Int, height :: Float, weight :: Float 5 Det är ofta praktiskt att kunna definiera nya typer när man programmerar, t.ex. för att bunta ihop värden som på något vis hör samman. Här antar vi att vi har fått i uppgift att skriva ett program som hanterar personinformation, och i vårt exempel är vi intresserade av för- och efternamn, ålder, längd och vikt. Olika programmeringsspråk löser detta på olika sätt. I Java gör vi det genom att definiera en ny objekttyp i en ny klass som heter Person (I Haskell skulle man definiera en ny datatyp med s.k. record-syntax). Eftersom Java är ett objektorienterat språk, där vi strukturerar programmet efter vilka objekt vi ska göra saker med, så definieras Person i en egen klass med samma namn. Den information vår nya objekttyp ska innehålla (namn, ålder, längd osv) kallas i Java för klassens/objektets instansvariabler eller komponenter (eller fields på engelska). Vi definierar en typ av objekt per klass. (Detta skiljer sig från Haskell, där man ofta kan definiera många datatyper i samma modul). Enligt objektorienterad filosofi ska även metoder som gör saker med vår nya objekttyp Person också definieras i klassen Person. Klassnamn skrivs alltid med stor bokstav enligt Javas konventioner. En klass som är deklarerad public som klassen Person, måste sparas i en fil med samma namn, dvs Public.java. Vanligtvis i Java definierar man också bara en klass per fil.

Skapa objekt och klasser: Konstruktormetoder public class Person{ public String förnamn; public String efternamn; public int ålder; public double längd; public double vikt; public Person(String fnamn, String enamn, int å, double l, double v){ förnamn = fnamn; efternamn = enamn; ålder = å; längd = l; vikt = v; Person p1 = new Person( Alice, Alicedotter, 60, 1.60, 60.5); Person p2 = new Person( Bob, Bobsson, 25, 1.85, 93.0); 6 Varje objekt av typ Person som vi konstruerar kommer att ha sina egna kopior, eller instanser, av komponenterna förnamn, efternamn, ålder, längd och vikt. Hur konstruerar vi då nya objekt av typen Person? Via speciella metoder som kallas konstruktorer (constructor methods)! En konstruktor-metod har alltid samma namn som klassen/objekttypen. En klass kan ha en eller flera konstruktorer som representerar olika sätt att skapa objekt av typen. Nya objekt av typen skapas med operatorn new samt ett anrop till konstruktorn.

Skapa objekt och klasser: Konstruktormetoder public Person(String fnamn, String enamn, int å, double l, double v){ förnamn = fnamn; efternamn = enamn; ålder = å; längd = l; vikt = v; public Person(String förnamn, String efternamn){ this.förnamn = förnamn; this.efternamn = efternamn; ålder = -1; // okänt längd = -1 // okänt vikt = -1 // okänt Person p1 = new Person( Alice, Alicedotter, 60, 1.60, 60.5); Person p2 = new Person( Bob, Bobsson, 25, 1.85, 93.0); Person p3 = new Person( Calle, Carlsson ); 7 En klass kan ha en eller flera konstruktorer som representerar olika sätt att skapa objekt av typen. Här definierar vi en andra konstruktor som vi kan använda för att konstruera ett objekt av typ Person när vi inte bryr oss om eller känner till ålder, längd och vikt. Notera att vi kan döpa parametrarna till konstruktorn till samma namn som instansvariablerna! Hur ska vi nu veta vad som är vad? Jo, vi kan använda notationen this vilket talar om att vi menar instansvariabeln på this object, dvs det objekt vi håller på att konstruera. this.förnamn refererar alltså till instansvariabeln i objektet vi konstruerar, medan bara förnamn refererar till konstruktormetodens argument. Det är OK att ha flera metoder med samma namn i samma klass i Java. Så länge de har olika parametrar och/eller returtyp kan kompilatorn skilja på dem.

Skapa objekt och klasser: Instansmetoder public class Person{ public String förnamn; public String efternamn; public int ålder; public double längd; public double vikt;... // Beräkna body-mass-index public double bmi(){ return vikt/(längd*längd); Person p1 = new Person( Alice, Alicedotter, 60, 1.60, 60.5); Person p2 = new Person( Bob, Bobsson, 25, 1.85, 93.0); double abmi = p1.bmi(); double bbmi = p2.bmi(); 8 Vi definierar en typ av objekt per klass. (Detta skiljer sig från Haskell, där man ofta kan definiera många datatyper i samma modul). Enligt objektorienterad filosofi ska även metoder som gör saker med vår nya objekttyp Person också definieras i klassen Person. Exempelvis en metod som räknar ut en persons BMI. Men, metoden bmi refererar till vikt och längd, trots att den inte tar några argument! Varifrån kommer dessa värden? bmi är en s.k. instansmetod, det vill säga en metod som kallas på (eller av) ett objekt av typ Person. Alla objekt av typ Person har ju komponenterna längd, vikt osv. och det är de specifika värdena från det objekt som metoden kallas på som avses. Genom att samla alla metoder som har att göra med objekt av typen Person i samma klass, så samlas kod som hör ihop på ett naturligt sätt enligt objektorienterad filosofi. Vi utgår alltså från objekten när vi delar upp vårt program i olika filer (klasser). (I ett funktionellt programmeringsspråk skulle man kanske dela upp kod på ett annat vis, t.ex. efter funktion. Ett exempel från ett av de projekt jag är inblandad i: En modul som heter Pretty som innehåller kod som Pretty-printar många olika data-typer. Så skulle man inte göra i Java, då skulle varje datatyp ha en egen klass med en egen Pretty-print metod). Demo: Person.java, TestPerson.java

Inkapsling och synlighet public class Person{ public String förnamn; public String efternamn; public int ålder; public double längd; public double vikt;... public double bmi(){ return vikt/(längd*längd); I en annan klass kan objekten ändras om t.ex. längd är public: Person p1 = new Person( Alice, Alicedotter, 60, 1.60, 60.5); Person p2 = new Person( Bob, Bobsson, 25, 1.85, 93.0);... p1.längd = 165; 9 Vi har i flera exempel sett ordet public framför metoder och instansvariabler. Vad betyder det? Jo, det har att göra med synlighet: en metod som är public kan t.ex. kallas utanför klassen där den är definierad (exempelvis kan konstruktorerna och metoden bmi() kallas från klassen TestPerson.java. Detta är oftast naturligt. Ibland vill man dock gömma implementationsdetaljer från användare av sin klass. Om instansvariabler, är deklarerade public så kan man komma åt dem varifrån som helst, och även ändra dem. Detta är inte alltid önskvärt, så därför brukar instansvariabler deklareras private istället. Det innebär att bara metoder i klassen har tillgång till dem. Detta för att objektens interna representation inte ska exponeras för omgivningen, den kod som använder klassen. I vårt exempel råkar en användare uppdatera p1 på ett felaktigt sätt (i cm istället för m). Detta går eftersom man har direkt åtkomst till objektens interna representation. Det kan även finnas anledning att deklarera en metod som privat, om det gäller en intern hjälpmetod som bara är tänkt att användas inom klassen och aldrig utifrån.

Inkapsling och synlighet public class Person{ private String förnamn; private String efternamn; private int ålder; private double längd; private double vikt;... public void setlängd(double nylängd){ // enkel sanity check, folk är mellan (säg) 0.3-3m. if(0.3 <= nylängd && nylängd <= 3.0) längd = nylängd; else System.out.println( Längd ska anges i meter. Godkända värden är 0.3-3.0m. ); public double getlängd(){ return längd; 10 Varför vill man inte detta? Dels så vill man hålla all kod som hör ihop med hur man valt att representera objekten på samma plats, i klassen, så att övrig kod inte kan förstöra tillståndet i ett objekt. I stora projekt är det ofta olika personer som implementerar klassen och som använder dem och man vill att beroendena mellan klass-koden och den användande koden ska bli så små som möjligt. Därför döljer man representationen av objekten och definierar ett antal metoder som användaren anropar istället för att manipulera direkt med instansvariablerna. Metoderna utgör ett gränssnitt som skiljer de olika delarna av koden åt. Den som använder klassen kan inte ställa till det i den interna representationen genom sin okunskap. Den som implementerar klassen kan utan problem ändra den interna representationen utan att resten av koden behöver ändras, så länge gränssnittet förblir detsamma. I exemplet ovan är objektet inte särskilt komplext och valet av representation är naturligt, så att låta komponenterna vara public är inte så dumt. Man i allmänhet när det gäller mer komplexa objekt är valet av representation inte självklart och risken att göra fel stor. Då är möjligheten att dölja representationen för omvärlden väsentlig. Om vi gör instansvariablerna ovan private så försvinner möjligheten för en användare av klassen att direkt avläsa och förändra värdena. Detta gör att man behöver så kallade getters och setters, metoder som bara är till för att göra detta. En annan fördel med att gömma den interna representationen är att vi kan ändra den, så länge de publika metoderna förblir desamma, kommer vi inte att ha sönder kod som använder klassen. DEMO: Person2.java

Klassvariabler: static public class Person{ // Klassvariabler: delas av alla objekt/metoder private static double minlängd = 0.3; private static double maxlängd = 3.0; // Instansvariabler: en uppsättning per objekt av typ Person private String förnamn; private String efternamn; private int ålder; private double längd; private double vikt;... public Person(String fnamn, String enamn, int å, double l, double v){ förnamn = fnamn; efternamn = enamn; ålder = å; vikt = v; if(minlängd <= l && l <= maxlängd) längd = l; else...;... public void setlängd(double nylängd){ if(minlängd <= nylängd && nylängd <= maxlängd) längd = nylängd;... 11 Variabler som deklareras statiska kallas klassvariabler och är globala variabler. När ett program körs finns bara en instans av klassvariabler, inte en per objekt som gäller för instansvariablerna. Statiska metoder kan bara komma åt statiska variabler. För att anropa statiska metoder eller komma åt statiska variabler utanför klassen inleder man man klassens namn följt av punkt. Vi har t.ex. använt metoden Integer.parseInt. Detta är en statisk metod som tillhör klassen Integer. Exempel: Vi såg tidigare metoden setlängd, som innehöll en kontroll av att det nya värdet på längden av en Person var inom rimliga gränser. Även konstruktorn för klassen bör kontrollera detta. Här skulle ett bra alternativ vara att explicit deklarera dessa gränser som statiska variabler, eftersom alla instanser av Person skall ha en längd inom samma spann. Vill man då ändra dessa gränser är det enkelt att göra det på ett och samma ställe, nämligen de statiska klassvariablerna minlängd och maxlängd. På detta sätt undviker vi att vi av misstag anger olika spann i olika metoder.

Klassmetoder aka statiska metoder public class Person{ // Klassvariabler: delas av alla objekt/metoder private static double minlängd = 0.3; private static double maxlängd = 3.0; // Instansvariabler: en uppsättning per objekt av typ Person private String förnamn; private String efternamn; private int ålder; private double längd; private double vikt; // Klassmetoder public static double getminlängd(){return minlängd; public static double getmaxlängd(){return maxlängd; Person p1 = new Person( Alice, Alicedotter, 60, 1.60, 60.5); p1.bmi() // Rätt, bmi är en instansmetod, kallas av objekt. Person.bmi() // FEL! Person.getMinLängd() // Statisk metod kallas med Klassnamn. p1.getminlängd() // Dock tillåts även detta. 12 De metoder vi såg tidigare under första veckans föreläsningar var oftast statiska, och deklarerades med attributet static Metoder som deklareras som statiska kallas klassmetoder och de har inget aktuellt objekt som implicit argument. I alla exempel vi gjort tidigare har metoder varit statiska av denna anledning. Main-metoden måste deklareras som static och public. Om vi vill skriva metoder för att komma åt de statiska variablerna minlängd och maxlängd är det naturligt att även dessa är statiska. De har ju inget att göra med specifika objekt av typen Person (instanser av klassen Person) utan hör direkt till själva klassen. Demo: Person3.java

Samanfattning Vi definierar nya objekttyper i klasser. Ett objekt med typen som definierats i en klass kallas ofta en instans av klassen. Instansvariabler - en uppsättning per objekt av typen. Klass- eller statiska variabler - en per klass. Delas av alla objekt. Instansmetoder - kallas alltid på ett objekt av klassens typ: obj.instansmetod(argument). Här blir obj som ett extra (implicit) argument till metoden. Klass- eller statiska metoder - hör till klassen. Kallas med klassnamnet som prefix: Klassnamn.statiskMetod(argument) 13

Värdet null Förvalda värden: om vi inte initierat en variabel explicit ännu. e.g. 0 för typen int, false för typen boolean osv. För objekttyper och arrayer är förvalt värde specialvärdet null. null betyder att variabeln inte refererar till någonting. Person p1;... if (p1 == null){ // Hantera fallet att p1 inte är initierad. Person[] personer = new Person[100]; // Sant eller falskt? boolean isarraynull = personer == null; boolean iselementnull = personer[0] 14 == null; Förvalt värde för objekt och arrayer som inte initieras explicit är ett specialvärde som heter null. Detta innebär att variabeln inte refererar till någonting. (Möjligheten att sätta ett objekt till null används ganska mycket för att situationer där man kan använda Maybe A i Haskell, d.v.s. man kanske har ett A. Man kan säga att alla objekt av klassen A i java egentligen är Maybe A.) Man kan testa om en variabel refererar till ett objekt eller inte, i.e. om den har initierats eller ej. I exemplet har vi initierat arrayen personer till en ny array av längd 100. Så isarraynull är falsk. Däremot har vi ännu inte initierat elementen i arrayen. Dessa har därför sina förvalda värden. Eftersom Person är en objektyp är det förvalda värdet null, så iselementnull är sann. Övning: Om vi vill initiera arrayen personer med faktiska objekt instället för null, hur gör vi då? Objekten ska existera, men behöver inte ännu ha definierade värden på instansvariablerna. Tips: Lägg till en konstruktor utan argument till Person-klassen.

Jämföra objekt Person p1 = new Person( Pelle, Persson ); Person p2 = new Person( Pelle, Persson ); Person p3 = p1; System.out.println(p1 == p2); // -> false System.out.println(p1 == p3); // -> true förnamn: Pelle förnamn: Pelle efternamn: Persson ålder: -1 p3 efternamn: Persson ålder: -1 längd: -1 längd: -1 vikt: -1 p1 15 p2 vikt: -1 Man kan också jämföra objektvariabler med varandra. Detta avgör om de refererar till exakt samma instans eller ej, ej om deras komponenter är lika. Om man vill kunna jämföra innehållet i objekt skriver man oftast istället en (instans)metod som heter equals(...). Där kan man definiera hur objektets komponenter ska jämföras. Se t.ex. equals för String: String s1 = Pelle ; String s2 = Pelle ; s1 == s2; //false s1.equals(s2); // true Övning: Skriv en metod public boolean equals(person otherperson){... för klassen Person! Kontrollera att p1.equals(p2) returnerar true för exemplet ovan. Övning: Vad är värdet på x1, x2, x3 om vi skriver: p1.setlängd(1.70); p2.setlängd(1.94); p3.setlängd(1.78); double x1 = p1.getlängd(); double x2 = p2.getlängd(); double x3 = p3.getlängd();

Konstanter: final class Employee { // Klasskonstant public final static int minsalary = 15000; // Konstant instansvariabel. Kan ej ändras efter initiering. private final int id; private String name; private int salary; public Employee(int id) { this.id = id; public void setid(int newid) { id = newid; // Detta går inte. 16 Man kan ange att variabler ska vara konstanter, d.v.s. ej gå att ändra. Det gör man genom attributet final. Både instansvariabler och klassvariabler kan ha attributet final. Konstanter kan förstås initieras i deklarationen, men även initieras och ändras i klassens konstruktorer. Det är först när konstruktorn är klar som värdet fixeras och inte kan ändras mer. Exempel 2: I klassen Person används värdet -1 för att ange att ålder/längd/vikt är okänt. Ett snyggare sätt att tydligöra detta är att använda statiska konstanter, t.ex. public final static double OKÄND_LÄNGD = -1; public final static double OKÄND_VIKT = -1; public final static int OKÄND_ÅLDER = -1; Notera att det är säkert att låta dessa konstanter vara publika, eftersom de är deklarerade final kan de inte ändras ändå. Nu kan kod utanför klassen testa ifall ett objekt har okänt värde för t.ex. längd genom att testa för likhet med konstanten Person.OKÄND_LÄNGD, och behöver inte bry sig om exakt vilket värde vi internt använder för att representera detta (ännu ett exempel på inkapsling). Detta är god programmeringspraktik! Exempel: if (p1.getlängd() == Person.OKÄND_LÄNGD) System.out.println( Längd okänd! );