16
Virkefeltsregler i Java int i; int k; int j; Sequence s;

Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

Embed Size (px)

Citation preview

Page 1: Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

Virkefeltsregler i Java int i;

int k;

int j;

Sequence s;

Page 2: Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

dIntProg, E13

“What’s in a name?” –  Brian spillede blændende i søndags! –  Skolen ligger i Viby –  Ring til Kirsten og sig at ...

•  Et navn fortolkes i en kontekst og konteksten er med til at definere navnets betydning.

•  Beskeden “Ring til Kirsten og sig at ...” fortolkes vidt forskelligt på arbejde og hjemme!

Page 3: Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

dIntProg, E13

Navne i Java

Hvad betyder følgende?

i = i + 1;

Det kommer an på hvilken af følgende erklæringer der gælder:

public class Scope { private int i; public void pip() { i = i + 1; } }

String i;

Page 4: Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

dIntProg, E13

Erklæringer i Java

•  Reglen i Java er at alle navne skal erklæres (eller importeres) før de kan bruges –  Eneste undtagelse er navne fra java.lang der automatisk

importeres til alle filer (String, Math, Thread, ...)

•  Navne kan erklæres i filer (gælder dog kun navne på klasser), i klasser og i metoder –  I denne sammenhæng skal vi indskrænke os til at betragte

navne på variabler (herunder parametre) erklæret i klasser og metoder

•  Forskel på klasser og metoder –  Som vi skal se i det følgende, er der lidt forskel på reglerne for

variabler erklæret i klasser og variabler erklæret i (blokke i) metoder

Page 5: Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

public class Date { private int day; private int month; private int year; public void addDays(int d) { for ( int i=0; i<d; i++ ) { setToNextDate(); } } private int daysInMonth() { int[] daysInMonth = {0,31,28,...}; int res; res = daysInMonth[month]; // special case: .. if (month == 2 && isInLeapYear()) { res++; } return res; } } dIntProg, E13

Tre slags variabler •  Feltvariabler

•  Parametre

•  Lokale variabler

Field variables, parameters, and local variables

Page 6: Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

dIntProg, E13

Feltvariabler

En klasse definerer et navnerum hvor alle navne erklæret i klassen er tilgængelige overalt i klassen (med mindre...).

public class Scope { public Scope() { i = 0; } public void addOne() { i = i + 1; } int i; public void addTwo() { i = i + 2; } public int value() { return i; } }

Page 7: Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

dIntProg, E13

Parametre

En metode definerer et navnerum hvor parametre til metoden er tilgængelige overalt i metoden (med mindre...).

public void addDays(int d) { for ( int i=0; i<d; i++ ) { setToNextDate(); } }

Page 8: Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

dIntProg, E13

Lokale variabler

I en metode (funktion) definerer en blok {...} et navnerum hvor alle navne erklæret i blokken er tilgængelige efter erklæringen og indtil blokkens afslutning.

public void pip() { x = x++; // error! int x = 0; x++; }

Page 9: Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

public void pip() { int i = 0; { i++; System.out.println(i); int x = 0; x = i; x++; i++; System.out.println(x); } System.out.println(i); }

dIntProg, E13

Indre blokke

I en blok kan man erklære indre blokke { { ... } }. Reglen for indre blokke er den samme som reglen for blokke i metoder (forrige slide).

Virkefelt for x

Page 10: Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

public void pip() { i = j; // Fejl, j virker ikke her! int j = 0; ... { i++; System.out.println(i); j++; System.out.println(j); } ... ... }

dIntProg, E13

Et navn virker i indre blokke

Hvad er virkefeltet for int j ?

Virkefelt for j

Page 11: Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

public class Scope { public Scope() { i = 0; } public void pip() { i++; { i++; System.out.println(i); int i = 0; i++; System.out.println(i); } } public static void testMethod() { Scope s = new Scope(); s.pip(); } int i; }

dIntProg, E13

Og dog... Hvad sker der når vi oversætter (og evt. afvikler) følgende program?

Page 12: Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

dIntProg, E13

En forklaring på “(med mindre...)”

Hvad er virkefelterne for de to int i’er ?

public class Scope { public Scope() { i = 0; } public void pip() { i++; { i++; System.out.println(i); int i = 0; i++; System.out.println(i); } } public static void testMethod() { Scope s = new Scope(); s.pip(); } int i; }

Virkefelt for ydre i Virkefelt for

indre i

Page 13: Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

dIntProg, E13

Virkefeltsregler i Java

•  En variabel erklæret i en klasse virker overalt i klassen med undtagelse af –  virkefeltet for eventuelle ens-benævnte variabler erklæret i

(blokke i) klassens metoder.

•  En variabel erklæret i en blok virker overalt i blokken med undtagelse af –  den del af blokken der går forud for erklæringen –  virkefeltet for eventuelle ens-benævnte variabler erklæret i

indre blokke i blokken.

Page 14: Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

dIntProg, E13

Kontrolvariabel i for-løkke

svarer til

Konstruktionen

for (int j=0; j<4; j++) { System.out.println(j); }

{ int j; for (j=0; j<4; j++) { System.out.println(j); } }

Page 15: Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

•  Antagelse: Feltvariable er erklæret øverst i klasse •  Metode: Gå op og ud indtil en erklæring nås

•  Scope gælder fra erklæring til blok-slut

Hvilken variabel?

public class Scope { private int i; public Scope (int i) { i = i + 1; System.out.println(“a “ + i); } public void foo() { System.out.println(“b “ + i); for (int i = 0; i < 3; i ++){ System.out.println(“c “ + i); } System.out.println(“d “ + i); } } new Scope(1).foo();

dIntProg, E13

Page 16: Virkefeltsregler i Java - users-cs.au.dkusers-cs.au.dk/mic/dIntProg/e13/uge/4/Slides/12-virkefelt.pdf · Navne i Java Hvad betyder følgende? ... Det kommer an på hvilken af følgende

dIntProg, E13

Sådan!