Föreläsning 6: Metoder och fält (arrays)

Slides:



Advertisements
Liknande presentationer
Föreläsning 9 Programmeringsteknik och Matlab 2D1312/2D1305
Advertisements

Avlusning Debugger (”avlusare”) Breakpoints Watch.
Array Skriv ett program som frågar följande: ”Hur många tal vill du mata in?” användaren matat in ett tal t.ex n. då frågar programmet n ggr följande.
Funktioner och programorganisation
Next previous Internetprogrammering 2000 Internetprogrammering 2000 Föreläsning 10 Distribuerad programmering med Javas RMI, Remote Method Invocation.
Metoder i java Det finns två typer av metoder i java
Programmeringsteknik för K och Media
Föreläsning 13 Allt om tentan. Sistaminutenhjälp: På fredag 17 december kl 12 sitter Linda i kemi-fiket och svarar på frågor.
Programkodens uppbyggnad
Föreläsning 6 Referenser Objekt som parametrar public/private Klassvariabler och klassmetoder.
1 Föreläsning 6 Klass Object, instans av klass public/private Klassvariabler och klassmetoder.
Exception Handling Kapitel 9. Agenda Exceptions try, throw and catch Skapa en egen exception-klass Multipla throw / catch Slänga vidare en exception Olika.
i olika programmeringsspråk
Föreläsning 4, Kapitel 4 Gruppera objekt Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael Kölling.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser och instansvariabler -Tabeller av klassobjekt.
Föreläsning 11 Arrayer.
OOP F4:1 Marie Olsson OOP Objekt-orienterad programmering Föreläsning 4 Metoder klass-metoder instans-metoder.
Programmering i C# 3. Klasser.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 6 ( ) INNEHÅLL: -Mera om tabeller.
int res2=Math.max(tal1,tal2);
Föreläsning 2 Kort Översikt Över Javaspråket. Källkodsformat Unicode används åäöμψζ tillåtna Inte alla miljöer klarar av det Källkod Bytekod Java VM för.
Vektorer (klassen Vector) Sortering
Programmeringsteknik för Media1 & K1
OOP F6:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 6 Mer om klasser och objekt Hantera många objekt ArrayList toString() – metoden.
OOP F3:1 Marie Olsson OOP Objekt-orienterad programmering Föreläsning 3 Iteration Många variabler av samma sort – Arrayer.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Metoder -Lokala variabler -Mera om klasser: -Nyckelorden.
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Föreläsning 5 Arrayer & ArrayList Hur man använder API:n
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 5 ( ) INNEHÅLL: -Metoder.
F4 - Funktioner & parametrar 1 Programmeringsteknik, 4p vt-00 Modularisering ”svarta lådor” Väl definierade arbetsuppgifter Enklare validering Enklare.
Föreläsning 12 Om slutprovet. Repetition –deklaration av variabler –skapande av objekt (instansiering) –Vektorer och Vector-klassen –Klasser –Instans-/klassvariabler.
Föreläsning 4 Klasser Och Objekt.
Föreläsning 4 programmeringsteknik och Matlab 2D1312/ 2D1305
ITK:P1 Föreläsning 2 Introduktion till objektorientering DSV Marie Olsson.
INTRODUKTION TILL PROGRAMMERING
Class VattenKraft{ public static void main(String[] args){ int num=150; int i, totflöde, maxflöde; int[] fall = new int[num]; //vattenflödet i vattenfallen.
OOP F13:1 Marie Olsson OOP Objekt-orienterad programmering Föreläsning 13 Repetition variabler, selektion och iteration.
OOP F2:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 2 Deklaration och tilldelning Programsatser Tilldelning Input/Output Selektion.
Anders Sjögren Deklarationsområde och funktioner.
Föreläsning 17 Repetition. Källkodsformat Unicode används åäöμψζ tillåtna i namn på identifierare Inte alla miljöer klarar av det Källkod Bytekod Java.
TILLÄMPAD DATALOGI (TILDA) Övningsgrupp 2 Marcus Hjelm
OOP F5:1 Stefan Möller OOP Objekt-orienterad programmering Föreläsning 5 Klasser och objekt Skapa objekt - new Referenser Konstruktorer Inkapsling.
Övning2 programmeringsteknik och Matlab 2D1312/ 2D1305
Övning 3. Repetition Metoder class RepetitionMetoder { public static void main(String [] args) double längd = 2.0; double bredd = 1.0; double area =
Föreläsning 5 Objekt Klasser Konstruktorer Metoder Minnesbilder av objekt.
Programmeringsteknik för K och Media
Föreläsning 7 Repetition Sammansatta datatyper –vektor (hakvektor, array) –matris.
1 Föreläsning 2 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Föreläsning4 Repetition slingor Metoder. while-sats består av följande delar: 1. while 2. Villkor-sats (condition) 3. uttryck (statement) while-sats int.
OOP&M - teori1 OOP – Föreläsning 7 (Sista oop I) Konstruktioner för att hantera upprepningar Kapitel 11.
1 Föreläsning 4 Metoder & parametrar Array API och klassen ArrayList.
Malmö högskola Rolf Axelsson 2003/2004 DA7231, 4 poäng Referensvariabel Klass och konstruktorer Klass med set- och get-metoder Klass och fält Fler metoder.
Föreläsning 3 Väsentliga delar i ett Javaprogram Input i paketet extra
Hypotesprövning. Statistisk hypotesprövning och hypotetisk-deduktiv metod Hypotetisk-deduktiv metod: –Hypotes: Alla svanar är vita. –Empirisk konsekvens:
Kap 1 - Algebra och funktioner
Så fungerar en dator Mental bild av en dator
Föreläsning 2 Programmeringsteknik DD1310
Föreläsning 3: Booleans, if, switch
Föreläsning 4: for, while, do-while
Föreläsning 11: Rekursion
Föreläsning 8: Exempel och problemlösning
Föreläsning 12: Exempel och problemlösning
Innehåll: Arrays Arraylists For loops For-each loops
Föreläsning 2: Typer, klasser, tilldelning
Föreläsning 9: Arv och UML
Föreläsning 5: Att använda klasser & objekt
Kan du begreppen? Para ihop rätt begrepp med rätt beskrivning. Algoritm Precis Program Är ett annat ord för exakt, tydlig eller noggrant. Är klara och.
Algoritmer och datastrukturer, förel. 1
Repetitionsföreläsning 1: Lite rekursion & problemlösning
Presentationens avskrift:

Föreläsning 6: Metoder och fält (arrays) TDA 545: Objektorienterad programmering Magnus Myréen Chalmers, läsperiod 1, 2015-2016

I (föregående och) denna föreläsning Läsanvisning: kap 2 & 13 meddelanden och metoder informationsdöljande och inkapsling skapa och använda färdiga objekt ! primitiva variabler kontra objektvariabler 3 tester på likhet metoder fält (arrays) Nästa föreläsning handlar om Att skriva egna klasser.

Metoder! Metoder = funktioner i Java Definition av en metod: public static double medel(int v1, int v2) { return (v1+v2)/2.0; } // end medel

metodhuvud, funktionshuvud, signature Metoder! Metoder = funktioner i Java metodhuvud, funktionshuvud, signature Definition av en metod: public static double medel(int v1, int v2) { return (v1+v2)/2.0; } // end medel

Metoder! Metoder = funktioner i Java Definition av en metod: public static double medel(int v1, int v2) { return (v1+v2)/2.0; } // end medel metodens kropp

Metoder! Metoder = funktioner i Java Definition av en metod: modifierare modifierare Definition av en metod: public static double medel(int v1, int v2) { return (v1+v2)/2.0; } // end medel

Metoder! Metoder = funktioner i Java Definition av en metod: returvärdets typ Definition av en metod: public static double medel(int v1, int v2) { return (v1+v2)/2.0; } // end medel

Metoder! Metoder = funktioner i Java Definition av en metod: metodens namn Definition av en metod: public static double medel(int v1, int v2) { return (v1+v2)/2.0; } // end medel

Metoder! Metoder = funktioner i Java Definition av en metod: formell parametrar formell parametrar Definition av en metod: public static double medel(int v1, int v2) { return (v1+v2)/2.0; } // end medel

Metoder! Metoder = funktioner i Java Definition av en metod: public static double medel(int v1, int v2) { return (v1+v2)/2.0; } // end medel retur värdet

Metoder! Metoder = funktioner i Java Definition av en metod: metodens namn returvärdets typ formell parameter modifierare modifierare formell parameter Definition av en metod: public static double medel(int v1, int v2) { return (v1+v2)/2.0; } // end medel retur värdet Metodens resultat kan vara av vilken typ som helst, även en klass. aktuell parameter Anrop t.ex. int c = 52; int a = 10; double medel1, medel2; medel1 = medel(5, 10); medel2 = medel(a, c);

En klass med två metoder import java.util.Scanner; public class EnkelMatematik { public static double medel(double v1,double v2) { return (v1 + v2)/2.0; } // end medel; public static void main(String[] args){ Scanner myInput = new Scanner(System.in); double tal1, tal2, mv; System.out.println("Ange 2 tal"); tal1 = myInput.nextDouble(); tal2 = myInput.nextDouble(); mv = medel(tal1, tal2); System.out.print("Medelvärdet är: "); System.out.println(mv); } // end main } // end EnkelMatematik

Evaluering av metodanropet public static double medel(double v1,double v2) { return (v1 + v2)/2.0; } // end medel; mv = medel(tal1,tal2); System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 namn: tal2 15.0

Evaluering av metodanropet public static double medel(double v1,double v2) { return (v1 + v2)/2.0; } // end medel; mv = medel(tal1,tal2); System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 namn: tal2 15.0

Evaluering av metodanropet public static double medel(double v1,double v2) { return (v1 + v2)/2.0; } // end medel; mv = medel(tal1,tal2); System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 namn: tal2 15.0

Evaluering av metodanropet public static double medel(double v1,double v2) { return (v1 + v2)/2.0; } // end medel; mv = medel(25.0,tal2); System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 namn: tal2 15.0

Evaluering av metodanropet public static double medel(double v1,double v2) { return (v1 + v2)/2.0; } // end medel; mv = medel(25.0,tal2); System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 namn: tal2 15.0

Evaluering av metodanropet public static double medel(double v1,double v2) { return (v1 + v2)/2.0; } // end medel; mv = medel(25.0,15.0); System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 namn: tal2 15.0

Evaluering av metodanropet public static double medel(double v1,double v2) { return (v1 + v2)/2.0; } // end medel; mv = medel(25.0,15.0); System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 namn: tal2 15.0

Evaluering av metodanropet public static double medel(double v1,double v2) { return (v1 + v2)/2.0; } // end medel; namn: v1 typ: double 25.0 namn: v2 15.0 de formella parametrarna är vanliga variabler för metoden … utgångs värdena får de från metod anropet … utgångsvärdena får de från metodanropet. mv = medel(25.0,15.0); System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 namn: tal2 15.0

Evaluering av metodanropet return (v1 + v2)/2.0; namn: v1 typ: double 25.0 namn: v2 15.0 mv = medel(25.0,15.0); System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 namn: tal2 15.0

Evaluering av metodanropet return (v1 + v2)/2.0; namn: v1 typ: double 25.0 namn: v2 15.0 mv = medel(25.0,15.0); System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 namn: tal2 15.0

Evaluering av metodanropet return (v1 + v2)/2.0; namn: v1 typ: double 25.0 namn: v2 15.0 mv = medel(25.0,15.0); System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 namn: tal2 15.0

Evaluering av metodanropet return (25.0 + 15.0)/2.0; namn: v1 typ: double 25.0 namn: v2 15.0 mv = medel(25.0,15.0); System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 namn: tal2 15.0

Evaluering av metodanropet return (40.0)/2.0; namn: v1 typ: double 25.0 namn: v2 15.0 mv = medel(25.0,15.0); System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 namn: tal2 15.0

Evaluering av metodanropet return 20.0; namn: v1 typ: double 25.0 namn: v2 15.0 mv = medel(25.0,15.0); System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 namn: tal2 15.0

Evaluering av metodanropet return 20.0; mv = medel(25.0,15.0); System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 namn: tal2 15.0

Evaluering av metodanropet return 20.0; mv = 20.0; System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 namn: tal2 15.0

Evaluering av metodanropet mv = 20.0; System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 typ: double 15.0 namn: tal2

Evaluering av metodanropet mv = 20.0; System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double namn: tal1 typ: double 25.0 typ: double 15.0 namn: tal2

Evaluering av metodanropet System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double 20.0 namn: tal1 typ: double 25.0 typ: double 15.0 namn: tal2

Evaluering av metodanropet System.out.print("Medelvärdet är: "); System.out.println(mv); namn: mv typ: double 20.0 namn: tal1 typ: double 25.0 typ: double 15.0 namn: tal2

Evaluering av metodanropet System.out.println(mv); namn: mv typ: double 20.0 namn: tal1 typ: double 25.0 Utskrift: typ: double "Medelvärdet är: " 15.0 namn: tal2

Evaluering av metodanropet System.out.println(mv); namn: mv typ: double 20.0 namn: tal1 typ: double 25.0 Utskrift: typ: double "Medelvärdet är: " 15.0 namn: tal2

Evaluering av metodanropet System.out.println(20.0); namn: mv typ: double 20.0 namn: tal1 typ: double 25.0 Utskrift: typ: double "Medelvärdet är: " 15.0 namn: tal2

Evaluering av metodanropet namn: mv typ: double 20.0 Koden har kört klart namn: tal1 typ: double 25.0 Utskrift: typ: double "Medelvärdet är: 20.0\n” 15.0 namn: tal2

Parameteröverföring namn: v1 namn: v2 namn: mv typ: double namn: tal1 nya lokala variabler skapas mv = medel(25.0,15.0); System.out.print("Medelvärdet är: "); System.out.println(mv); namn: tal1 typ: double 25.0 namn: tal2 15.0 namn: v1 namn: v2 public static double medel(double v1,double v2) { return (v1 + v2)/2.0; } // end medel; namn: mv de formella parametrarna är vanliga variabler för metoden … utgångs värdena får de från metod anropet … utgångsvärdena får de från metodanropet. I Java överförs alltid parametrarna via värdeanrop dvs värdet av den aktuella parametern kopieras över till den formella parametern.

Metoder = funktioner och procedurer “Använd en funktion om du kan, en procedur om du måste.” Funktioner beräknar värden. De utvidgar uttrycksdelen av språket. Ett funktionsanrop: är ett uttryck och har en returtyp (dvs inte void) beräknas till ett värde som returneras. mv = medel(tal1, tal2); Procedurer utför åtgärder. De utvidgar satsdelen av språket. Ett proceduranrop: är ett sats returnerar inget värde (returtyp = void) System.out.print("Störst är: ");

Synbarhet (Scope) En variabel/metod “syns” från det den deklareras tills dess att blocket den deklarerats i tar slut. int global = 4; if (<villkor>) { int local = 3; // här finns local och global ... } else { // här finns inte local // men global finns } static double sqr(double x){ double tmp = x*x; // här finns tmp och x return tmp; } // här finns inte tmp och inte x

Overloading (Överlagring) Två eller flera metoder kan ha samma namn om dom skiljer sig åt i sina parametrar. public static int max(int a, int b) { if (a > b) { return a; } else { return b; } public static int max(int a, int b, int c) { return max(a,max(b,c)); public static double max(double a, double b) { if (a > b) ...

Att vända på en sträng (igen!) Uppgift: Skriv en metod som vänder om en sträng. Exempel: “Hello!” bör bli “!olleH” Tips: Gör så här: str är "Hello!", result är "" str är "ello!", result är "H" str är "llo!", result är "eH" str är "lo!", result är "leH" str är "o!", result är "lleH" str är "!", result är "olleH" str är "", result är “!olleH"

Fält, vektorer, matriser, arrays ett fält = ett ‘block’ av värden 1 2 3 4 5 6 7 referensvärde typ: int[] namn: temp temp[2] har numrerade komponenter komponenterna selekteras med index av diskret typ indexeras från noll till length-1 alla komponenter är av samma typ komponenterna kan vara objekt

Att skapa fält Deklarera ett fält med 8 heltal: int[] temp = new int[8]; int[] temp = {6,7,3,7,1,7,2,9}; … eller deklaration och ‘snabbtilldelning’ med array initializer referensvärde 6 1 2 3 4 5 7 9 temp = {6,7,3,7,1,7,2,9}; Obs. sådan tilldelning fungerar endast i deklaration, detta går ej:

Tilldelning av fältvärden Innan: 1 2 3 4 5 6 7 referensvärde namn: temp typ: int[] 6 7 3 7 1 7 2 9 temp[1] = 8; Uppdatering av ett fältvärde: referensvärde namn: temp typ: int[] Efter: 6 8 3 7 1 2 9 4 5

Tilldelning av fältvärden Innan: 1 2 3 4 5 6 7 referensvärde namn: temp typ: int[] 6 7 3 7 1 7 2 9 fältet längd, går ej att ändra for(int i = 0; i < temp.length; i++){ temp[i] = 2*temp[i]; } Uppdatering av alla fältvärden: referensvärde namn: temp typ: int[] Efter: 12 14 6 2 4 18 1 3 5 7

Läsning av fältvärden 1 2 3 4 5 6 7 referensvärde namn: temp 1 2 3 4 5 6 7 referensvärde namn: temp typ: int[] 6 7 3 7 1 7 2 temp[3] Läsning av ett fältvärde: ändrar inte fältet int n = temp[3]; n får värdet 7 något heltalsuttryck

Bearbeta fältets värden Antag: int[] temp = new temp[8]; Mycket vanligt mönster: for(int i = 0; i < temp.length; i++) { här: kod som bearbeta enskilda fältvärden med temp[i] t.ex. har tilldelning temp[i] = … temp[i] … }

Vad gör denna loop? Den fyller fältet med ettor. for (int i = 0; i < temp.length; i++) { temp[i] = 1; } Den fyller fältet med ettor.

Vad gör denna loop? Den multiplicerar alla element med 2 for (int i = 0; i < temp.length; i++) { temp[i] = temp[i] * 2; } Den multiplicerar alla element med 2

Vad gör denna loop? Den räknar hur många element < 10 int antal = 0; // i, j är vanliga namn på loop-index for (int i = 0; i < temp.length; i++) { if (temp[i] < 10) { antal = antal + 1; } // Här innehåller antal antalet element <10 Den räknar hur många element < 10

Uppgift Summera innehållet i ett fält.

Fält och metoder Summera innehållet i ett fält: int sum = 0; for (int i = 0; i < arr.length; i++) { sum = sum + arr[i]; } System.out.println(sum);

Fält och metoder Summera innehållet i ett fält i en metod: public static int sumArray(int[] arr) { int sum = 0; for (int i = 0; i < arr.length; i++) { sum = sum + arr[i]; } return sum;

returnerar det nya fältet Fält och metoder Skapa fält genom att anropa en metod… returtyp: ett fält skapar ett fält public static int[] fillArray(int size) { int[] tmp = new int[size]; for (int i = 0; i<tmp.length; i++) { tmp[i] = i; // eller nåt } return tmp; returnerar det nya fältet Loopar som dessa ska ni kunna skriva i sömnen… Öva! … dvs programmera, programmera, programmera.

Kopiera ett fält int[] f1 = {0,1,2,3,4,5}; int[] f2 = new int[6]; f2 = f1; // blir INTE som du tänkt vad händer?

Kopiera ett fält Man måste kopiera element för element: int[] f1 = {0,1,2,3,4,5}; int[] f2 = new int[6]; f2 = f1; // blir INTE som du tänkt vad händer? for (int i = 0; i < f1.length; i++) { f2[i] = f1[i]; } Man måste kopiera element för element: vad händer om metoden kör tilldelning av arr? static int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; for (int i=0; i<arr.length; i++){ tmp[i] = arr[i]; } return tmp; Ofta gör man detta i en metod: hur fungerar parameter- överföringen? f2 = copyArray(f1); … och anrop

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return tmp; } f2 = copyArray(f1);

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return tmp; } f2 = copyArray(f1);

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return tmp; } f2 = copyArray(f1); 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] null namn: f2

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return tmp; } f2 = copyArray(f1); 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] null namn: f2

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return tmp; } f2 = copyArray( ); 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] null namn: f2

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return tmp; } f2 = copyArray( ); 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] null namn: f2

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return tmp; } f2 = copyArray( ); typ: int[] namn: arr 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] null namn: f2

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return tmp; } f2 = copyArray( ); typ: int[] namn: arr 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] null namn: f2

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return tmp; } f2 = copyArray( ); typ: int[] namn: arr 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] null namn: f2

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) 1 2 3 4 5 6 7 int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return tmp; } f2 = copyArray( ); typ: int[] namn: tmp typ: int[] namn: arr 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] null namn: f2

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) 1 2 3 4 5 6 7 int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return tmp; } f2 = copyArray( ); typ: int[] namn: tmp typ: int[] namn: arr 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] null namn: f2

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) 1 2 3 4 5 6 7 int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return tmp; } f2 = copyArray( ); typ: int[] namn: tmp 1 5 3 typ: int[] namn: arr 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] null namn: f2

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) 1 2 3 4 5 6 7 int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return tmp; } f2 = copyArray( ); typ: int[] namn: tmp 1 5 3 typ: int[] namn: arr 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] null namn: f2

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) 1 2 3 4 5 6 7 int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return ; } f2 = copyArray( ); typ: int[] namn: tmp 1 5 3 typ: int[] namn: arr 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] null namn: f2

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) 1 2 3 4 5 6 7 int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return ; } f2 = copyArray( ); 1 5 3 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] null namn: f2

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) 1 2 3 4 5 6 7 int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return ; } f2 = copyArray( ); 1 5 3 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] null namn: f2

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) 1 2 3 4 5 6 7 int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return tmp; } f2 = ; 1 5 3 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] null namn: f2

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) 1 2 3 4 5 6 7 int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return tmp; } f2 = ; 1 5 3 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] null namn: f2

