Java-exempel - självstudie Här följer ett antal programexempel som börjar med Hello World och sedan lägger till mer och mer i samma program Varje exempel ska (hoppas jag) vara ett fullständigt och körbart exempelt Varje exempel har strukturen: filnamn ---------------------------------klassdefinition Följande är rubrikerna till exemplen för att man lättare ska hitta bland dem senare. 1 - Hello world 2 - Lokal variabel i en metod 3 - Anrop till en annan metod inom samma klass 4 - Metodanrop med argument 5 - Egna klasser. Åtkomst av instansvariabler (datafält) 6 - Skapa flera objekt (personer). Rita lådor och pilar av hur det ser ut i minnet! 7 - Varje person har en egen metod för att skriva sitt eget namn 8 - Metoder för att sätta egna värden till instansvariabler (datafält) 9 - Konstruktor för att sätta egna värden till instansvariabler. (mats använder konstruktorn, eva använder setNamn) 10 - Alla personer kan ha en mamma. (has-a relation) 11 - Man kan ha flera konstruktorer i samma klass. Här har Person en konstruktor som sätter namnet och en annan konstruktor som sätter både mamma och namnet. 12 - Nu ska varje mamma även känna till alla sina barn. 13 - Personen ska själv uppdatera barn-listan när man får ett nytt barn (Här måste man använda this. "Tröskel-exempel!"). 14 - Exakt som 13 men definiera en metod addBarn som lägger in ett barn i sin egen barnlista och ser till att detta barn får rätt mamma. (Vits: Kan lägga in barn när som helst!). Använd addBarn i konstruktorn. 15 - Skapa flera barn till Eva och skriv ut alla hennes barn 16 - skrivAllaNamn ska skriva ut alla namn, dvs "mitt" namn och barnens och barnbarnens etc... 17 - En generalisering: I stället för att skriva namn ska man "göra något" Byt skrivnamn mot görNågot Byt skrivBarnensNamn mot barnenGörNågot Byt skrivAllaNamn mot allaGörNågot - 1 - 1 - Hello world MittProgram.java ---------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ System.out.println("Jag heter Mats"); } } Anm.: När man startar ett java-program, anger man (via DOS eller Unix-kommandot java klassnamn) den klass man ska starta med. I den klassen måste det finnas en metod main som måste vara av typ public static void och som måste ha ett argument (en sträng array) så som det står ovan. Tillsvidare räcker det att veta att det ska vara så. - 2 - 2 - Lokal variabel i en metod MittProgram.java ---------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ String namn; namn = "Mats"; System.out.println("Jag heter " + namn); } } - 3 - 3 - Anrop till en annan metod inom samma klass MittProgram.java ---------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ initiera(); } public static void initiera(){ String namn; namn = "Mats"; System.out.println("Jag heter " + namn); } } Anm.: main måste vara static (se anmärkning program 1). Alla metoder som main anropar direkt måste även de vara static (en lag för static-metoder). Därför måste även initiera vara static. Tillsvidare räcker det att veta att det är så. - 4 - 4 - Metodanrop med argument MittProgram.java ---------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ initiera("Mats"); } public static void initiera(String namn){ System.out.println("Jag heter " + namn); } } - 5 - 5 - Egna klasser. Åtkomst av instansvariabler (datafält) MittProgram.java ---------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ initiera(); } public static void initiera(){ Person mats; mats = new Person(); mats.namn = "Mats Nordström"; System.out.println("Jag heter " + mats.namn); } } Person.java ----------------------------------------------------------public class Person{ public String namn; } - 6 - 6 - Flera personer. (Rita lådor och pilar avhur det ser ut i minnet!) MittProgram.java ---------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ initiera(); } public static void initiera(){ Person mats = new Person(); Person eva = new Person(); Person vem; mats.namn = "Mats Nordström"; eva.namn = "Eva Andersson"; System.out.println("Jag heter " + mats.namn); System.out.println("Jag heter " + eva.namn); vem = mats; System.out.println("Jag heter " + vem.namn); vem = eva; System.out.println("Jag heter " + vem.namn); } } Person.java ----------------------------------------------------------public class Person{ public String namn; } - 7 - 7 - Varje person har en egen metod för att skriva sitt namn MittProgram.java ---------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ initiera(); } public static void initiera(){ Person mats = new Person(); Person eva = new Person(); Person vem; mats.namn = "Mats Nordström"; eva.namn = "Eva Andersson"; vem = mats; mats.skrivnamn(); eva.skrivnamn(); vem.skrivnamn(); vem = eva; vem.skrivnamn(); } } Person.java ----------------------------------------------------------public class Person{ public String namn; public void skrivnamn(){ System.out.println("Jag heter " + this.namn);//Anm } } Anm. i Person är namn och this.namn precis samma sak! Det skulle lika gärna kunna stå: System.out.println("Jag heter " + namn); - 8 - 8 - Metoder för att sätta egna värden till instansvariabler (datafält) MittProgram.java ---------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ initiera(); } public static void initiera(){ Person mats = new Person(); Person eva = new Person(); Person vem; mats.setNamn("Mats Nordström"); eva.setNamn("Eva Andersson"); vem = mats; mats.skrivnamn(); eva.skrivnamn(); vem.skrivnamn(); vem = eva; vem.skrivnamn(); } } Person.java ----------------------------------------------------------public class Person{ public String namn; public void setNamn(String s){ this.namn = s; // eller bara namn = s; } public void skrivnamn(){ System.out.println("Jag heter " + this.namn); // eller("Jag heter " + namn); } } - 9 - Anm. I fortsättningen kommer de egna fälten och metoderna att refereras utan this. - 10 - 9 - Konstruktor för att sätta egna värden till instansvariabler. (mats använder konstruktorn, eva använder setNamn) MittProgram.java ---------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ initiera(); } public static void initiera(){ Person mats = new Person("Mats Nordström"); Person eva = new Person(); Person vem; vem = eva; mats.skrivnamn(); eva.skrivnamn(); vem.skrivnamn(); eva.setNamn("Eva Andersson"); eva.skrivnamn(); vem.skrivnamn(); } } Person.java ----------------------------------------------------------public class Person{ public String namn; Person(){ } Person(String s){ namn = s; } public void setNamn(String s){ namn = s; } public void skrivnamn(){ System.out.println("Jag heter " + namn); - 11 - } } - 12 - 10 - Alla personer kan ha en mamma. Eva är Mats´s mamma MittProgram.java ---------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ initiera(); } public static void initiera(){ Person mats = new Person("Mats Nordström"); Person eva = new Person("Eva Andersson"); mats.mamma = eva; mats.mamma.skrivnamn(); } } Person.java ----------------------------------------------------------public class Person{ public String namn; public Person mamma; Person(){ } Person(String s){ namn = s; } public void setNamn(String s){ namn = s; } public void skrivnamn(){ System.out.println("Jag heter " + namn); } } - 13 - 11 - Man kan ha flera konstruktorer i samma klass. Här har Person en konstruktor som sätter namnet och en annan konstruktor som sätter både mamma och namnet MittProgram.java ---------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ initiera(); } public static void initiera(){ Person eva = new Person("Eva Andersson"); Person mats = new Person(eva,"Mats Nordström"); // eva är mats mamma mats.mamma.skrivnamn(); } } mats eva Person namn "Mats Nordström" Person "Eva Andersson" mamma null namn mamma Bild av minnet program 10 och 11 namn Person.java ----------------------------------------------------------public class Person{ public String namn; public Person mamma; Person(){ - 14 - } Person(String s){ namn = s; } Person(Person mor, String s){ mamma = mor; namn = s; } public void setNamn(String s){ namn = s; } public void skrivnamn(){ System.out.println("Jag heter " + this.namn); } } - 15 - 12 - Nu ska varje mamma även känna till alla sina barn MittProgram.java ---------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ initiera(); } public static void initiera(){ Person eva = new Person("Eva Andersson"); Person mats = new Person(eva,"Mats Nordström"); // Lägg nu in mats i evas barn-lista eva.barn.addElement(mats); // Rita en bild av hur det ser ut i minnet nu!! } } Anm. I java 2.0 kan addElement bytas mot add och elementAt bytas mot get Person.java ----------------------------------------------------------import java.util.*; // Behövs för att vi använder Vector public class Person{ public String namn; public Person mamma; // Mitt eget namn // Referens till min mamma public Vector barn = new Vector(); // Barnen, här som en Vector Person(){ } Person(String s){ namn = s; } Person(Person mor, String s){ mamma = mor; namn = s; } public void setNamn(String s){ namn = s; } public void skrivnamn(){ System.out.println("Jag heter " + namn); - 16 - } } - 17 - 13 - Personen ska själv uppdatera barn-listan när man får ett nytt barn (Här måste man använda this. "Tröskel-exempel!") MittProgram.java ---------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ initiera(); } public static void initiera(){ Person eva = new Person("Eva Andersson"); Person mats = new Person(eva,"Mats Nordström"); // Rita en bild av hur det ser ut i minnet nu!! } } Person.java ----------------------------------------------------------import java.util.*; // Behövs för att vi använder Vector public class Person{ public String namn; public Person mamma; // Mitt eget namn // Referens till min mamma public Vector barn = new Vector(); // Barnen, här som en Vector Person(){ } Person(String s){ namn = s; } Person(Person mor, String s){ namn = s; mamma = mor; // Sätter min mamma // lägg nu in mig (this) hos min mammas barn // Här måste man använda this mor.barn.addElement(this); } public void setNamn(String s){ this.namn = s; } public void skrivnamn(){ System.out.println("Jag heter " + namn); } - 18 - } - 19 - 14 - Exakt som 13 men definiera en metod addBarn som lägger in ett barn i sin egen barnlista och ser till att detta barn får rätt mamma. (Vits: Kan lägga in barn när som helst!). Använd addBarn i konstruktorn. MittProgram.java ---------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ initiera(); } public static void initiera(){ Person eva = new Person("Eva Andersson"); Person mats = new Person(eva,"Mats Nordström"); // Rita en bild av hur det ser ut i minnet nu!! } } Person.java ----------------------------------------------------------- import java.util.*; public class Person{ public String namn; public Person mamma; // Mitt eget namn // Referens till min mamma public Vector barn = new Vector(); // Barnen, här som en Vector Person(){ } Person(String s){ namn = s; } Person(Person mor, String s){ namn = s; // lägg in mig (this) hos min mammas barn // Även här måste man använda this mor.addBarn(this); } public void setNamn(String s){ this.namn = s; } public void skrivnamn(){ System.out.println("Jag heter " + namn); } public void addBarn(Person b){// ska lägga in b i min barnlista barn.addElement(b); b.mamma = this; // Lägg b i min barnlista // Se till att jag blir barnets mamma! // (Även här måste man använda this!) } } - 20 - 15 - Skapa flera barn till Eva och skriv ut alla hennes barn MittProgram.java -------------------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ initiera(); } public static void initiera(){ Person Person Person Person eva mats oskar pelle = = = = new new new new Person("Eva Andersson"); Person(eva,"Mats Nordström"); Person(eva,"Oskar Oskarsson"); Person(eva,"Per Persson"); eva.skrivBarnensNamn(); } } Person.java ----------------------------------------------------------- import java.util.*; public class Person{ public String namn; public Person mamma; // Mitt eget namn // Referens till min mamma public Vector barn = new Vector(); // Barnen, här som en Vector Person(){} Person(String s){ namn = s; } Person(Person mor, String s){ namn = s; mor.addBarn(this); //lägg in mig hos mammas barn } public void setNamn(String s){ namn = s; } public void skrivBarnensNamn(){ if(barn.size()>0){ System.out.println("Mina barn är:"); } for (int i = 0; i < barn.size(); i++) { Person b = (Person)barn.elementAt(i); b.skrivnamn(); } // type-cast! } public void skrivnamn(){ System.out.println("Jag heter " + namn); } public void addBarn(Person b){// ska lägga in b i min barnlista barn.addElement(b); b.mamma = this; // Lägg b i min barnlista // Se till att jag blir barnets mamma! // (Här måste man använda this!) } } - 21 - 16 - skrivAllaNamn ska skriva ut alla namn, dvs "mitt" namn och barnens och barnbarnens etc... -------------------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ initiera(); } public static void initiera(){ Person eva = new Person("Eva Andersson"); Person mats = new Person(eva,"Mats Nordström"); Person oskar = new Person(eva,"Oskar Oskarsson"); Person pelle = new Person(eva,"Per Persson"); Person lillen= new Person(pelle,"Pelles lilla lillen"); eva.skrivAllaNamn (); } } Person.java ----------------------------------------------------------- import java.util.*; public class public public public Person{ String namn; // Mitt eget namn Person mamma; // Referens till min mamma Vector barn = new Vector(); // Barnen, här som en Vector Person(){} Person(String s){namn = s;} Person(Person mor, String s){ mor.addBarn(this); //lägg in mig hos mammas barn namn = s; } public void setNamn(String s){ namn = s; } public void skrivAllaNamn(){ skrivnamn(); skrivBarnensNamn(); } public void skrivBarnensNamn(){ if(barn.size()>0){ System.out.println("Mina barn är:"); } for (int i = 0; i < barn.size(); i++) { Person b = (Person)barn.elementAt(i); b.skrivAllaNamn(); } // type-cast! } public void skrivnamn(){ System.out.println("Jag heter " + namn); } public void addBarn(Person b){// ska lägga in b i min barnlista barn.addElement(b); b.mamma = this; // Lägg b i min barnlista // Se till att jag blir barnets mamma! // (Här måste man använda this!) } } - 22 - 17 - En generalisering: I stället för att skriva namn ska man "göra något" Byt skrivnamn mot görNågot Byt skrivBarnensNamn mot barnenGörNågot Byt skrivAllaNamn mot allaGörNågot -------------------------------------------------------------------------------public class MittProgram{ public static void main(String[] args){ initiera(); } public static void initiera(){ Person Person Person Person Person eva = mats = oskar = pelle = lillen= new new new new new Person("Eva Andersson"); Person(eva,"Mats Nordström"); Person(eva,"Oskar Oskarsson"); Person(eva,"Per Persson"); Person(pelle,"Pelles lilla lillen"); eva.allaGörNågot(); } } Person.java ----------------------------------------------------------- import java.util.*; public class public public public Person{ String namn; // Mitt eget namn Person mamma; // Referens till min mamma Vector barn = new Vector(); // Barnen, här som en Vector Person(){} Person(String s){namn = s;} Person(Person mor, String s){ mor.addBarn(this); //lägg in mig hos mammas barn namn = s; } public void setNamn(String s){ namn = s; } public void allaGörNågot(){ görNågot(); barnenGörNågot(); } public void barnenGörNågot(){ for (int i = 0; i < barn.size(); i++) { Person b = (Person)barn.elementAt(i); b.allaGörNågot(); } } // type-cast! public void görNågot(){ // Här finns nu kod som fixar att personen "gör något" } public void addBarn(Person b){// ska lägga in b i min barnlista barn.addElement(b); // Lägg b i min barnlista b.mamma = this; // Se till att jag blir barnets mamma! // (Här måste man använda this!) } } - 23 - mats eva Person namn Person "Mats Nordström" "Eva Andersson" mamma null namn mamma Bild av minnet program 10 och 11 mats eva Person namn "Mats Nordström" Person "Eva Anderss on" mamma null barn namn mamma barn Vector Vector empty Bild av minnet program 12, 13, 14 - 24 -