4.3. Rektangler (klassen Rectangle)

Vi vil nu gå videre til nogle lidt mere indviklede objekter, af klassen Rectangle. Den bruges sjældent i praksis (så du behøver ikke lære dens metoder udenad), men den er velegnet til at illustrere ideer omkring oprettelse af objekter (konstruktører) og metodekald med returværdi.

Et rektangel-objekt består af en x- og y-koordinat og en højde og bredde. Disse objektvariabler (data) hedder x,y,width og height.

En variabel med navnet r af typen Rectangle erklæres med:


    Rectangle r;

Ligesom med Point skal vi have lavet et rektangel-objekt, som r refererer til:

Figur 4-7. Java


    r = new Rectangle();

Dette skaber et Rectangle-objekt med x,y,width og height sat til 0.

Vi kan ændre dette til (1,1,10,10) med:


    r.x=1;
    r.y=1;
    r.width=10;
    r.height=10;

Det er besværligt hvis vi skal bruge fire linjers programkode på at sætte et objekts værdier hver gang vi opretter det.

4.3.1. Konstruktører

Når man vil oprette et objekt med bestemte startværdier, kan det gøres ved at benytte en konstruktør, hvor startværdierne kan angives.

For eksempel kan et rektangel oprettes med:


    r = new Rectangle(1,1,10,10);

De fire parametre i parenteser fortæller, at det rektangel, som skal skabes, som start skal have det øverste venstre hjørne i (1,1) og en bredde og en højde på 10. Det er i virkeligheden en slags metodekald, vi her foretager, så det er ikke nogen tilfældighed, hvis det ligner.

Når man skaber et nyt objekt med new, kaldes en konstruktør

Konstruktøren skaber et nyt objekt og initialiserer objektets data

Nogle konstruktører tager parametre, der beskriver, hvordan objektet skal oprettes

Herunder er beskrevet tre konstruktører for Rectangle - dvs. tre måder rektangler kan oprettes på.

Nogle af Rectangle-klassens konstruktører

Rectangle()opretter et rektangel i (0,0), hvis bredde og højde er 0

Rectangle(int bredde, int højde)opretter et rektangel i (0,0) med den angivne bredde og højde

Rectangle(int x, int y, int bredde, int højde)opretter et rektangel i (x,y) med den angivne bredde og højde

Point-klassens konstruktører er beskrevet i appendikset Afsnit 4.7.1. Vi kan f.eks. bruge den, der tager to parametre:


    Point p;
    p= new Point(8,6);  // skaber et Point med koordinaterne (8,6)

4.3.2. Metoder

Vi vil nu lave et lille program, der tjekker, om punktet p ligger inde i rektanglet r. Vi erklærer en variabel, inde, af type boolean, som vi kan bruge til at gemme resultatet af vores undersøgelse i.


    boolean inde;

Objekter af klassen Rectangle har en metode, contains(), som kan fortælle, om et punkt ligger inde i rektanglet:


    inde = r.contains(p);

Det, der sker, er, at vi kalder metoden contains() - svarende til spørgsmålet "indeholder du p?" - på rektanglet r. Vi giver p med som parameter, således at rektanglets metode ved, at det lige præcis er punktet p, som skal undersøges. Metoden bliver udført og foretager nogle beregninger, som vi ikke kan se, og til sidst kommer den ud med et svar. Dette svar returneres til os og bliver gemt i variablen 'inde'. Modsat tilfældet med Point-objekters move()- og translate()-metoder er rektanglers indhold uændret af kald af contains().

Ikke alle metoder på et objekt ændrer på det

Nogle metoder giver et svar tilbage (returnerer et resultat)

Prøv at sammenligne det med kaldet til Math.sqrt(), som vi så i forrige kapitel:


    hypotenuse = Math.sqrt(x*x + y*y);

Det er samme mekanisme: Vi spørger Math.sqrt() om, hvad kvadratroden af x*x+y*y er, og svaret, som metoden giver tilbage, gemmer vi i variablen hypotenuse.

4.3.3. Metoders returtype

Ligesom parametre skal være af den rette type, gælder det for resultatet af et metode-kald at:

En metode giver et resultat af en bestemt type, når den bliver udført

Dette kaldes metodens returtype

Math.sin() har returtypen double, mens contains() på et rektangel-objekt har returtypen boolean. Det er derfor, vores variabel 'inde' også skulle have typen boolean.

Hvis punktet var inde i rektanglet, så vil vi skrive det på skærmen:


    if (inde==true)
    {
        System.out.println("p r inde i r");
    }

Herunder ses nogle af Rectangle-klassens metoder. Foran metode-navnene står returtyperne. I kursiv står spørgsmålene, som de svarer til. En mere komplet oversigt over klassen kan findes i appendiks i Afsnit 4.7.2.

Nogle af Rectangle-klassens metoder.

boolean contains (Point p) "indeholder du p?"returnerer true hvis p er inden for rektanglet, ellers false.

Point getLocation() "hvad er din placering?"

returnerer et Point-objekt, der har samme koordinater som rektanglets øverste venstre hjørne.

String toString() "hvordan vil du beskrive dig selv?"giver en beskrivelse af rektanglet med (x,y)-koordinater og mål som en streng.

Her er Rectangle illustreret i UML-notation.

Figur 4-8. Java

Returtyperne skrives her efter metodenavnet. Ofte vil vi af hensyn til overskueligheden undlade returtyperne (ligesom vi nogle gange undlader parametertyperne).

Herunder ses et samlet eksempel med to punkter. Det andet punkt, p2, undersøger vi direkte i en if-sætning uden at bruge en mellemvariabel.


import java.awt.*;

public class Rektangler
{
  public static void main (String[] args)
  {
    Point p, p2;
    Rectangle r;

    p = new Point();
    p2 = new Point(6,8);

    r = new Rectangle(1,1,10,10);

    boolean inde;
    inde = r.contains(p);

    if (inde==true)
    {
        System.out.println("p er inde i r");
    }

    if (r.contains(p2))
    {
        System.out.println("p2 er inde i r");
    }
  }
}

p2 er inde i r

4.3.4. Metoders parametre

Her er et eksempel, der beregner afstanden (distancen) mellem punktet p og rektanglet r's øverste venstre hjørne. Det foregår ved, at vi spørger r: getLocation() - "hvad er din position?". Svaret bruger vi som parameter til et spørgsmål til p: distance(svaret fra r) - "Hvad er din afstand til (svaret fra r)?"


    double afstand;
    afstand = p.distance(r.getLocation());

Ved et metodekald beregnes først alle parametrene, og derefter udføres metoden

Dvs. først beregnes parameteren, getLocation() kaldes altså på r. Den returnerer et punkt som er r's (x,y), og derefter kaldes distance() på p med dette Point-objekt som parameter.

Man kunne også bruge en mellemvariabel, og skrive:


    Point rpunkt;
    rpunkt = r.getLocation();      // rpunkt er r's øverste venstre hjørne
    afstand = p.distance(rpunkt);

Det er i starten lettere at læse kode med mellemvariable, men når eksemplerne bliver mere indviklede bliver antallet af mellemvariabler for stort. Man skal øve sig i selv at forestille sig, at der er nogle mellemregninger med mellemvariabler.