Indhold:
Objekter og klasser
Oprettelse af objekter og konstruktører
Brug af objekters variabler og metoder
Punkter, rektangler, strenge, lister
Kapitlet forudsættes i resten af bogen.
Forudsætter kapitel 2 Basal programmering.
Hidtil har vi kun brugt de simple typer (som int, boolean og double). Et javaprogram vil ofte udføre mere komplekse opgaver og dermed have brug for objekter. Et objekt repræsenterer en eller anden (ofte fysisk) ting og indeholder sammensatte data om denne ting, f.eks. et hus-objekt (med adresse, telefonnummer, antallet af døre og vinduer ...), en bil, en person, en bankkonto, en selvangivelse, en ordre, et dokument ...
Objekter kan klassificeres i forskellige kategorier, kaldet klasser. F.eks. kunne man sige, at alle hus-objekter tilhører Hus-klassen. Hus-klassen er en beskrivelse af alle slags huse.
Næsten alt er repræsenteret som objekter i Java, og der findes tusindvis af foruddefinerede klasser til ting, som man ofte har brug for som programmør såsom: tekststrenge, datoer, lister, filer og kataloger, vinduer, knapper, menuer, netværksforbindelser, hjemmeside-adresser, billeder, lyde ...
Et objekt indeholder data, der beskriver det, som objektet repræsenterer. Et Fil-objekt har oplysninger om den fil, det repræsenterer: Navn, placering, type, dato for oprettelse og indhold. Et Person-objekt har måske variabler for fornavn, efternavn, CPR-nummer.
Et objekt kan også indeholde navngivne programstumper, som kan udføres ved at give objektet besked om det. Disse programstumper kaldes metoder og kan opfattes som spørgsmål eller kommandoer, som man bruger til at undersøge og manipulere indholdet af objektet med.
Et Fil-objekt har måske metoden "omdøb()", der ændrer filens navn, et Person-objekt kan måske give personens alder med metoden "hvadErDinAlder()".
Et objekt kan indeholde metoder og data (variabler)
En metode kan ændre på objektets data, når den udføres
Ligesom med de simple typer afhænger det af objektets type, dets klasse, hvad man kan gøre med det. Ordet "klasse" skal forstås i betydningen "kategori, gruppe". Alle objekter kan klassificeres som værende af en bestemt type (klasse), f.eks. Streng, Dato, Fil, Knap.
Objekter af samme klasse forstår de samme beskeder (kommandoer og spørgsmål) og indeholder samme slags data. Objekter af klassen Person indeholder f.eks. begge et navn, men navnene (data) i de to person-objekter kan være forskellige.

Et objekts type kaldes dets klasse
Klassen bestemmer, hvilke metoder og data et objekt har
Vi tegner klasser som vist her til højre.
Øverst er klassens navn, dernæst data
og n
ederst
metoderne.
Dette er en del af UML-notationen (Unified Modelling Language), en notation, der ofte bliver anvendt i forbindelse med objektorienteret programmering.
I dette kapitel vil vi bruge objekter fra foruddefinerede klasser. Vi har valgt at kigge nærmere på nogle klasser, der er velegnede til at illustrere ideerne, nemlig Point, Rectangle, String, Date og ArrayList.
String og ArrayList er nok de mest brugte klasser overhovedet og er næsten uundværlige i praktisk programmering.
Det første objekt, vi vil arbejde med, er Javas Point-objekt, der repræsenterer et punkt. I Java indeholder et punkt to heltalsvariable, nemlig en x- og en y-koordinat. Vi vil senere bruge Point-klassen, når vi kommer til programmering af grafik.
For at kunne arbejde med et objekt har man brug for en variabel, der refererer til objektet. En variabel af typen Point (der refererer til et punkt) erklæres ved at skrive
Point p;Ligesom med de simple typer skriver man typen (Point) efterfulgt af variabelnavnet. Nu har vi defineret, at p er en variabel til objekter af typen Point, og vi kan lave et nyt Point-objekt, som vi sætter p til at pege på1:
p = new Point();Vi skriver altså new og klassens navn (Point) efterfulgt af parenteser med startværdier for objektet. Her giver vi ingen startværdier, og parentesen er derfor tom.
Et objekt oprettes med new
Når et objekt oprettes, sørger det for at sætte dets data til nogle fornuftige startværdier

p
refererer til et punktobjekt.
Objektet har x=0 og y=0
Man kan sige, at hver gang vi anvender new-operatoren, bruger vi klassen som en slags støbeform til at skabe et nyt objekt med.
Vi kan undersøge objektet p's variabler. Her erklærer vi en anden variabel, a,
int a;... og gemmer p's x-koordinat i variablen:
a = p.x;p's x-koordinat får man fat i ved at skrive p punktum x. Vi kan derefter udskrive a:
System.out.println("a: "+a);Man kan også udskrive koordinaterne direkte uden at bruge a som mellemvariabel:
System.out.println("x-koordinat: "+p.x);
System.out.println("y-koordinat: "+p.y);Vi kan også ændre p's koordinater:

Efter
tildeling af p.x og p.y
p.x = 110;
p.y = 210;Variablerne x og y i Point-objektet kan behandles fuldstændig som andre variabler af typen int, når vi bare husker at skrive "p." foran. F.eks. kan man tælle x-koordinaten op med 5:
p.x = p.x + 5;
x og y kaldes objektvariabler, fordi de tilhører objektet p.
I stedet for at ændre objektet udefra kan vi
bede objektet selv udføre ændringen. Metoden move()
flytter punktet til et bestemt koordinatsæt, dvs. den