Parameteröverföring “Värdet av den aktuella parametern kopieras över till den formella parametern.” Regeln var: … i detta fall var är parametern ett referensvärde (dvs en pil) 1 2 3 4 5 6 7 int[] f1 = {1,5,3,7,4,5,....}; int[] f2 = null; int[] copyArray(int[] arr) { int[] tmp = new int[arr.length]; ... kopiera ... return tmp; } f2 = copyArray(f1); 1 5 3 1 2 3 4 5 6 7 1 5 3 namn: f1 typ: int[] typ: int[] namn: f2

Är fält “objekt” eller primitiva? annan syntax än andra objekt “klassen” har inget namn utan bildas genom ta namn och lägga till [] du kan inte ärva fält du kan inte definiera egna metoder och lägga till klassen längden är en variabel, inte en funktion Några skäl mot: språkdefinitionen säger att dom är det fält är referenstyper (har referensvärde) allokeras med “new …” allokeras på heapen förälderklassen är Object och Object klassens metoder fungerar Några saker som talar för att dom är det: Så de är objekt, men lite speciella objekt.

Vanligaste felen med fält “null pointer exception” int[] f1 = {0,1,2,3,4,5}; int[] f2; for (i = 0; i < f1.length; i++) { f2[i] = f1[i]; } Test.java:10: variable f2 might not have been initialized f2[i] = f1[i]; ^ 1 error f2 = f1; // fungerar men ...

