160 likes | 270 Views
Virkefeltsregler i Java. int i;. int i;. int j;. int k;. Sequence s;. i = i+j;. int j;. String t;. Sequence s;. int i;. String s;. int j;. “ What ’ s in a name? ”. Brian spillede blændende i søndags! Skolen ligger i Viby Ring til Kirsten og sig at ...
E N D
Virkefeltsregler i Java int i; int i; int j; int k; Sequence s; i = i+j; int j; String t; Sequence s; int i; String s; int j;
“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!
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;
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
Tre slags variabler • Feltvariabler • Parametre • Lokale variabler public class Date { private intday; private intmonth; private intyear; public void addDays(intd) { for ( inti=0; i<d; i++ ) { setToNextDate(); } } private intdaysInMonth() { int[] daysInMonth = {0,31,28,...}; intres; res = daysInMonth[month]; // special case: .. if (month == 2 && isInLeapYear()) { res++; } return res; } } Field variables, parameters, and local variables
Feltvariabler publicclass Scope { public Scope() { i = 0; } public voidaddOne() { i = i + 1; } inti; public voidaddTwo() { i = i + 2; } public int value() { return i; } } En klasse definerer et navnerum hvor alle navne erklæret i klassen er tilgængelige overalt i klassen (med mindre...).
Parametre public void addDays(int d) { for ( int i=0; i<d; i++ ) { setToNextDate(); } } En metode definerer et navnerum hvor parametre til metoden er tilgængelige overalt i metoden (med mindre...).
Lokale variabler public void pip() { x = x++; // error! intx = 0; x++; } 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.
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). public void pip() { inti = 0; { i++; System.out.println(i); intx = 0; x = i; x++; i++; System.out.println(x); } System.out.println(i); } Virkefelt for x
Et navn virker i indre blokke Hvad er virkefeltet for int j ? public void pip() { i = j; // Fejl, jvirkerikke her! intj = 0; ... { i++; System.out.println(i); j++; System.out.println(j); } ... ... } Virkefelt for j
Og dog... Hvad sker der når vi oversætter (og evt. afvikler) følgende program? public class Scope { public Scope() { i = 0; } public void pip() { i++; { i++; System.out.println(i); inti = 0; i++; System.out.println(i); } } public static voidtestMethod() { Scope s = new Scope(); s.pip(); } inti; }
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); inti = 0; i++; System.out.println(i); } } public static voidtestMethod() { Scope s = new Scope(); s.pip(); } inti; } Virkefelt for indre i Virkefelt for ydre i
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.
Kontrolvariabel i for-løkke Konstruktionen for (intj=0; j<4; j++) { System.out.println(j); } svarer til { intj; for (j=0; j<4; j++) { System.out.println(j); } }
Hvilken variabel? • 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 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();