Efter
kald af move(200,300)
p.move(200,300);
Man siger, at man foretager et metodekald på objektet som p refererer til, og man skriver: p punktum metodenavn parenteser.
Efter metodekaldet til move() har x- og y-koordinaterne ændret sig i det objekt, som p peger på.
Et objekt kan indeholde metoder
Et metodekald på et objekt kan ændre objektets data
Her er Point-klassen illustreret i
UML-notationen:
Herunder er nogle af de metoder, som punktobjekter forstår (en oversigt over klassen kan findes i appendiks, afsnit 3.9.1).
Nogle af Point-klassens metoder
move(int x, int y)
Sætter
punktets koordinater
translate(int x, int
y)
Rykker punktets koordinater relativt i forhold til, hvor det er
Først står navnet på metoden med fed, f.eks.: move.
Derefter står parametrene adskilt af komma, f.eks.: (int x, int y).
For hver parameter er angivet en type og et navn. Typen angiver, hvilke værdier man kan kalde metoden med, og bruges til at kontrollere, at man har kaldt den med en værdi af den rigtige type. Navnet i beskrivelsen bruges kun til at minde om, hvad parameteren betyder.
Bemærk, at kaldet derfor ser anderledes ud end beskrivelsen:
p.move(200,300); // korrekt p.move(int 200, int 300); // sprogfejl: parametertyper angivet ved kald. p.move(x=200, y=300); // sprogfejl: parameternavne angivet ved kald.
I parenteserne i metodekaldet giver man oplysninger til objektet om, hvordan man vil have metoden udført
Oplysningerne kaldes parametre (eller argumenter)
I kaldet til move() ovenfor gav vi oplysningerne 200 og 300 som parametre.
Her er et eksempel på tingene, vi har vist ovenfor:
import java.awt.*; // Point-klassen skal importeres fra pakken java.awt
public class BenytPunkter
{
public static void main(String[] arg)
{
Point p;
p = new Point();
int a;
a = p.x;
System.out.println("a: "+a);
System.out.println("x-koordinat: "+p.x);
System.out.println("y-koordinat: "+p.y);
p.x = 110;
p.y = 210;
System.out.println("x-koordinat: "+p.x);
System.out.println("y-koordinat: "+p.y);
p.move(200,300);
System.out.println("x-koordinat: "+p.x);
System.out.println("y-koordinat: "+p.y);
p.x = p.x + 5;
System.out.println("x-koordinat: "+p.x);
System.out.println("y-koordinat: "+p.y);
p.translate(-10,20);
System.out.println("x-koordinat: "+p.x);
System.out.println("y-koordinat: "+p.y);
}
}
a: 0 x-koordinat: 0 y-koordinat: 0 x-koordinat: 110 y-koordinat: 210 x-koordinat: 200 y-koordinat: 300 x-koordinat: 205 y-koordinat: 300 x-koordinat: 195 y-koordinat: 320
Øverst i kildeteksten "importerer" vi alle klasser i pakken java.awt:
import java.awt.*;
Dette fortæller oversætteren, hvor den skal lede efter definitionen af klasserne, vi bruger i programmet. I dette tilfælde er det for, at oversætteren skal kende til Point-klassen (der findes i pakken java.awt).
En pakke er en samling klasser med beslægtede funktioner. AWT står for "Abstract Window Toolkit", og java.awt indeholder forskellige nyttige klasser til at tegne grafik på skærmen, herunder klasser til at repræsentere punkter og rektangler.
Lige nu er det nok at vide, at de fleste klasser skal importeres, før de kan bruges (hvis du er meget nysgerrig, kan du læse den første del af kapitel 6 om pakker allerede nu).
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, ellers peger r ingen steder hen (den har værdien null):
r = new Rectangle();
Som med de simple typer kan man godt erklære variablen og initialisere den i samme linie:
Rectangle r = new Rectangle();

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 man skal bruge fire liniers programkode på at sætte et objekts værdier, når man opretter det. Det kan gøres kortere.
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 opretter objektet og initialiserer dets data (variabler)
Nogle konstruktører har parametre, der beskriver, hvordan objektet skal oprettes (hvilke værdier dets variabler skal have)
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 3.9.1. Vi kan f.eks. bruge den, der har to parametre:
Point p;
p= new Point(8,6); // skaber et Point med koordinaterne (8,6)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.
Ligesom parametre skal være af den rette type, gælder 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 er 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 3.9.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.

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 BenytRektangler
{
public static void main(String[] arg)
{
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
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 mellemvariabler, 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.

s
refererer
ikke til noget
String s;
Nu har vi defineret, at s er en variabel, der kan referere til objekter af typen String, men den refererer endnu ikke til noget objekt med konkret indhold.

s
refererer nu
til en streng
s = "Ude godt";
Nu er situationen som vist på figuren til højre.
Vi kan bruge s i vores program, f.eks. til at skrive ud på skærmen:
System.out.println("Strengen s indeholder: "+s);Vi kan spørge streng-objektet om forskellige ting. For eksempel kan vi kalde metoden length(), der svarer til spørgsmålet "hvor lang er du?". Strengen vil svare med tallet 8:
...
int strengensLængde;
strengensLængde = s.length();
System.out.println("s er "+strengensLængde+" tegn lang");
...
s er 8 tegn lang
Vi kunne også springe mellemvariablen over og skrive:
System.out.println("s er "+s.length()+" tegn lang");
Metoden toUpperCase() svarer til spørgsmålet "hvordan ser du ud med store bogstaver?":
System.out.println("s med store bogstaver: "+s.toUpperCase());
s med store bogstaver: UDE GODT
Herunder ses nogle af metoderne, man kan kalde på strenge. I kursiv til højre står spørgsmålene, som de svarer til.
Nogle af String-klassens metoder. En mere fuldstændig oversigt kan findes i afsnit 3.9.3.
char charAt (int
indeks) "hvilket tegn er der på plads nummer
x?"
Returnerer tegnet på det angivne indeks.
Indeks tæller fra 0.
String replace (char
gammeltTegn, char nytTegn) "hvad hvis tegn x erstattes med
y?"
Returnerer en ny streng, som er identisk med denne
streng, bortset fra at alle forekomster af gammeltTegn er
erstattet med nytTegn.
String substring (int
startindeks) "hvad er delstrengen fra x?"
Returnerer
en ny streng, som er en del af denne streng. Delstrengen starter ved
startindeks og går til slutningen.
String substring (int
startindeks, int slutindeks) "hvad er delstrengen fra x til
y?"
Returnerer en ny streng, som er en del af denne
streng. Delstrengen starter ved startindeks og slutter
ved slutindeks (til og med slutindeks-1).
String toLowerCase
() "hvordan ser du ud med små bogstaver?"
Returnerer
en ny streng, som er identisk med denne streng, bortset fra at alle
store bogstaver er erstattet med små.
String toUpperCase
() "hvordan ser du ud med store bogstaver?"
Returnerer
en ny streng, som er identisk med denne streng, bortset fra at alle
små bogstaver er erstattet med store.
boolean equals (String
str) "er det samme indhold?"
Returnerer sand,
hvis denne streng indeholder den samme tegnsekvens som str,
ellers falsk.
int length () "hvad
er din længde?"
Returnerer længden af (antal
tegn i) strengen.
int indexOf (String
str) "hvor er delstrengen x?"
Returnerer indekset
på den første forekomst af str som delstreng.
Hvis str ikke er en delstreng, returneres -1.
Herunder ses et eksempel, hvor nogle af metoderne er afprøvet:
// BenytStrenge.java
// Viser brugen af String-klassen og dens metoder.
public class BenytStrenge
{
public static void main(String[] arg)
{
String s;
s = "Ude godt";
System.out.println("Strengen s indeholder: "+s);
System.out.println("s er "+s.length()+" tegn lang");
System.out.println("s med store bogstaver: "+s.toUpperCase());
System.out.println("Tegnet på plads nummer 2 er: "+s.charAt(2));
System.out.println("Det første g er på plads nummer: "+s.indexOf("g"));
}
}
Strengen s indeholder: Ude godt s er 8 tegn lang
s med store bogstaver: UDE GODT Tegnet på plads nummer 2 er: e Det første g er på plads nummer: 4
De fleste objekter tillader, at deres data ændres, enten ved at man direkte har adgang til deres variabler eller gennem kald af metoder.
Når vi skal ændre i et Point-objekt, f.eks. så dets x og y er (1,1), skriver vi:
p.move(1,1); // p forandres
Sådan er det ikke med strenge: Metoderne i strenge er indrettet sådan, at de ikke ændrer i objektet. I stedet returneres en ny streng, som indeholder resultatet af ændringen.
Kalder man derfor en ændringsmetode på et String-objekt, bliver strengen ikke ændret:
s.replace('d','f'); // s forandres ikkereplace() giver en ny streng tilbage til os, hvor alle 'd'-tegn er erstattet med 'f', men den bliver smidt væk med det samme, da vi ikke bruger returværdien.
I stedet skal vi huske returværdien:
String s2;
s2 = s.replace('d','f'); // s forandres ikke, men s2 husker resultatetNu bliver resultat-strengen gemt vha. s2 (den streng s peger på er som sagt uforandret).
Her ses samlet et eksempel på, hvordan man bruger streng:
// BenytStrenge2.java
public class BenytStrenge2
{
public static void main (String[] arg)
{
String s1, s2, s3, s4;
s1 = "Ude godt, men hjemme bedst.";
s1.toUpperCase(); // lav store bogstraver, men smid resultatet væk
s2 = s1.toUpperCase(); // lav store bogstraver fra s1, gem det i s2
s3 = s2.replace('E', 'X'); // erstat E med X på s2 og gem resultatet i s3
s4 = s3.substring(4, 16); // tag delstreng på s3 og gem resultatet i s4
System.out.println ("s1: " + s1); // s1 er stadig med små bogstaver
System.out.println ("s2: " + s2); // s2 har ikke fået ændret E til X
System.out.println ("s3: " + s3); // s3 er ikke delstrengen på plsds 4-16
System.out.println ("s4: " + s4); // s4 er delstrengen på plsds 4-16
}
}
s1: Ude godt, men hjemme bedst. s2: UDE GODT, MEN HJEMME BEDST. s3: UDX GODT, MXN HJXMMX BXDST. s4: GODT, MXN HJ
Variablerne s1, s2, s3 og s4 får tildelt en reference til hvert sit strengobjekt, og derefter ændrer deres indhold sig ikke, uanset hvilke metoder der kaldes på objekterne.
Bemærk, at selvom streng-objekterne i sig selv er uforanderlige, kan streng-variablerne godt ændres:
s = s.replace('d','f'); // sæt s til at referere resultatet af replace()
Forskellen mellem en metode, der ændrer på det objekt, den bliver kaldt på, og en metode, der returnerer en værdi, kan være svær at forstå i starten, men det kommer i takt med, at du programmerer selv.
De andre klasser, vi har set indtil nu, har vi brugt til at skabe nye objekter med. Når vi skulle lave et nyt Point-objekt, kaldte vi dens konstruktør vha. new, f.eks.:
Point p;p = new Point(0,0);
Lige netop med strenge behøves det ikke. Her skriver man typisk:
String s;s = "Ude godt";
Man kan godt skrive:
s = new String("Ude godt");I det sidste tilfælde skabes et nyt String-objekt, som også indeholder teksten "Ude godt", så der i lageret er to strenge med samme indhold, hvilket er unødvendigt. Netop fordi strenge ikke kan ændres, når de først er skabt, har man aldrig brug for kopier. Hvorfor skulle man lave en kopi, når den alligevel altid vil være helt den samme som originalen?
I tabellen over Strings metoder er der en, der er nævnt to gange; substring(). Den findes i to varianter: substring(int startindeks) og substring(int startindeks, int slutindeks).
Hvilken variant der kaldes i BenytStrenge2.java ved tildelingen af s4 kan man se ud fra, hvilke parameterlister der passer sammen. I dette tilfælde den metode med to parametre.
Så længe der er forskel på antallet af parametre, er det simpelt nok, ellers må man kigge på typerne af parametrene.
Operatoren + bruges ikke kun til at lægge tal sammen. Hvis enten højre- eller venstre-siden er en streng, bliver + opfattet som: "konverter begge sider til strenge, og sæt dem i forlængelse af hinanden til en samlet streng".
Hvis man f.eks. skriver:
Point p;
p=new Point(1,1);
System.out.println("Svaret er: "+p);
Svaret er: java.awt.Point[x=1,y=1]
Sker der i computeren nogenlunde følgende:
String s1; String s2; String s3; s1 = "Svaret er: "; s2 = p.toString(); // toString() er en metode alle objekter har s3 = s1 + s2; System.out.println(s3);
Metoden toString() laver en streng-repræsentation af et objekt. Alle objekter har en toString()-metode, og oversætteren sætter kode ind, der kalder toString(), hvis den møder et + mellem en streng og en anden slags objekt.
Alle de simple typer kan også laves om til strenge med +:
int i;
i = 42;
System.out.println("Svaret er: "+i);Java kigger ikke på indholdet af strengene, så "2" (som streng) + 3 (som tal) giver "23" (som streng).
Man kan altså bruge operatoren + til et lille trick: For at få noget repræsenteret som en streng kan man sammensætte det med en tom streng:
String s; int i; i = 42; s = ""+i; // nu refererer s til strengen "42"
Man kan derimod ikke skrive:
s = i; // sprogfejl: konverterer ikke automatisk fra int til String.
...eller...
i = s+1; // sprogfejl: konverterer ikke automatisk fra String til int.
... selvom s er "42".
Umiddelbart kunne man fristes til at sammenligne to strenge med == ligesom med de simple typer. Det går ofte (men ikke altid) godt:
s1 = "Hej verden";
s2 = s1;
if (s1 == s2) System.out.println("s1 og s2 er ens."); // forkert!
else System.out.println("s1 og s2 er IKKE ens.");
s1 og s2 er ens.
Imidlertid sammenligner == referencerne til (adresserne på) objekterne, ikke indholdet af dem. Sammenligningen s1==s2 går godt, fordi s1 og s2 refererer til samme objekt.
Derfor vil det gå galt, hvis s1 og s2 refererer til to objekter forskellige steder i hukommelsen, selvom de har samme indhold:
s1 = "Hej verden";
s2 = "Hej " + s1.substring(4); // giver "Hej "+"verden" = "Hej verden"
if (s1 == s2) System.out.println("s1 og s2 er ens."); // forkert!
else System.out.println("s1 og s2 er IKKE ens.");
s1 og s2 er IKKE ens.
I stedet bør man kalde equals()-metoden, dvs. spørge et af objekterne "har du samme indhold som dette objekt?" og give det andet objekt som parameter:
if (s1.equals(s2)) System.out.println("s1 og s2 er ens."); // korrekt
else System.out.println("s1 og s2 er IKKE ens.");
s1 og s2 er ens.
Dette gælder i virkeligheden ikke kun strenge. Alle objekter har en equals()-metode, som kan bruges til at afgøre, om to objekter er ens, og den bør man bruge i stedet for ==.
Sammenligning af adresser på objekter sker med ==
Sammenligning af objekters indhold sker med equals()-metoden
xxx skriv om, nu eksisterer public String replaceAll(String regex, String replacement) ??
Skriv et program, der finder positionen af
det første mellemrum i en streng.
(vink: Brug metoden
indexOf(" "))
Skriv et program, der fjerner det første ord i en sætning (indtil første mellemrum).
Skriv et program, der fjerner den første
forekomst af ordet "måske" fra en tekst.
Ændr
derefter programmet, så det fjerner alle forekomster af ordet
(brug en løkke).
Skriv et program, der finder og fjerner alle forekomster af ordet "måske" fra en tekst, uanset om det er skrevet med store eller små bogstaver.
Skriv et program, der tæller antallet af kommaer i en tekst.
Skriv et program, der undersøger, om
en tekst er et palindrom, dvs. med samme stavning forfra og
bagfra (som f.eks. "regninger", "russerdressur",
"vær dog god ræv").
(vink: Træk de
enkelte tegn ud af strengene med substring(n,n+1), og husk, at
strengobjekter skal sammenlignes med .equals()-metoden:
s1.equals(s2)).
Udvid programmet til at tage højde for store/små bogstaver, tegnsætning og mellemrum, sådan at de følgende palindromer også genkendes: "Selmas lakserøde garagedøre skal samles" og "Åge lo, da baronesse Nora bad Ole gå".
En ArrayList er en liste af objekter, der bliver nummereret efter et indeks.

Konstruktører og metoder er beskrevet i appendiks, afsnit 3.9.7.
En ArrayList er en liste af andre objekter
Man opretter en ArrayList med f.eks.:
ArrayList liste; liste = new ArrayList();
Derefter kan man tilføje et element til listen med liste.add( objekt ), f.eks.:
liste.add("æh");der tilføjer strengen "æh" til listen.
Man kan sætte ind midt i listen med liste.add( int indeks , objekt ), f.eks.:
liste.add(0,"øh");
der indsætter "øh" på plads nummer 0, sådan at listen nu indeholder først "øh" og så "æh". Alle elementerne fra og med det indeks, hvori man indsætter, får altså rykket deres indeks et frem.
Man henter elementerne ud igen med liste.get( indeks ).
Med liste.size() får man antallet af elementer i listen, i dette tilfælde 2.
Nogle af ArrayList-klassens metoder
Metoder
void add ( element )
Føjer
element til listen. element
kan være et vilkårligt objekt (men ikke en simpel type
som int eller double). xxx tjek JDK1.5
void add ( int indeks ,
element )
Indsætter element
i listen lige før plads nummer indeks. Første
element er på plads nummer 0.
void remove ( int indeks
)
Sletter elementet på plads
nummer indeks.
int size ()
returnerer
antallet af elementer i listen.
Object get (int
indeks)
Returnerer en reference til objektet på plads nummer
indeks (regnet fra 0). Husk
at lave en typekonvertering af referencen til den rigtige
klasse, før resultatet lægges i en variabel (se
nedenfor). xxx tjek JDK1.5
String toString
()
returnerer listens indhold som en streng. Dette sker ved at
konvertere hver af elementerne til en streng.
ArrayList-klassen skal importeres med import java.util.*; før den kan bruges

listen
lige efter
indsættelse af "buh"
import java.util.*;
public class BenytArrayList
{
public static void main(String[] arg)
{
ArrayList liste; // opret liste-variabel
liste = new ArrayList(); // opret liste-objekt
liste.add("æh"); // tilføj til listen
liste.add("bæh");
liste.add("buh");
System.out.println("Listen har elementerne "+liste.toString());
liste.add(2,"og");
System.out.println("Nu har listen "+liste);//toString() kaldes implicit
liste.remove(0);
System.out.println("Nu har listen "+liste+" og størrelsen "+liste.size());
System.out.println("På plads nummer 2 er: "+liste.get(2));
for (int i=0; i<liste.size(); i++)
System.out.println("På plads nummer "+i+" er: "+liste.get(i));
}
}
l har elementerne [æh, bæh, buh] Nu har l elementerne [æh, bæh, og, buh] Nu har l elementerne [bæh, og, buh] og størrelsen 3 På plads nummer 2 er: buh xxx regenereres
Vi indsætter først tre (referencer til) strenge i listen (se figur). Dernæst lægges "og" ind på plads nummer 2, dvs. efter "bæh" og før "buh". Til sidst fjernes "æh" på plads nummer 0.
Lister af typen ArrayList kan blive vilkårligt lange. De sørger selv for at reservere mere hukommelse, hvis det bliver nødvendigt.
I det næste eksempel lægges tre Point-objekter ind i en liste, og listen gennemløbes for at finde punktet med den mindste afstand til (0,0) (også kaldet origo).
Læg mærke til, hvordan man kan gennemløbe en liste:
for (int n=0;n<pl.size();n++)
{
Point p;
p = (Point) pl.get(n); // punkt nr n hentes ud af listen
// (typekonvertering nødvendig)
//...
}Da lister kan indeholde objekter af alle mulige typer, er man nødt til at lave en typekonvertering af den objekt-reference, som get() returnerer.
import java.awt.*;
import java.util.*;
public class MindsteAfstand
{
public static void main(String[] arg)
{
ArrayList pl; // punkt-liste
Point origo, p1, p2, p3;
double minDist = 10000;
pl = new ArrayList();
origo = new Point(0,0);
p1 = new Point(0,65);
p2 = new Point(50,50);
p3 = new Point(120,10);
pl.add(p1);
pl.add(p2);
pl.add(p3);
for (int n=0;n<pl.size();n++)
{
double dist;
Point p;
p=(Point) pl.get(n); // punkt nr n hentes ud af listen
// (typekonvertering nødvendig)
dist = origo.distance(p);
if (dist<minDist)
{
minDist=dist;
}
}
System.out.println("Den mindste afstand mellem punkterne "
+pl+" og (0,0) er "+minDist);
}
}
Den mindste afstand mellem punkterne [java.awt.Point[x=0,y=65], java.awt.Point[x=50,y=50], java.awt.Point[x=120,y=10]] og (0,0) er 65.0
Her er en lille stump programkode, der i stedet finder den mindste afstand mellem to punkter, der ligger ved siden af hinanden i listen:
for (int n=0;n<pl.size()-1;n++)
{
double dist;
Point p,q;
p=(Point) pl.get(n);
q=(Point) pl.get(n+1);
dist = q.distance(p);
if (dist<minDist)
{
minDist=dist;
}
}
Og herunder er vist, hvordan man kan finde den mindste afstand mellem alle punkterne:
for (int n=0;n<pl.size()-1;n++)
{
for (int k=n+1;k<pl.size();k++)
{
double dist;
Point p,q;
p=(Point) pl.get(n);
q=(Point) pl.get(k);
dist = q.distance(p);
if (dist<minDist)
{
minDist=dist;
}
}
}
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.
I det følgende bruges nogle af de metoder, der er nævnt i appendikset om ArrayList (3.9.7).
Dette program blander nogle spillekort (beskrevet som strenge2) i en liste. 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[] arg)
{
ArrayList bunke = new ArrayList();
// Opbyg bunken
for (int n=2; n<9; n++)
{
bunke.add("ruder"+n); // ruder
bunke.add("klør"+n); // klør
bunke.add("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 = (int) (Math.random() * antalKort); // find en tilfældig plads
String kort = (String) bunke.get(nr); // tag et kort ud
bunke.remove(nr);
nr = (int) (Math.random() * antalKort);
bunke.add(nr,kort); // 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]
Har man brug for at dele strenge op i mindre dele, kan det gøres med et StringTokenizer-objekt, der deler en streng op i bidder (eng.: tokens) efter bestemte skilletegn.
xxx Nævn ny String-metode: public String[] split(String regex)
En StringTokenizer oprettes med den streng, der skal deles:
StringTokenizer strengbidder = new StringTokenizer("Hej kære venner!");Herefter kan man med metoden nextToken() få bidderne frem en efter en. Metoden hasMoreTokens() er sand, hvis der er flere bidder, og falsk, når vi når forbi den sidste bid:
import java.util.*;
public class BenytStringTokenizer
{
public static void main(String[] arg)
{
StringTokenizer strengbidder = new StringTokenizer("Hej kære venner!");
while (strengbidder.hasMoreTokens())
{
String bid = strengbidder.nextToken();
System.out.println("bid: "+bid);
}
}
}
bid: Hej bid: kære bid: venner!
Normalt opdeles efter blanktegn3, og strengen bliver derfor delt op i ord. Ønsker man at opdele efter andet end blanktegn, kan man bruge en anden af StringTokenizer's konstruktører (i appendiks 3.9.5 er StringTokenizer-klassen beskrevet).
Herunder opdeler vi en formel efter både "+" og "-". Den sidste parameter angiver, at vi godt vil have skilletegnene, dvs. + og -, ud som selvstændige bidder (i stedet for at de smides væk som ligegyldige):
import java.util.*;
public class BenytStringTokenizer2
{
public static void main(String[] arg)
{
StringTokenizer bidder = new StringTokenizer("2*x*x +8*x -5", "+-", true);
while (bidder.hasMoreTokens())
{
String bid = bidder.nextToken();
bid = bid.trim(); // fjern mellemrum omkring hver bid
if (bid.equals("+")) System.out.print(" plus ");
else if (bid.equals("-")) System.out.print(" minus ");
else System.out.print("'" + bid + "'");
}
System.out.println();
}
}
'2*x*x' plus '8*x' minus '5'
Bemærk, at vi kalder trim() for at fjerne eventuelle blanktegn omkring hver bid.
Date-klassen repræsenterer et punkt i tiden (en dato og et klokkeslæt).

For at oprette et dato-objekt, der repræsenterer dags dato og tid, skriver vi:
Date netopNu; netopNu = new Date(); // dags dato og tidspunkt lige nu
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 får å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 appendiks 3.9.6 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[] arg)
{
Date netopNu;
Date jacob;
netopNu = new Date(); // dags dato og tidspunkt lige nu
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 (beskrevet i afsnit 3.10.5) 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).
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).
Skriv et program, der udskriver datoen for i morgen, om en uge og om et år.
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 metoden before() til at tjekke, om du er nået frem til nu).
Her finder du en oversigt over de vigtigste klasser og deres vigtigste metoder. På siden http://java.sun.com/j2se/1.4/docs/api findes en komplet oversigt.
Nogle af metoderne er markeret med (frarådes). Det betyder, at denne metode er frarådet (eng.: deprecated), men findes endnu af hensyn til programmer skrevet til tidligere versioner af Java. Oversætteren advarer mod brugen med '... has been deprecated', men programmet kører i øvrigt fint.
Point repræsenterer et punkt med en x- og y-koordinat.
java.awt.Point - punkter med en x- og y-koordinat - skal importeres med import java.awt.*;
Variabler
int x x-koordinaten
int y y-koordinaten
Konstruktører
Point()
Opretter et punkt i (0,0).
Point(int
x, int y)
Opretter et punkt i (x,y).
Point(Point
p)
Opretter et punkt med samme (x,y)-koordinater som p.
Metoder
void
move(int x, int y)
Sætter punktets koordinater.
void
translate(int x, int y)
Rykker punktets koordinater
relativt i forhold til, hvor det er.
double distance(Point
etAndetPunkt) JDK1.2
Giver afstanden fra punktet til
etAndetPunkt.
boolean equals(Object
obj)
Undersøger, om punktet har samme koordinater som obj.
Returnerer true, hvis det er tilfældet, og false, hvis obj ikke
er et punkt, eller hvis det har andre koordinater.
String
toString()
giver en strengrepræsentation af punktet
med (x,y)-koordinater, f.eks. java.awt.Point[x=0,y=0]
Rectangle repræsenterer et todimensionalt rektangel.
java.awt.Rectangle - todimensionalt rektangel - skal importeres med import java.awt.*;
Variabler
int x x-koordinat på øverste venstre hjørne
int y y-koordinat på øverste venstre hjørne
int width bredden
int height højden
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.
Rectangle(Point
p)
opretter et rektangel i p, hvis bredde og højde
er 0.
Metoder
void
add (Point p)
udvider rektanglet sådan, at det også omfatter
punktet p.
void
translate (int x, int y)
rykker rektanglets koordinater
relativt i forhold til, hvor det er.
boolean
contains (Point
p)
returnerer true, hvis p
er inden for rektanglet, ellers false.
boolean
intersects (Rectangle
r)
returnerer true, hvis rektanglet og r
overlapper.
Rectangle
intersection (Rectangle
r)
undersøger overlappet (fællesmængden,
snitmængden) mellem rektanglet og r
og returnerer et rektangel, der repræsenterer det fælles
overlap.
Rectangle
union(Rectangle
r)
returnerer et rektangel, der repræsenterer
foreningsmængden, dvs. det mindste rektangel, der
indeholder både r
og dette rektangel.
boolean equals(Object
obj)
Undersøger, om rektanglet har samme koordinater og mål
som obj. Returnerer true,
hvis det er tilfældet, og false, hvis obj ikke er et rektangel,
eller hvis det har andre koordinater eller mål.
String
toString()
giver en strengrepræsentation af
rektanglet med (x,y)-koordinater og mål.
Strenge er specielle ved, at de ikke kan ændres, når de først er oprettet.
java.lang.String - tekststrenge
xxx opdater med public String[] split(String regex)
xxx public String replaceAll(String regex, String replacement)
char charAt (int
indeks)
returnerer tegnet på det angivne indeks.
Indeks tæller fra 0.
String replace (char
gammeltTegn, char nytTegn)
returnerer en ny streng, som er
identisk med denne streng, bortset fra at alle forekomster af
gammeltTegn er erstattet med nytTegn.
String substring (int
startindeks)
Returnerer en ny streng, som er en del af denne
streng. Delstrengen starter ved startindeks og går
til slutningen.
String substring (int
startindeks, int slutindeks)
Returnerer en ny streng, som er en
del af denne streng. Delstrengen starter ved startindeks
og slutter ved slutindeks (til og med slutindeks-1).
String toLowerCase
()
returnerer en ny streng, som er identisk med denne streng,
bortset fra at alle store bogstaver er erstattet med små.
String toUpperCase
()
returnerer en ny streng, som er identisk med denne streng,
bortset fra at alle små bogstaver er erstattet med store.
String trim ()
returnerer
en ny streng, som er identisk med denne streng, bortset fra at alle
blanktegn, tabulatortegn, linieskift etc. er fjernet fra begge ender
af strengen.
int length ()
returnerer
længden af (antal tegn i) strengen.
int indexOf (String
str)
returnerer indekset på den første forekomst af
str som delstreng. Hvis str ikke er en delstreng,
returneres -1.
int
lastIndexOf (String str)
returnerer indekset på den
sidste forekomst af str
som delstreng. Hvis str
ikke er en delstreng, returneres -1.
boolean startsWith (String
str)
returnerer sand, hvis denne streng starter med de samme tegn
som str, ellers falsk.
boolean endsWith (String
str)
returnerer sand, hvis denne streng slutter med de samme tegn
som str, ellers falsk.
boolean equals (String
str)
returnerer sand, hvis denne streng har samme indhold som str,
ellers falsk.
boolean
equalsIgnoreCase (String str)
returnerer sand, hvis denne
streng har samme indhold som str, ellers falsk. Der skelnes
ikke mellem store og små bogstaver.
To strenge s1 og s2 sammenlignes ved at kalde s1.equals(s2), ikke med s1==s2 (der sammenligner objektreferencer).
Visse tegn kan man ikke skrive direkte i tekststrenge i kildeteksten. De er opført herunder:
|
Ønsket tegn |
I kildeteksten skrives |
|---|---|
|
Tabulator |
\t |
|
Linieskift (eng.: newline) |
\n |
|
Vognretur (eng.: carriage return). Bruges sjældent |
\r |
|
Bak (eng.: backspace). Bruges sjældent |
\b |
|
Anførelsestegn " |
\" |
|
Apostrof ' |
\' |
|
En bagstreg \ (eng.: backslash) |
\\ |
|
Unikode-tegn nummer XXXX |
\uXXXX |
Unikode-tegn skrives som fire hexadecimale cifre (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F). F.eks. kan de græske bogstaver findes på "\u0390" til "\u03F3" (det græske pi skrives med "\u03C0"), og de kyrilliske tegn findes fra "\u0400" til "\u047F". Unikode-tegntabellen kan findes på http://unicode.org
Eksempler:
System.out.println("Jacob\n\n\n\tNordfaaa\b\blk");
Jacob Nordfalk
System.out.println("\t\"At være eller ikke være\n\tdet er spørgsmålet.\"");
System.out.println("\t\t\t\t\t\t\t\t\t\tShakespeare");
"At være eller ikke være
det er spørgsmålet."
ShakespeareStringTokenizer hjælper med at dele strenge op i bidder. Se også afsnit 3.6.2.
java.util.StringTokenizer - opdeler en streng - skal importeres med import java.util.*;
Konstruktører
StringTokenizer(String
streng_der_skal_deles)
opretter et StringTokenizer-objekt, som er
klar til at opdele streng_der_skal_deles efter blanktegn.
StringTokenizer(String
streng_der_skal_deles, String skilletegn)
opretter et
StringTokenizer-objekt, som er klar til at opdele
streng_der_skal_deles efter skilletegn.
StringTokenizer(String streng,
String skilletegn, boolean giv_skilletegn_som_bidder)
er
giv_skilletegn_som_bidder sand, vil skilletegn også
blive returneret som bidder af nextToken().
Metoder
boolean hasMoreTokens
()
returnerer sand, hvis der er flere bidder tilbage.
String nextToken
()
returnerer næste bid.
Date repræsenterer en tid, dvs. en dato og et klokkeslæt. Se også afsnit 3.6.3.
java.util.Date - et tidspunkt - skal importeres med import java.util.*;
Konstruktører
Date ()
opretter et Date-objekt,
som repræsenterer tidspunktet, da det blev oprettet.
Date (long
tid_i_millisekunder)
opretter et Date-objekt, som repræsenterer
et tidspunkt, der er tid_i_millisekunder efter 1. januar 1970
kl 00:00:00 GMT.
Date (int år, int måned,
int dag, int timer, int minutter) (frarådes)
opretter
et Date-objekt med det givne tidspunkt. Bemærk, at år
regnes fra år 1900 (1997 svarer til år=97),
og måned regnes
fra 0 (januar svarer til måned=0).
Date (String
dato) (frarådes)
opretter
et Date-objekt, som repræsenterer det tidspunkt, dato
indeholder.
Metoder
long getTime ()
returnerer
antal millisekunder siden 1. januar 1970 kl. 00:00:00 GMT
repræsenteret af dette Date-objekt.
void setTime (long
tid_i_millisekunder)
ændrer dette Date-objekt til at
repræsentere et tidspunkt, der er tid_i_millisekunder
efter 1. januar 1970 kl 00:00:00 GMT.
boolean after (Date
hvornår)
undersøger, om denne dato er efter
hvornår-datoen.
boolean before (Date
hvornår)
undersøger, om denne dato er før
hvornår-datoen.
String toString
()
returnerer en strengrepræsentation af formen: ugedag mm
dd tt:mm:ss åååå (f.eks. Man 5. juli 15:23:18
2000). Denne metode kaldes automatisk, hvis man forsøger at
lægge en dato sammen med en streng med +-operatoren.
int getDate
() (frarådes)
returnerer dagen i måneden
repræsenteret af dette objekt.
void setDate (int
dag). (frarådes)
ændrer
dagen i måneden til dag.
Sættes den til en dag uden for denne måned, opfattes det
som om måneden skal ændres tilsvarende, f.eks. vil
setDate(32) gå ind i næste måned.
Tilsvarende findes getYear(), setYear(), getMonth(), setMonth(), getHours(), setHours(), getMinutes(), setMinutes(), getSeconds() og setSeconds(). (frarådes)
(frarådes): Disse metoder blev frarådet fra JDK version 1.1, fordi de ikke understøtter andre kalendere end det gregorianske kalendersystem, der bruges i den vestlige verden. Det betyder dog ikke det store for europæiske programmer.
ArrayList er en liste af andre objekter.
java.util.ArrayList - en liste af objekter - skal importeres med import java.util.*;
Konstruktører
ArrayList ()
opretter en tom
ArrayList.
Metoder
void add( element )
Føjer
element til listen. element
kan være et vilkårligt objekt (men ikke en simpel type
som int eller double). xxx tjek JDK1.5
void add( int indeks ,
element )
Indsætter element
i listen lige før plads nummer indeks. Første
element er på plads nummer 0.
void remove( int indeks
)
Sletter elementet på plads
nummer indeks.
boolean isEmpty()
returnerer
sand, hvis listen er tom (indeholder 0 elementer).
int size()
returnerer
antallet af elementer i listen.
Object get(int
indeks)
returnerer en reference til objektet på plads nummer
indeks. Husk at lave en
typekonvertering af referencen til den rigtige klasse, før
du bruger resultatet. xxx tjek JDK1.5
boolean contains( objekt
)
returnerer sand, hvis objekt
findes i listen.
int indexOf( objekt
)
returnerer indekset på første forekomst af objekt
i listen. Hvis den ikke findes, returneres -1.
Iterator iterator()
giver
en iterator, som kan bruges til at gennemløbe listens
elementer. Se HashMap i næste afsnit (avanceret) for et
eksempel på brug af en iterator.
String toString
()
returnerer listens indhold som en streng. Dette sker ved at
konvertere hver af elementerne til en streng.
1p er ikke objektet selv. p er kun en reference (pegepind, pointer) til objektet. Endnu har p ikke nogen værdi (man siger, at den er null, dvs. referencen peger ingen steder hen).
2I et rigtigt program ville de enkelte kort nok være repræsenteret med objekter fra en Kort-klasse, hvor hvert Kort-objekt har objektvariablerne farve og værdi.
3Blanktegnene er: linieskift "\n" og "\r", sideskift "\f", mellemrum " " og tabulatortegnet "\t".