Vanligaste felen med fält (fort.) “array index out of bounds” går ett steg för långt double sum = 0.0; for (i = 0; i <= f1.length; i++) { sum = sum + f1[i]; }

Vanligaste felen med fält (fort.) Man glömmer att kolla om indata är null… static int firstElement(int[] arr) { return arr[0]; } Bättre: static int firstElement(int[] arr) { if (arr == null) { throw new IllegalArgumentException("empty array"); } else { return arr[0]; }

Vanligaste felen med fält (fort.) Man glömmer att kolla om indata är null… static int firstElement(int[] arr) { return arr[0]; } Ännu bättre: static int firstElement(int[] arr) { if (arr == null) { throw new IllegalArgumentException("empty array"); } else if (arr.length < 1) { } else { return arr[0]; }

Flerdimensionella fält (matriser) Är fält med fält som värden. Raderna behöver inte vara lika långa. int[][] m = new int[3][6]; for (int i=0; i< m.length; i++) { for (int j=0; j < m[i].length; j++) { m[i][j] = 0; } 0 0 0 0 0 0 int[][] m2 = { {1, 2, 3, 4, 5, 6}, {1, 1, 1, 1}, {6, 5, 4, 3, 2, 1} };

Uppgift Skriv kod som vänder om alla element i ett fält (dvs array). 1 6 1 2 3 4 7 8 Före: Efter:

skall bli: