Objekt och referenser

Relevanta dokument
Fält av referenser. Konstruktorerna används för att skapa Bilar och Trafikljus.

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

Java, klasser, objekt (Skansholm: Kapitel 2)

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

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.

Enkla variabler kontra referensvariabel

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

Lösningsförslag övning 2.

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

Mer om klasser och objekt

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

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

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

(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

Objekt och klasser - Introduktion

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

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

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

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

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

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

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

Malmö högskola 2008/2009 CTS

Föreläsning 5-6 Innehåll

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

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

Laboration 1 - Grunderna för OOP i Java

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

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

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

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

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. 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

Tentamen. Lösningsförslag

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

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Objektorienterad Programmering DAT043

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

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

2 b) Följande finns definierat: public class Käk String titel = "Chili con carne"; Krydda[] kryddor = new Krydda[10]; kryddor[0] = new Krydda("Svartpe

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

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

2 b) Följande finns definierat: public class Spel String titel = "Spel"; Dice[] tärningar = new Dice[10]; tärningar[0] = new Dice("Röd"); tärningar[1]

Sammanfattning och repetition utgående från typiska tentamensuppgifter

OOP Objekt-orienterad programmering

JAVA Mer om klasser och objektorientering

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

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Tentamen OOP

TENTAMEN OOP

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

Klasshierarkier - repetition

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Classes och Interfaces, Objects och References, Initialization

Modeller, Objekt och Klasser

OOP Objekt-orienterad programmering

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

Design av en klass BankAccount som representerar ett bankkonto

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

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

TENTAMEN OOP

Objektorienterad programmering

PROGRAMMERINGSTEKNIK TIN212

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

Föreläsning REPETITION & EXTENTA

2 b) Bodega bodegan = new Bodega(); double moms = 0.235; String namn = "Vargtass"; System.out.println(namn + " " + moms + bodegan.ändra(moms, namn); S

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

Dagens föreläsning. Arrayer och klasser. Medan ni väntar: Gå till m.voto.se/prog11 och svara på några gamla tentamensfrågor! (26 januari 2018 F3 1 )

Arv. Objektorienterad och komponentbaserad programmering

Klasser och objekt. Henrik Johansson. August 20, 2008

Enkla variabler kontra referensvariabel

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

Föreläsning 6. Mer om klasser och objekt. Enkla variabler kontra referensvariabel. Omslagsklassen Integer. Referensvariabler

Namn: Personnr: 1 2D1310 Programmeringsteknik i Java för B,V (1p) 13 januari 2001, kl Hjälpmedel: En Javabok. För betyget godkänt krävs at

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

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

JAVAUTVECKLING LEKTION 11

TENTAMEN OOP

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

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

Objektorienterad programmering i Java

Laboration 3, uppgift En klass för en räknare

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

TUTORIAL: KLASSER & OBJEKT

Tentamen i Grundläggande programmering STS, åk 1 fredag

Föreläsning 11. Arrayer. Arrayer. Arrayer. Lagrar flera värden av samma typ Kan vara primitiva typer eller objekt. Kan ha en array av t.

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

Lab5 för prgmedcl04 Grafik

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

Övningar Dag 2 En första klass

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

LÖSNINGSFÖRSLAG TENTAMEN

OOP Objekt-orienterad programmering

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.

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

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

Tentamen i Programmeringsteknik MN

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

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

Transkript:

Objekt och referenser Antag att vi har följande enkla klass: public class Person { private String namn; private String adress; private String personnummer; public Person() { namn = NN ; adress = ; personnummer = 000000-0000 ; namn = n; adress = a; personnummer = p; public int hämtanamn() { return namn; Vi har då en ritning för hur en person ser ut. Vi kan sedan skapa objekt av typen Person. Då måste vi deklarera en variabel av typ Person och använda new. Då kommer någon av våra konstruktorer att användas. Var gör vi detta? I nåt javaprogram, egentligen var som helst. Vill vi bara testa så är det ofta i en mainmetod. Person hugobald; Vi har nu en variabel av typ Person. Vi har INTE något objekt ännu, dvs ingen person. Det vi sagt är att variabeln hugobald kan bli en person. Detta är en fundamental skillnad mellan de primitiva typerna (int, double mfl) och objekt. int tal; Person lisa; // vi har ett heltal // vi har inte en person // men vi kan skapa en senare public void bytnamn(string nyttnamn) { namn = nyttnamn;... Objekt och referenser 9 October 2003 1 Objekt och referenser 9 October 2003 2 Vi kallar variabler som hugobald och lisa för referenser. En referens är något som kan peka ut något annat, en sorts skylt. I detta fall kan de peka ut ett personobjekt. Vad pekar hugobald på efter att vi gjort Person hugobald; Ingenting, det är en nollreferens och den har det speciella värdet null. Försöker jag nu göra Eftersom det finns två konstruktorer kan jag skapa personer på två olika sätt. hugobald = new Person(); // standard lisa = new Person( Lisa Nilsson, Storgatan, 790212-2342 ); Båda skapar personobjekt men använder olika konstruktorer. Slutresultatet blir ju två olika objekt som är exakt lika bortsett från värdet av instansvariablerna, (namn, adress och personnummer). hugobald.bytnamn( Hugo Bardun ); Så kommer datorn att protestera och säga att du kan ju inte byta namn innan du skapat personen, referensen är null. Objekt och referenser 9 October 2003 3 Objekt och referenser 9 October 2003 4

Vi kan nu se det så här Nu gör jag följande: lisa Lisa Nilsson Storgatan 790212-2342 Person stina; stina = lisa; // en referens // lika som lisa Nu har vi skapat en referens till. Sen har vi tilldelat lisas värde tills stina. Nu kan vi göra: Variabeln lisa refererar ett objekt av typen Person. Själva objektet heter egentligen ingenting. Vill du använda objektet görs det via referensen. lisa.bytnamn( Lisa Svensson ); Std.out.println( Du heter: + stina.hämtanamn()); Svaret blir: Lisa Svensson Ger instansvariabeln namn ett nytt värde. Objekt och referenser 9 October 2003 5 Objekt och referenser 9 October 2003 6 Sen vill vi döpa om personen stina.nyttnamn( Stina Karlsson ); Std.out.println( Du heter: + stina.hämtanamn()); Ger utskriften: Du heter: Stina Karlsson Nu kollar vi vad lisa heter: Std.out.println( Du heter: + lisa.hämtanamn()); När vi döpte om stina så fick tydligen lisa också ett nytt namn??? Det beror på att vi arbetar med referenser. När vi gjorde stina = lisa; så fick vi Datorn säger Du heter: Stina Karlsson lisa stina Lisa Svensson Storgatan 790212-2342 Objekt och referenser 9 October 2003 7 Objekt och referenser 9 October 2003 8

När du gör stina = lisa; så får du INTE nåt nytt objekt. Du säger bara att skylten stina ska peka på samma sak som skylten lisa. Du får två referenser till samma objekt. För att få ett nytt objekt så använder vi new. stina = new Person( Stina Karlsson... Om vi gör så här då? Person filip = new Person( Filip Karlsson, Storgatan, 650912-2312 ); Person hugo = new Person( Hugo Bardun, Kungsgatan, 780423-1234 ); Då blir det ju så här: Då får vi ett nytt objekt som skylten stina pekar ut. Flera referenser till samma objekt kan vara användbart men kan ju också vålla förvirring. filip hugo Filip Karlsson Hugo Bardun Objekt och referenser 9 October 2003 9 Objekt och referenser 9 October 2003 10 Om vi nu gör filip = hugo; så får vi: Det här betyder också att om vi försöker jämföra objekt så är det INTE objekten vi jämför utan referenserna. dvs satsen filip hugo Filip Karlsson Hugo Bardun if (lisa == stina)... Undersöker INTE om objekten är lika, utan bara om skyltarna lisa och stina pekar ut samma objekt. Båda refererar samma objekt. Det första är det ingen som refererar. Det är borttappat. Eftersom det inte heter nåt kan vi inte hitta det. Det kommer att tas bort automatiskt av skräpsamlaren (garbage collector). Objekt och referenser 9 October 2003 11 Objekt och referenser 9 October 2003 12

Eftersom strängar är objekt så blir det samma sak där. String s = Nisse ; String t = Nis ; t =t + se ; if (s == t) Std.out.println( Lika ); else Std.out.println( Olika ); Testar inte om s och t är lika utan testar om s och t pekar ut samma strängobjekt. De är olika här, men strängreferenser kan ibland bli lika om Java är smart. Objekt har ju inte någon ordningsrelation. Hur vet vi om ett personobjekt är mindre än nåt annat objekt? Det gör att <, > mfl inte kan användas på strängar eller andra typer av objekt. För strängar använder vi metoderna equals, compareto, Exempel String s = Nisse ; String t = Nis ; jämför likhet undersöker ordning t =t + se ; if (s.equals(t)) Std.out.println( Lika ); else Std.out.println( Olika ); Ger garanterat utskriften Lika. Objekt och referenser 9 October 2003 13 Objekt och referenser 9 October 2003 14 String s = Nisse ; String t = Putte ; if (s.compareto(t) < 0 ) Std.out.println( s före t ); else if (s.compareto(t) == 0) Std.out.println( Lika ); else Std.out.println( s efter t ); Med före och efter menas i bokstavsordning, eller egentligen i teckenordning. I detta exempel skriver datorn s före t Objekt har ju egentligen inget namn men de kan alltid referera andra objekt via en referens och sig själv via namnet this. Exempelvis kan man göra (men egentligen onödigt) this.namn = n; this.adress = a; this.personnummer = p; this.namn betyder alltså instansvariabeln mitt namn. Objekt och referenser 9 October 2003 15 Objekt och referenser 9 October 2003 16

Man ser ganska ofta public Person(String namn, String adress, String personnummer) { this.namn = namn; this.adress = adress; this.personnummer = personnummer; dvs parametrarna har samma namn som instansvariablerna. Regel: När du använder en variabel så väljer Java den som den senast hittade. Efterson parametrarna hittas sist så kommer exempelvis namn att vara parameterns värde, dvs önskat namn, inte objektets instansvariabel. Den måste jag referera genom this i detta fall. Då blir det alltid instansvariabeln. This kan användas på flera sätt. public Person() { this( NN,, 000000-0000 ); namn = n; adress = a; personnummer = p; Nu kan vi spara arbete genom att låta en konstruktor använda en annan. Här kommer den första att använda den andra konstruktorn och vi spar skrivarbete. Objekt och referenser 9 October 2003 17 Objekt och referenser 9 October 2003 18 En klass definierarju instansvariabler. Varje objekt som skapas får ju en egen uppsättning av dessa. Det ger ju möjlighet att ge varje person ett eget namn, en egen adress så vidare. Ibland vill man ha saker som är gemensamma för alla objekt av en viss typ. Sådana kallas för klassvariabler. I Java anges sådana med attributet static. Exempelvis kan vi införa ett medlemsnummer i personklassen som vi vill ska vara unikt för varje person. Då skapar vi dels en instansvariabel i klassen som är själva numret, dels en klassvariabel som vi hämtar numret från. public class Person { private String namn; private String adress; private String personnummer; private int medlemsnummer; private static int sekvensnummer = 1; public Person() { namn = NN ; adress = ; personnummer = 000000-0000 ); medlemsnummer = sekvensnummer; sekvensnummer++; namn = n; adress = a; personnummer = p; medlemsnummer = sekvensnummer; sekvensnummer++; Objekt och referenser 9 October 2003 19 Objekt och referenser 9 October 2003 20

Varje personobjekt hämtar nu sitt medlemsnummer från klassvariabeln sekvensnummer. Sedan ökas sekvensnumret, vilket gör att nästa objekt får ett nytt medlemsnummer. Klassvariabeln sätts till värdet 1 när klassen skapas, dvs en bara gång. Ett annat exempel kan vara public class Konto { private static double räntesats = 3.5; private String innehavare; private String kontonummer; private double saldo; public Konto () { this( NoName, 00000-000,0); public Konto(String i, String k, double s) { innehavare = i; kontonummer = k; saldo = s; public double hämtaräntesats() { return räntesats; public void ändraräntesats(double nyr) { räntesats = nyr; flera metoder Objekt och referenser 9 October 2003 21 Objekt och referenser 9 October 2003 22 Här är räntesats deklarerad som statisk vilket betyder att den är gemensam för alla konton som vi skapar. Den kan naturligtvis hämtas och ändras som andra instansvariabel, men om du ger den ett nytt värde så kommer det att gälla för alla konton. Saldo m. fl. gäller ju bara just detta konto. Objekt avbildar olika detaljer i en mer eller mindre verklig värld. Genom sina metoder kan vi få dem att utföra någon form av arbete. Tanken med detta är att man ska använda objekt som byggstenar för att skapa mera komplexa objekt som beskriver mer avancerade saker. Objekt och referenser 9 October 2003 23 Objekt och referenser 9 October 2003 24

Om vi exempelvis driver bankverksamhet kan vi skapa ett objekt som innehåller både en person och ett konto. Då får vi ett mer komplext objekt, byggt av enkla byggklotsar. Vår klass har två andra klasser som instansvariabler. Det är huvudtanken med objekt, att man ska kombinera dem till mer avancerade saker. Blir ganska enkelt och överskådligt. public class Kund { Person kund; Konto konto; public Kund(String namn, String adress, String personnummer, String kontonummer, double saldo) { kund = new Person(namn, adress, personnummer); konto = new Konto(namn, kontonummer, saldo); public String hämtanamn() { return kund.hämtanamn(); public void bytnamn(string nyttnamn) { kund.bytnamn(nyttnamn); konto.bytnamn(nyttnamn); Objekt och referenser 9 October 2003 25 Objekt och referenser 9 October 2003 26