Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence s; int i; int j; Sequence s; String s; int i; int j;

Lignende præsentationer


Præsentationer af emnet: "Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence s; int i; int j; Sequence s; String s; int i; int j;"— Præsentationens transcript:

1 Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence s; int i; int j; Sequence s; String s; int i; int j;

2 dIntProg, E12 “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 dIntProg, E12 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; } public class Scope { private int i; public void pip() { i = i + 1; } String i;

4 dIntProg, E12 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 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; } 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, E12 Tre slags variabler Feltvariabler Parametre Lokale variabler Field variables, parameters, and local variables

6 dIntProg, E12 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; } 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; }

7 dIntProg, E12 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(); } public void addDays(int d) { for ( int i=0; i<d; i++ ) { setToNextDate(); }

8 dIntProg, E12 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() { x = x++; // error! int x = 0; x++; }

9 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); } 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, E12 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

10 public void pip() { i = j; // Fejl, j virker ikke her! int j = 0;... { i++; System.out.println(i); j++; System.out.println(j); }... } public void pip() { i = j; // Fejl, j virker ikke her! int j = 0;... { i++; System.out.println(i); j++; System.out.println(j); }... } dIntProg, E12 Et navn virker i indre blokke Hvad er virkefeltet for int j ? Virkefelt for j

11 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; } 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, E12 Og dog... Hvad sker der når vi oversætter (og evt. afvikler) følgende program?

12 dIntProg, E12 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; } 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

13 dIntProg, E12 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 dIntProg, E12 Kontrolvariabel i for-løkke svarer til Konstruktionen for (int j=0; j<4; j++) { System.out.println(j); } for (int j=0; j<4; j++) { System.out.println(j); } { int j; for (j=0; j<4; j++) { System.out.println(j); } { int j; for (j=0; j<4; j++) { System.out.println(j); }

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

16 Sådan!


Download ppt "Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence s; int i; int j; Sequence s; String s; int i; int j;"

Lignende præsentationer


Annoncer fra Google