Forelæsning 4.2 • Klassevariabler og klassemetoder • Levetid for variabler og parametre • Virkefeltsregler • Afleveringsopgave 5.1 dIntProg, E14 Klassevariabler og klassemetoder • Instansvariabler og instansmetoder (non-static) – Ethvert objekt har sin egen version af feltvariabler – Kald af en metode er en besked sendt til et objekt • Det er imidlertid muligt at erklære feltvariabler og metoder som tilhører klassen – Klassevariabler og klassemetoder erklæres med keywordet static – Klassevariabler bruges til at modellere egenskaber for klassen, f.eks.: myndighedsalder for personer, fælles rentesats for alle konti – Klassemetoder bruges til at modellere operationer der er uafhængige af objekters tilstande • Hvor har I mødt klassemetoder? dIntProg, E14 Eksempel på statics public class Account { private static double interestRate; private int balance; private Person owner; public static void setInterestRate (double rate) { interestRate = rate; } public void addInterest() { balance = (int) (balance * interestRate); } ... } dIntProg, E14 Eksempler fra java.lang.Math public class Math konstant (kan ikke ændres) { public static final double PI = 3.141592653589793 ... /** 0.0 ≤ random() < 1.0 */ public static double random() {...} /** sqrt(a) == a */ public static double sqrt(double a) {...} /** pow(a,b) == ab */ public static double pow(double a, double b) {...} ... } dIntProg, E14 Kald af klassemetoder • Klassemetoder kaldes via klassen Math.PI; Math.random(); Account.setInterestRate(1.10); • Kan kaldes via objekt, men det er dårlig stil Math mathObject = new Math(); double d = mathObject.random(); • Kald via objekt kan være yderst forvirrende Account myAccount = new Account(...); myAccount.setInterestRate(1.10); interestRate ændres for alle konti dIntProg, E14 Hvad har metoder tilgang til at bruge? Adgang til variabler / metoder almindelig static almindelig + + static – + Metodekald • Klassemetoder har kun adgang til klassevariable og klassemetoder dIntProg, E14 Levetid for variabler og parametre • Feltvariabler – modellerer tilstand for objekter – levetid er den samme som objektets • Lokale variabler – hjælpevariabler i en metode/konstruktør – levetid er metodekaldet • Parametre – parametrisering af metode/konstruktør – levetid er metodekaldet – lokale variabler hvor startværdien leveres af kalderen • Klassevariabler – programudførelsen dIntProg, E14 Virkefeltsregler (fortolkning af navne) • Et navn fortolkes i en kontekst og konteksten er med til at definere navnets betydning. Eks: – Brian spillede blændende i søndags! – Skolen ligger i Viby – Ring til Kirsten og sig at ... • Beskeden “Ring til Kirsten og sig at ...” fortolkes vidt forskelligt på arbejde og hjemme! • I Java (og andre programmeringssprog) er der præcise utvetydige regler for fortolkning af navne dIntProg, E14 Navne i Java Hvad betyder følgende? i = i + 1; Det kommer an på konteksten: public class Scope { private int i = 0; public void pip() { String i = ""; i = i + 1; } } dIntProg, E14 Erklæringer i Java • For at bruge et navn skal det erklæres eller importeres – Navne fra java.lang importeres automatisk (String, Math, Thread, ...) • Variabler kan erklæres i klasser og i metoder – Som vi skal se i det følgende, er der lidt forskel på hvilke regler, der gælder de to steder dIntProg, E14 Tre slags variabler • Feltvariabler 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(); Samme navn for } metode og lokal } • Parametre variabel private int daysInMonth() { int[] daysInMonth = {0,31,28,31,…}; int res; res = daysInMonth[month]; // handle leap year if (month == 2 && isInLeapYear()) { res++; } return res; } • Lokale variabler dIntProg, E14 } Feltvariabler public class Scope { public Scope() { i = 0; } public void addTwo() { addOne(); addOne(); } private int i; public void addOne() { i = i + 1; } Style-guide: Feltvariabler bør erklæres i begyndelsen af klassen public int getValue() { return i; } } En klasse definerer et navnerum hvor alle navne erklæret i klassen er tilgængelige overalt i klassen dIntProg, E14 Metoder public class Scope { public Scope() { i = 0; } public void addTwo() { addOne(); addOne(); } private int i; public void addOne() { i = i + 1; } public int getValue() { return i; } } En klasse definerer et navnerum hvor alle navne erklæret i klassen er tilgængelige overalt i klassen dIntProg, E14 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 dIntProg, E14 Lokale variabler public void pip() { x = x++; Fejl(medmindre der er int x = 0; en feltvariabel x) x++; } I en metode definerer en blok {...} et navnerum hvor alle navne erklæret i blokken er tilgængelige fra og med erklæringen og indtil blokkens afslutning. dIntProg, E14 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), dvs. lokale variabler er tilgængelig fra og med erklæringen og indtil afslutningen på den indre blok 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, E14 Et navn virker også inde i indre blokke public void pip() { Fejl(medmindre der er int i = x; en feltvariabel x) int x = 0; ... { i++; System.out.println(i); x++; System.out.println(x); } ... ... } dIntProg, E14 Et navn kan “skygge” for et andet public class Scope { private int i; public Scope() { Gør livet lettere for jer i = 0; selv og andre: } Brug forskellige navne !!! public void pip() { i++; { i++; System.out.println(i); 2 int i = 0; i++; System.out.println(i); 1 } } public static void testMethod() { Scope s = new Scope(); s.pip(); } } dIntProg, E14 Hvad sker der når vi oversætter (og afvikler) Scope.testMethod() i ovenstående program? 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, E14 Kontrolvariabel i for-løkke Konstruktionen for ( int j=0 ; j<4; j++) { System.out.println(j); } svarer til { int j; for (j=0; j<4; j++) { System.out.println(j); } } dIntProg, E14 Hvilken variabel? • Antagelse: Feltvariabler er erklæret øverst i klasse (jvf style-guide) • Metode: Gå op og ud indtil en erklæring nås (spring indre blokke over) public class Scope { private int i = 0; public Scope ( int i ) { i = i + 1; System.out.println("a " } public void foo() { System.out.println("b " for ( int i = 0; i < 3; System.out.println("c } System.out.println("d " } } new Scope(1).foo(); dIntProg, E14 + i ); + i ); i ++){ " + i ); + i ); Hvilken variabel? • Antagelse: Feltvariabler er erklæret øverst i klasse (jvf style-guide) • Metode: Gå op og ud indtil en erklæring nås (spring indre blokke over) public class Scope { private int i = 0; public Scope ( int i ) { i = i + 1; System.out.println("a " } public void foo() { System.out.println("b " for ( int i = 0; i < 3; System.out.println("c } System.out.println("d " } } new Scope(1).foo(); dIntProg, E14 Gør livet lettere for jer selv og andre: Brug forskellige navne !!! + i ); a 2 + i ); i ++){ " + i ); b 0 + i ); c 0 c 1 c 2 d 0 Opsummering • Klassevariabler og klassemetoder – Klassevariabler bruges til egenskaber for klassen, f.eks.: myndighedsalder for personer, fælles rentesats for alle konti – Klassemetoder bruges til operationer der er uafhængige af objekters tilstande • Levetid for variabler og parametre • Virkefeltsregler – Gå op og ud • Afleveringsopgave 5.1: To spil (Pong og Juggler) dIntProg, E14 Afleveringsopg 5.1: Pong og Juggler • I skal arbejde videre med Bouncing Ball projektet dIntProg, E14 Afleveringsopgave 5.1 – Pong • Lav et spil for to personer • Tilføj to bats, der flyttes frem og tilbage langs overkanten/underkanten ved hjælp af 2 x 2 taster på tastaturet • Bolde kastes tilbage, hvis de rammer højre/venstre kant eller et af battene • Bolde der passerer battene og rammer overkanten/underkanten forsvinder dIntProg, E14 Afleveringsopgave 5.1 – Juggler • Lav et spil for én person • Nu er der kun ét bat der flyttes frem og tilbage langs underkanten • Bolde kastes tilbage, hvis de rammer højre/venstre kant, overkanten eller battet • Bolde der passerer battet og rammer underkanten forsvinder • Bolde påvirkes af tyndekraften, dvs. accelerer nedad dIntProg, E14 Afleveringsopgaver for MAT studerende • MAT studerende (på første år) vil i uge 6 få en speciel ugeopgave som relaterer sig til deres perspektiverende matematikkursus. • Som opvarmning hertil skal de løse nogle opgaver fra ”Project Euler” • Project Euler is a series of challenging mathematical/computer programming problems that will require more than just mathematical insights to solve. • Pt. 480 forskellige opgaver I Project Euler. Så der er nok at tage fat på! • Til gengæld skal MAT studerende ikke løse: • ”Bouncing Balls” samt ”Pong og Juggler” • MAT-ØK studerende aftaler med deres instruktorer, hvilke opgaver de løser dIntProg, E14
© Copyright 2024