4.2 Lecture

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