4.6. Ekstra eksempler

Tillykke! Du har nu lært, hvordan man opretter og arbejder med objekter, og du er kommet igennem de vigtigste klasser af objekter. De eksempler og klasser, der følger nu er ikke fundamentalt forskellige fra det, du har set. Der bliver med andre ord ikke introduceret nogen nye begreber, men klasserne kan være nyttige, og eksemplerne kan måske hjælpe dig med at få repeteret ideerne om brug af objekter, metodekald og konstruktører.

4.6.1. Blanding af kort med Vector

I det følgende bruges nogle af de metoder der er nævnt i appendikset om Vector.

Dette program blander nogle spillekort (beskrevet som strenge) i en vektor. Det gøres ved 100 gange at tage et kort fra en tilfældig plads og flytte det til en anden tilfældig plads:


import java.util.*;
 
public class BlandKort
{
  public static void main(String args[])
  {
    Vector bunke;
    bunke = new Vector();

    // Opbyg bunken
    for (int n=2; n<9; n++)
    {
      bunke.addElement("ruder"+n);  // ruder
      bunke.addElement("klør"+n);   // klør
      bunke.addElement("spar"+n);   // spar
    }

    System.out.println("Før blanding: "+bunke);
    int antalKort = bunke.size();

    // Bland bunken
    for (int n=0;n<100;n++)
    {
      int nr;
      nr = (int) (Math.random() * antalKort);     // find en tilfældig plads

      String kort = (String) bunke.elementAt(nr); // tag et kort ud

      bunke.removeElementAt(nr);

      nr = (int) (Math.random() * antalKort);
      bunke.insertElementAt(kort,nr);             // sæt det ind et andet sted
    }
    
    System.out.println("Efter blanding: "+bunke);
  }
}

Før blanding: [ruder2, klør2, spar2, ruder3, klør3, spar3, ruder4, klør4, spar4, ruder5, klør5, spar5, ruder6, klør6, spar6, ruder7, klør7,
spar7, ruder8, klør8, spar8]
Efter blanding: [spar3, klør3, ruder7, spar5, spar2, ruder5, ruder6, klør6, spar6, klør5, klør8, ruder2, ruder4, klør7, ruder3, spar8, spar4, ruder8, klør4, klør2, spar7]

I et rigtigt program ville de enkelte kort nok være repræsenteret med objekter fra en Kort-klasse med objektvariablerne farve og værdi.

4.6.2. Datoer (klassen Date)

Date-klassen repræsenterer et punkt i tiden (en dato og et klokkeslæt).

Figur 4-13. Java

For at oprette et dato-objekt, der repræsenterer dags dato og tid, skriver vi:


  Date netopNu;
  netopNu = new Date();

new-operatoren er som bekendt bindeleddet mellem en klasse (f.eks. Date) og et objekt (en konkret dato, f.eks. 24/12 2000 kl. 18:37).

For at oprette en dato, der repræsenterer et andet tidspunkt, kan vi bruge en af de andre konstruktører, der tager årstal, måned (regnet fra 0), dag, time og minut. Undertegnede er født den 1. januar 1971, så min fødselsdag kunne oprettes med:


  jacobsFødselsdag = new Date(71,0,1,12,00); // 1.januar 1971 kl. 12:00

I appendikset er et udvalg af Date-klassens konstruktører og metoder beskrevet.

Eksemplet nedenfor regner på min fødselsdato og finder ud af, hvornår jeg var halvt så gammel som nu.


// Datoer.java
// Viser brugen af Date-klassen og dens metoder.

import java.util.*; // Date-klassen er i pakken java.util

public class Datoer
{
  public static void main (String[] args)
  {
    Date netopNu;
    Date jacob;

    netopNu = new Date();
    jacob = new Date(71,0,1,12,00); // 1. januar 1971 kl. 12:00

    System.out.println("Dags dato: "+netopNu.toString());
    System.out.println("Jacob blev født "+jacob); // .toString() implicit

    // Lad os regne Jacobs alder ud (i millisekunder)
    long nuMs;
    long jacobMs;
    long alderMs;

    nuMs = netopNu.getTime();
    jacobMs = jacob.getTime();
    alderMs = nuMs - jacobMs;
 
    // Hvornår var han halvt så gammel?
    jacob.setTime(nuMs - alderMs/2);
    System.out.println("Jacob var halvt så gammel "+jacob);
  }
}

Dags dato: Sun Jul 15 14:33:59 CEST 2001
Jacob blev født Fri Jan 01 12:00:00 CET 1971
Jacob var halvt så gammel Wed Apr 09 01:46:59 CEST 1986

Kaldet jacob.setTime(...) ændrer objektet, så Jacobs fødselsdag blev glemt.

Man kan gøre meget mere med datoer end vist her.

Med DateFormat-klassen kan man formatere og udskrive datoer langt pænere end med toString() og på alle mulige sprog (bl.a. på dansk). Klassen kan også gå den anden vej: Analysere en tekststreng og finde frem til datoen, den repræsenterer.

GregorianCalendar-klassen repræsenterer vort kalendersystem (det gregorianske / julianske) og har alle de kalenderfunktioner, man kunne ønske sig. Med den kan man arbejde med ugedage, måneder, år, tidszoner, sommertid etc.

Disse klasser vil ikke blive behandlet her, da de benytter begreber, som ikke er introduceret endnu (klassevariabler og klassemetoder).

4.6.3. Opgaver

  1. Ret Datoer-programmet sådan, at Jacobs fødselsdato ikke går tabt (opret et tredje objekt i stedet for at ændre i jacob-objektet).

  2. Skriv et program, der udskriver datoen for i morgen, om en uge og om et år.

  3. Skriv et program, der ud fra en persons fødselsdato udskriver alle fødselsdage, som personen har fejret indtil nu (lav f.eks. en while-løkke, hvor du tæller år frem fra fødselsdatoen, og brug before-metoden til at tjekke, om du er nået frem til nu).