I klassen Math finns metoden sin. Den används t ex så här:
System.out.println("Ange vinkeln:");
double v = scan.nextDouble();
double x = Math.sin(v);
System.out.println("sinus för vinkel " + v + " blir " + x);
Metoden sin
tar en parameter (här v), beräknar sinus för v, och returnerar ett värde. Det returnerade värdet tas emot i variabeln x och skrivs sedan ut.
Om metoden returnerar ett värde kan värdet tas emot i en variabel eller skrivas ut direkt. Metoden anropas i så fall i en utskriftssats. Exempel:
System.out.println("Mata in ett tal:");
double x = scan.nextDouble();
System.out.println("Roten ur " + x + " blir " + Math.sqrt(x));
Exempel 4. Klassen BankKonto
har en metod årsRänta()
som kan anropas så här (om vi skapat ett objekt b1):
double utdelning = b1.årsRänta();
system.out.println("Årsräntan blir: " + utdelning);
Metoden returnerar alltså ett värde. Metoden ser ut så här:
public double månadsRänta() {
double r; //lokal variabel
r = (räntesats*saldo)/12;
return r; //OBS! Metoden returnerar ett värde till anropande metod!
}
Två saker i metoden anger att den returnerar värde:
a. Den avslutas med ordet return
b. Returtypen är INTE void
. I det här fallet är den av typen double
.
FRÅGA: Varför just double
? Varför inte String
?
Exempel 5. Titta på exemplet nedan:
public double räntaPåRänta(int antalÅr) {//både parameter och returvärde
saldo = Math.pow((1+räntesats),antalÅr)*saldo;
return saldo;
}
FRÅGA: Diskutera vilket/vilka av följande alternativ som passar om man vill anropa metoden räntaPåRänta
med objektet b1
. Motivera!
- b1.räntaPåRänta(3);
- int s = b1.räntaPåRänta();
- b1.räntaPåRänta();
- System.out.println(b1.räntaPåRänta());
- double s = b1.räntaPåRänta(5);
- System.out.println(b1.räntaPåRänta(2));
Exempel 6: Anropa en metod i en annan (icke-static) metod.
Metoden årsSaldo
beräknar och skriver ut saldot efter ett år med hjälp av metoden saldoBesked(), dvs vi anropar en metod från en annan metod i samma klass. Objektet behöver inte anges, det är underförstått det anropande objektet!
public void årsSaldo() { //inga parametrar behövs,
//bara instansvariabler används
saldo += saldo*räntesats;
saldoBesked(); //eftersom vi anropat metoden årsSaldo med objektet b1,
//kommer även metoden saldoBesked() att anropas för
//samma objekt.
//Alternativt skrivsätt: this.saldoBesked();
}
I main:
b1.årsSaldo();
Exempel 7. Titta på följande FELAKTIGA kod:
public double räntan() { /
double r = saldo*räntesats;
double s = saldo*(1+ räntesats);
return r;
return s; //Kommer aldrig att exekveras!!
}
Det är tillåtet att ha flera retur-satser, men det rekommenderas inte. Bara en retur-sats kommer att exekveras. Flera värden kan inte returneras m h a flera retur-satser. Exempel på korrekt kod:
...
if (längd > 1.50)
return true;
else
return false;
Exempel 8. En void-metod får inte returnera något värde, men får innehålla satsen return;
Exempel:
public void taUt(double summa) {
if (summa > saldo) {
System.out.println("Otillräckligt saldo.");
return; //stoppar exekveringen av resten av metoden
{
saldo = saldo - summa;
System.out.println("Nytt saldo: " + saldo);
}
Exempel 9. main-metoden kan ligga i samma fil som klass som används av main-metoden. Titta på klassen Person.
III. Speciella metoder: Konstruktorer
Se exemplet klassen Person2. När programmet körs skapas objekten vid instruktionen new
. Exempel:
Person bybo = new Person();
Om man skriver ut objektet med metoden skrivUt() kommer namnet och adressen att vara tomma och åldern vara 0. Det vore bra att kunna skriva
Person per = new Person("Per Al", "Storg 1 Bvik", 21);
Det förutsätter att det finns en metod som används när objekten skapas som har tre parametrar. Metoder som används när objekt skapas kallas konstuktorer.
- konstruktor-metoderna används bara när objekt skapas!!!!
- en konstruktor har ingen returtyp, inte ens void.
- man kan skriva flera konstruktorer, bara parameterlistorna skiljer sig åt.
- en konstruktor med tom parameterlista kallas default-konstruktor eller standardkonstruktor. Den brukar ofta ge standardvärden till instansvariablerna. Exempel:
public Person() {//OBS! Ingen returtyp, inte ens void
namn = "Anonym";
adress = "Bostadslös";
ålder = 20; //Om man vill ge ett värde. Instansvariabler nollställs
//annars automatiskt!
}
Standardkonstruktorn är ofta tom, vilket betyder att instansvariablerna nollställs eller sätts till null automatiskt!
Exempel:
public Person() //instansvariabler nollställs eller sätts till null automatiskt!
{}
- En konstruktor med en eller flera parametrar kallas överlagrad konstruktor eller extrakonstruktor. Exempel:
public Person(String n, String a, int å) {
namn = n; //ge värdet som följer med i parameterlistan till objektets instansvariabel
adress = a;
ålder = å;
}
- om man skriver en överlagrad konstruktor bör man även skriva en defaultkonstruktor (god regel).
- skriver man ingen konstruktor "får" skapas det ändå en defaultkonstruktor automatiskt. Om man skriver en överlagrad konstruktor men ingen standardkonstruktor skapas ingen sådan automatiskt.
IV. Speciella metoder: get- och set-metoder
Eftersom main
-metoden inte kan komma åt instansvariablerna direkt utan bara genom klassens metoder brukar man skriva speciella metode för åtkomst och ändring av instansvariablerna. De kan heta vad som helst, men standardnamn är get
för åtkomst och set-
för ändring.
- set-metoder:
Metoderna heter ofta setInstansvariabel
, returtyp void
och nya värdet skickas som paremeter.
Exempel:
public void setRäntesats(double nyRäntesats) {
räntesats = nyRäntesats;
}
public void setNamn(String nyttNamn) {
namn = nyttNamn;
}
I main:
...
double nyRsats;
String nyttNamn;
System.out.println("Ange ny räntesats: ");
nyRsats = scan.nextDouble();
b1.setRäntesats(nyRsats);
System.out.println("Ange kontoinnehavare: ");
nyttNamn = scan.nextLine();
b1.setNamn(nyttNamn);
- get-metoder:
Metoderna heter ofta getInstansvariabel
, returtyp är samma som instansvariabelns typ. Ingen parameter.
Exempel:
public double getRäntesats() {//tom parameterlista
return räntesats; //returnerar attributet
}
public String getNamn() {
return namn;
}
I main:
...
//värdet av instansvariabeln kan tas emot i lokal variabel
double rSats = b1.getRäntesats();
System.out.println("Kontot har räntesatsen " + rSats);
//... eller värdet av instansvariabeln kan tas emot och skrivs ut direkt i en utskriftssats
System.out.println("Kontoinnehavare: " + b1.getNamn());
Ett exempel med get- och set-metoder är klassen Personen.java.
V. Speciella metoder: toString-metoden
I klassen Person finns en metod skrivUt() man kan anropa för objekt av klassen Person. Metoden skriver ut instansvariablerna, och kan anropas från t ex main-metoden:
gun.skrivUt();
Ofta vill man ändå kunna skriva ut ett objekt med System.out.println(objekt);
. Hur skriver man ut ett helt objekt? Om man har skapa ett objekt vore det bra om man kunde skriva ut det på något vettigt sätt, t ex
Person per = new Person("Pelle Ek", "Storg 5, Uppsala", 16); //Skapa objektet per
System.out.println(per); //Jag vill ha en snygg utskrift av objektets information (instansvaraibler)
Om man skriver så får man en nonsensutskrift, t ex:
Person@13e754f
Man ska göra en toString-metod:
public String toString() { //OBS! metoden har typen String,
//dvs ska returnera en sträng, en text.
//Här instansieras ett objekt av klassen String.
//Man bestämmer själv hur utskriften ska se ut
return ...; // objektet returneras
}
I klassen Person
kan toString-metoden se ut exempelvis så här:
public String toString() {
//skapa ett String-objekt, det kan heta vad som helst, t ex skriv:
String skriv = namn + " är " + ålder + " år" +
" och bor på " + adress + ".";
return skriv; // objektet returneras
}
I main:
...
Person per = new Person("Pelle Ek", "Storg 5, Uppsala", 16);
System.out.println(per);
ger utskriften:
Pelle Ek är 16 år och bor på Storg 5, Uppsala.
Man kan designa toString-metoden som man vill. Ett till exempel:
public String toString() {
String ut = "Namn: " + namn + "\n";
ut += "Adress: " + adress + "\n";
ut += "Ålder: " + ålder;
return ut;
}
ger utskriften:
Namn: Pelle Ek
Adress: Storg 5, Uppsala
Ålder: 16
toString-metoden anropas (ofta) inte med sitt namn utan från print- eller println-metoderna om parametern är ett objekt
System.out.println(p1);
dvs när man anropas print- eller println-metoderna med ett objekt som parameter. Observera att även om man har en toString-metod så går det att använda println()- och print()-metoderna på vanliga varabler och strängar:
System.out.println("Ränta på kontot är: " + ränta);
VI. Sammanfattning
- Metoder beskriver de operationer man vill kunna göra på objekten.
- Metoder är en hjälp att strukturera koden i "lämpliga" delar.
- Varje metod bör ta hand om en avgränsad uppgift. Metoderna blir då
- lättlästa
- lättare att debugga (avlusa, hitta och rätta fel i)
- lättare att återanvända
- En metod känns igen genom parenteserna efter metodnamnet, och börjar med en liten bokstav.
- Parameterlistan = indata till metoden, returnvärde = utdata från metoden.
- Skilj på formella och aktuella parametrar.
- Alla metoder utom konstruktorerna måste ha en returtyp (double, void,...)
- Konstruktorerna får inte ha returtyp, och måste heta samma sak som klassen
- En void-metod får inte returnera något värde (men får innehålla satsen
return;
)
- Typiskt metodanrop i main:
objekt.metod(ev. parametrar);
- Vid anrop (t ex i main) av metod som returnerar ett värde: TA EMOT RETURVÄRDET t ex i en variable eller i en utskrift. Ex:
tal = b.beräkna();
System.out.println("Räntan blir:" + b.årsränta();
förutsätter att metoderna beräkna()
och årsränta()
returnerar värden.
toString()
-metoden kommer (automagiskt) att anropas när man skriver ut ett objekt med print
-metoderna. Antag att b1 är ett objekt av typen BankKonto:
System.out.println(Bankkonto 1: " + b1);
Anna Eckerdal
Last modified: Mon Nov 16 16:30:34 MET 2009