0120 genomgång kap 5
Lärandemål
- Känna till vad private och public betyder för egenskaper, och metoder.
- Kunna använda nyckelordet
this
för att referera till objektet självt. - Kunna använda metoderna
getX()
,getY()
, ochsetLocation()
. - Känna till skillnaden på klassmetod och objektmetod. (även i kap 3)
- Kunna anropa objektmetoder på andra objekt.
- Känna till liknader och skillnader vid anrop av klass- och objektmetoder.
- Kunna använda metoden
setPaintOrder()
. - Kunna sätta ihop textsträngar.
- Kunna typkonvertera.
- Kunna skriva generella metoder, som kan användas i fler situationer.
Genomgång
Access modifiers (sv. modifierare av synlighet)
private void turnRight()
public void turnLeft()
Metoden turnRight kan bara anropas inifrån klassen, eftersom den börjar med private
.
Metoden turnLeft kan även anropas från andra klasser, eftersom den börjar med public
.
Nyckelordet this
Nyckelordet this
används för att referera till objektet självt. Exempel följer.
/**
* En mask (eng. worm) som tas bort efter tio anrop av metoden act.
*/
public class Worm extends Actor
{
private int numberOfFrames = 0;
public void act()
{
numberOfFrames = numberOfFrames + 1;
if (numberOfFrames == 10)
{
World myWorld;
myWorld = getWorld();
myWorld.removeObject(this);
//eller på en rad
//getWorld().removeObject(this);
}
}
}
Metoden setLocation i klassen Actor
Nedanstående är saxat ur klassen Actor
. Detta är exempel på två objektmetoder. Mer om det lite senare.
/**
* Assign a new location for this actor.
*/
public void setLocation(int x, int y)
{
//code omitted
}
/**
* Return the x-coordinate of the actor's current location.
*/
public int getX()
{
//code omitted
}
Nedan visas hur ovanstående metoder anropas i klassen Alligator.
public class Alligator extends Actor
{
public void act()
{
if ( Greenfoot.isKeyDown("up") )
{
//flytta upp två pixlar
setLocation(getX(), getY() - 2);
}
else if (Greenfoot.isKeyDown("down") )
{
//ny x-koordinat
int x = getX();
//ny y-koordinat
int y = getY() + 2;
setLocation(x, y);
}
}
}
Klassmetoder
I klassen Greenfoot finns det många klassmetoder. En klassmetod tillhör klassen. Det behövs inget objekt av klassen för att anropa metoden.
metodhuvuden - klassmetod
Metodhuvuden hämtade från klassen Greenfoot. Observera nyckelordet static i metodhuvudet.
public static int getRandomNumber(int limit)
public static boolean isKeyDown(java.lang.String keyName)
public static void stop()
metodanrop - klassmetod
Greenfoot.isKeyDown("up");
Greenfoot.stop();
Greenfoot.getRandomNumber(100);
Mönstret är som följer:
Klassnamn.klassMetodnamn();
Exempel anrop av klassmetod
Exempel på anrop av klassmetod följer.
public class Hero extends Actor
{
public void act()
{
if (Greenfoot.isKeyDown("s"))
{
Greenfoot.stop();
}
}
}
Objektmetoder
Objektmetoder tillhör objekten. Man måste ha ett objekt av en klass för att kunna anropa en objektmetod.
metodhuvud - objektmetoder
Exempel på metodhuvud som finns i klassen Actor.
public void setLocation(int x, int y)
public int getX()
metodanrop - objektmetod i samma klass
Nedan anropas objektmetoderna:
setLocation
getX
getY
public class Alligator extends Actor
{
public void act()
{
if ( Greenfoot.isKeyDown("up") )
{
//flytta upp två pixlar
setLocation(getX(), getY() - 2);
}
else if (Greenfoot.isKeyDown("down") )
{
//ny x-koordinat
int x = getX();
//ny y-koordinat
int y = getY() + 2;
setLocation(x, y);
}
}
metodhuvuden - objektmetod
Nedanstående metodhuvud finns i klassen World.
public void removeObject(Actor actor)
metodanrop - objektmetod i annan klass
I koden nedan finns ett anrop av en objektmetod. De ser ut så här.
myWorld.removeObject(this);
Mönstret är
objektNamn.metodnamn();
Exempelkod följer:
/**
* En mask (eng. worm) som tas bort efter tio anrop av metoden act.
*/
public class Worm extends Actor
{
private int numberOfFrames = 0;
public void act()
{
numberOfFrames = numberOfFrames + 1;
if (numberOfFrames == 10)
{
World myWorld;
myWorld = getWorld();
myWorld.removeObject(this);
//eller på en rad
//getWorld().removeObject(this);
}
}
}
Skapa objekt
För att skapa ett objekt av klassen Hero
skriver man koden.
new Hero();
Vilket objekt ska visas överst?
Metoden setPaintOrdet
i klassen World
är användbar. Läs dokumentationen för klassen World
.
Exempelkod följer:
setPaintOrder(Alligator.class, Pumpkin.class);
Sätta ihop texter av datatypen String
"en text" + " och en annan text"
blir
"en text och en annan text"
En text och ett tal blir en text, se exempel nedan.
"poäng: " + 3500
blir
"poäng: 3500"
Talet omvandlas först till en text innan texterna sätts samman.
Det fungerar även med variabler.
String text = "poäng: ";
int tal = 3500;
text + tal;
blir
"poäng: 3500"
Behov av typkonvertering
Teori typkonvertering
double decimaltal = 3.14;
int heltal
//typkonvertering av double till int
heltal = (int)decimaltal;
Exempel
Kod för klassen GameWorld
visas nedan.
public class GameWorld extends World
{
private int score = 0;
//code omitted
public void addScore(int numberOfPoints)
{
score = score + numberOfPoints;
showText(score, 100, 30);
}
}
Anrop av metoden addScore
i klassen Hero
.
public class Hero extends Actor
{
public void act()
{
//kod utelämnad
//lägg till tio poäng
GameWorld spelVarlden;
spelVarlden = (GameWorld)getWorld();
spelVarlden.addScore(10);
}
}
Metodhuvud i klassen World.
public World getWorld()
Förklaring till koden ovan.
Metoden
getWorld
returnerar vid programkörning ett objekt av datatypenGameWorld
.Men enligt dokumentationen, egentligen koden i
World
, så returnerar metodengetWorld
ett objekt av datatypenWorld
. Kompilatorn vet bara detta, och inte att objektet är av datatypenGameWorld
.Metoden
addScore
finns i klassenGameWorld
men ej iWorld
.För att kunna använda metoden
addScore
på det objekt som returneras av metodengetWorld
, måste man berätta för kompilatorn att objektet har datatypenGameWorld
. Det kan man göra genom att typkonvertera.
Generella metoder
Generella metoder är lättare att återanvända än metoder som bara gör en sak. Metoder kan bli mer generella genom att man till exempel använder parametrar. Jämför metoderna addTenPoints
och addScore
nedan.
public class GameWorld extends World
{
private int score = 0;
//code omitted
public void addTenPoints()
{
score = score + 10;
showText(score, 100, 30);
}
public void addScore(int numberOfPoints)
{
score = score + numberOfPoints;
showText(score, 100, 30);
}
}
Den senare metoden kan användas i fler situationer än den första.