1 / 16

Virkefeltsregler i Java

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 ...

elmer
Download Presentation

Virkefeltsregler i Java

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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;

  2. “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!

  3. 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;

  4. 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

  5. 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

  6. 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...).

  7. 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...).

  8. 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.

  9. 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

  10. 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

  11. 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; }

  12. 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

  13. 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.

  14. 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); } }

  15. 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();

  16. Sådan!

More Related