0120 genomgång kap 5

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();

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);
          }
      }
  }

Bort?!

Exempelkod - klassmetoder

Koden nedan är en bit av klassen Greenfoot.

  public class Greenfoot
  {
      //code omitted

      public static int getRandomNumber(int limit)
      {   //code omitted}

      public static boolean isKeyDown(java.lang.String keyName)
      {   //code omitted}

      public static void stop()
      {   //code omitted}

      //code omitted
  }

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();
          } 
      } 
  }

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.