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(), och setLocation().
  • 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 datatypen GameWorld.

  • Men enligt dokumentationen, egentligen koden i World, så returnerar metoden getWorld ett objekt av datatypen World. Kompilatorn vet bara detta, och inte att objektet är av datatypen GameWorld.

  • Metoden addScore finns i klassen GameWorld men ej i World.

  • För att kunna använda metoden addScore på det objekt som returneras av metoden getWorld, måste man berätta för kompilatorn att objektet har datatypen GameWorld. 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.