virkefeltsregler i java -...
Post on 06-Mar-2018
228 Views
Preview:
TRANSCRIPT
Virkefeltsregler i Java int i;
int k;
int j;
Sequence s;
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!
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;
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
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
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; } }
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(); } }
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++; }
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
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
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?
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
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.
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); } }
• 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
dIntProg, E13
Sådan!
top related