Java
Forord
redigérDet mest af denne bog er også taget fra http://javabog.dk, med tilladelse.
I denne bog kan du lære tre ting:
- Programmering. Bogen starter fra grunden af, men har du ikke programmeret før, bør du være rede til at gøre en indsats, dvs. løbende lave en række små programmer, for at øve dig i stoffet. Det forudsættes, at du har kendskab til computere på brugerniveau, dvs. at du uden problemer kan bruge internet, tekstbehandling og andre programmer og problemfrit navigere og flytte og kopiere filer i Windows, Linux eller et andet styresystem. En smule kendskab til matematik er en fordel, men bestemt ikke et krav.
- Objektorienteret programmering. Bogen arbejder grundigt med begreberne omkring objektorienteret programmering (forkortet OOP) og har mange praktiske eksempler på denne måde at programmere på. Den introducerer og anvender løbende relevante dele af UML-notationen, som er meget anvendt i objektorienteret analyse og design og beslægtede fag.
- Java. Programmeringssproget Java har en række faciliteter, som kan lette programmeringen meget. Har du - som mange andre - lært Java ved at prøve dig frem, kan det overblik, der præsenteres i denne bog, hjælpe, samtidig med, at hvert kapitel slutter af med at gå i dybden med avancerede emner.
Java
redigérJava kan downloades fra http://www.java.com, herfra er der et link til at download den nyeste version af Java hvis du ikke skulle have dette.
Javaudviklingsværktøjer
redigérDer findes mange programmer, som kan bruges til udviklingen af Java-programmer.
Følgende programmer er licensfri, dvs. at den fulde funktionalitet står til rådighed:
Følgende programmer koster til dels penge, men der findes også licenser der giver adgang til en begrænset del af funktionaliteterne:
Grundlæggende programmering
redigérLad os se på et simpelt javaprogram, der skriver "Hej verden" og et citat af Storm P. ud til skærmen. Neden under den vandrette linje er vist, hvad der sker, hvis programmet køres:
// Et simpelt program, der skriver "Hej verden" // og et citat af Storm P. ud til skærmen // Denne fil skal have navnet: HejVerden.java public class HejVerden { public static void main (String[] arg) { System.out.println("Hej Verden!"); System.out.println("Hvornår smager en Tuborg bedst?"); System.out.println("Hver gang!"); } }
Resultat på skærm, når det lille program køres.:
Hej Verden! Hvornår smager en Tuborg bedst? Hver gang!
Kommentar
redigérKommentarer er dokumentation beregnet på, at gøre programmets kildetekst lettere at forstå for læseren. De påvirker ikke programudførelsen.
De første 3 linjer, der starter med //, er kommentarer:
- // Et simpelt program, der skriver "Hej verden"
- // og et citat af Storm P. ud til skærmen
- // Denne fil skal have navnet: HejVerden.java
I dette tilfælde beskriver kommentarerne, hvad programmet gør og hvilket filnavn kildeteksten bør gemmes i.
Kommentarer bliver sprunget over af fortolkeren og har ingen indflydelse på, hvad programmet gør.
Kommentarer bør skrives, så de giver læseren forståelse for, hvordan programmet virker - uden at være tvetydige eller forklare indlysende ting.
// markerer, at resten af linjen er en kommentar. Den kan også bruges efter en kommando til at forklare, hvad der sker, f.eks.
- System.out.println("Hej verden!"); // Udskriv en hilsen
Java har også en anden form for kommentarer, som kan være nyttig til kommentarer over flere linjer: Man kan starte en kommentar med /* og afslutte den med */. Al tekst mellem /* og */ bliver så opfattet som kommentarer. Vi kunne altså også skrive:
- /*
- Et simpelt program, der skriver "Hej verden"
- og et citat af Storm P. ud til skærmen
- Denne fil skal have navnet: HejVerden.java
- */
og
- System.out.println("Hej verden!"); /* Udskriv en hilsen */
Strukturdelen
redigérStrukturdelen vil ikke blive ændret i de næste to kapitler, og det er ikke så vigtigt, at du forstår, hvad der foregår i første omgang.
Al javakode er indkapslet i en klasse mellem { og } (blokstart og blokslut-parenteser). Beskrivelsen af en klasse er altid indkapslet i en blok bestående af:
public class HejVerden { ... }
Inde i klassen står der en main-metode med nogle kommandoer i.
public static void main (String[] arg) { ... }
Indholdet af metoden er altid indkapslet i en blok med { og }.
Programudførelsen starter i metoden:
- public static void main (String[] arg)
Programkode
redigérI main-metoden giver man instruktioner til computeren:
System.out.println("Hej verden!"); System.out.println("Hvornår smager en Tuborg bedst?"); System.out.println("Hvergang!");
Instruktionerne udføres altid en efter en, ovenfra og ned. Hver instruktion afsluttes med et semikolon.
Disse 3 instruktioner skriver 3 strenge ("Hej verden!", ...) ud til skærmen. En streng er en tekst, som computeren kan arbejde med. Strenge er altid indkapslet i "".
Hver instruktion består af et kald til metoden System.out.println, som betyder, at der skal udskrives noget til skærmen og en streng som parameter.
En parameter er en oplysning, som man overfører til metoden. I dette tilfælde hvilken tekst, der skal skrives ud til skærmen.
Vores main-metode kalder altså andre metoder.
Variabler
redigérVariabler bruges til at opbevare og ændre data. En variabel kan opfattes som en navngiven papirlap, hvor der til enhver tid kan stå netop én ting.
Variabler skal altid erklæres, dvs. at man skal fortælle computeren, at der skal oprettes en variabel, hvad slags data den skal indeholde og hvad den skal hedde.
En variabel er et navn på et sted i computerens hukommelse, beregnet på at indeholde data af en bestemt type En variabel erklæres ved at skrive datatype variabelnavn; Det er en god vane, at give variablerne sigende navne. Navnene bør starte med et lille bogstav.
Datatyper
redigérI Java findes der følgende grundlæggende datatyper, man kalder dem også for de primitive datatyper:
Datype | Beskrivelse | Størrelse | Objekt variant |
---|---|---|---|
long | Heltal | 64 bit (2s komplement) | Long |
int | Heltal | 32 bit (2s komplement) | Integer |
short | Heltal | 16 bit (2s komplement) | Short |
byte | Heltal | 8 bit (2s komplement) | Byte |
double | Decimaltal | 64 bit | Double |
float | Decimaltal | 32 bit | Float |
char | Unicode karakter | 16 bit | Character |
boolean | Boolsk værdi | true/false | Boolean |
De primitive datatyper er konstante på alle platforme.
Løkker
redigérEn løkke er en gentaget udførelse af en kommando igen og igen. Hvor mange gange løkken udføres, afhænger af et logisk udtryk.
While
redigérwhile-løkken har formen:
- while (betingelse) kommando;
Kommandoen udføres igen og igen, så længe betingelsen er opfyldt. Dvs. før kommandoen udføres, undersøges betingelsen og det kontrolleres, at den er opfyldt (se rutediagrammet til højre).
Oftest vil man udføre mere en én kommando og anvender derfor en blok til at samle kommandoerne:
- while (betingelse) {
- kommando1;
- kommando2;
- ...
- }
Her er et eksempel:
public class Alder4 { public static void main(String[] arg) { int alder; alder = 15; while (alder < 18) { System.out.println("Du er "+alder+" år. Vent til du bliver ældre."); alder = alder + 1; System.out.println("Tillykke med fødselsdagen!"); } System.out.println("Nu er du "+alder+" år og myndig."); } }
For
redigérfor-løkken er specielt velegnet til løkker med en tællevariabel. Den har formen
- for (initialisering; betingelse; handling) kommando;
- initialisering er en (evt.: erklæring og) tildeling af en tællevariabel, f.eks. alder = 15
- betingelse er et logisk udtryk, der angiver betingelsen for, at løkken skal fortsætte med at blive udført, f.eks. alder < 18
- handling er typisk en optælling i tællevariablen, f.eks. alder = alder + 1
Det kan indenad læses som "for startværdi, så længe betingelse udfør: kommando og opdatering, f.eks. "for alder = 15, så længe alder < 18 udfør: Skriv "du er.." og tæl alder 1 op".
En for-løkke og en while-løkke supplerer hinanden. De har præcis samme funktion, men for-løkken er mere kompakt og bekvem, når man ønsker at lave en almindelig løkke, der udføres et bestemt antal gange. Dette program gør det samme som Syvtabel-eksemplet, men med en for-løkke:
public class Syvtabel2 { public static void main(String[] arg) { int n; for (n=1; n<=10; n=n+1) System.out.println(n+" : "+ 7*n); } }
Med java 5 er der kommet en ny For løkke type: for(Variabel: liste)
public class foreachtest { public static void main(String[] arg) { int[] i = {1,2,3,4}; for (int val: i) System.out.println(" V" + val); } } ---------------------------------------- Resultat V1 V2 V3 V4
Det er det nogen kalder for en foreach løkke
Uendelige løkker
redigérHvis programmøren ikke er omhyggelig, kan han komme til at lave en løkke, hvor betingelsen vedbliver at være sand. Så bliver programudførelsen i løkken i al evighed (eller indtil brugeren afbryder programmet).
Lad os f.eks. sige, at programmøren er kommet til at skrive '-' i stedet for '+' i opdateringen af n i for-løkken fra Syvtabel-programmet. Nu vil computeren tælle nedad:
public class SyvtabelFejl { public static void main(String[] arg) { for (int n=1; n<=10; n=n-1) System.out.println(n+" : "+ 7*n); } }
Objekter
redigérDefinition af klasser
redigérNedarvning
redigérPakker
redigérAvanceret Java
redigérFlertrådet programmering
redigérReflektion
redigérUdvikling af Applikationer med grafisk brugergrænseflade
redigérTil udviklingen af applikationer med en grafisk brugergrænseflade findes der indenfor java forskellige muligheder.
- AWT - Abstract Window Toolkit
Et bibliotek med klasser, der gør det muligt at skabe simple brugergrænseflader. De første programmer/appletter benyttede udelukkende dette bibliotek.
- Swing
Et bibliotek af java klasser, hvor det er muligt at skabe mere avancerede brugergrænseflader. Man kan sige at Swing er en overbygning til AWT.
I dette kapitel vil der blive beskrevet, hvordan man ved hjælp af Swing biblioteket udvikler en grafisk brugergrænseflade. Der vil blive beskrevet forskellige temaer med stigende sværhedsgrad.
Vis et vindue
redigérDet mest fundamentale ved et grafisk Java program er et vindue. Vi vil starte med et simpelt eksempel på, hvordan man laver et vindue. I vinduet skal der stå: "Vi programmerer Swing"
package simplegui1; import javax.swing.JFrame; import javax.swing.JLabel; public class SimpleGui1 { //Variabel som definerer et vindue. private JFrame frame = new JFrame("Simple GUI"); /** Metode der opretter en instans af SimpleGui1 */ public SimpleGui1() { //Her definerer vi vores tekst JLabel label = new JLabel("Vi programmerer Swing"); //Her tilføjes teksten til vinduet frame.getContentPane().add(label); //Her bestemmes der hvad der sker når man lukker vinduet. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Her startes vinduet frame.setVisible(true); } //Start metode public static void main(String[] args) { SimpleGui1 simplegui = new SimpleGui1(); } }
Hvis ovenstående kopieres ind i en fil kaldet "SimpleGui1.java", kompileres og startes, så skulle der gerne vises et vindue uden menu, men med standard lukke- og maksimere/minimere-knapper.
JFrame klassen benyttes til at lave vinduer med.
JFrame frame = new JFrame("Simple GUI");
Ved definitionen af et vindue, er det vigtigt at fortælle, hvad der sker når vinduet lukkes.
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Denne linje sørger for, at applikationen afsluttes, når der trykkes på vinduets luk-knap. Havde vi udeladt denne linje, ville vinduet blot være blevet skjult, og programmet ville fortsætte kørslen i baggrunden.
Vores vindue vises ved hjælp af følgende metodekald.
frame.setVisible(true);
Til teksten i vores eksempel benytter vi os af JLabel-klassen. En JLabel er en kort tekst eller ikon.
JLabel label = new JLabel("Vi programmerer Swing");
Vores JLabel tilføjes til vinduet, dvs. vores JFrame
frame.getContentPane().add(label);
Det er vigtigt at benytte funktionen getContentPane(), da det er sådan at JFrame er baseret på Frame-klassen (java.awt.frame) og at de er ikke fuldt kompatible.
Swing komponenter
redigérDer findes mange forskellige komponenter i Swing. I dette kapitel vil de vigtigste blive beskrevet.
JPanel
redigérJLabel
redigérJTextfield
redigérJButton
redigérUdlægning af komponenter
redigérTil placeringen af komponenter i vinduer, dialoger og paneler benyttes en såkaldt Layoutmanager.
Der findes forskellige layout manager, de fleste er er blevet implementeret i AWT biblioteket.
BorderLayout
redigérGridLayout
redigérGridbagLayout
redigérCardLayout
redigérUdvikling af Java Web baserede anvendelser
redigérDette kapitel skal fortælle lidt om de forskellige java web teknologier.
Applets
redigérEn applet er et lille Javaprogram, som udføres lokalt på brugerens computer.