Laboration 8 Avsikten med denna laboration är att du lära dig skapa objekt med hjälp av klasser. Detta är en introduktion till ett objektorienterat tankesätt. Med hjälp av detta tankesätt kan du så småningom skapa större program. Java är ett programmeringspråk som understödjer den objektorienterade programmeringsstilen. Skapa paketet laboration8 innan du fortsätter på denna laboration. Uppgift 1a Du ska skapa en klass Anstalld. Klassdiagrammet till höger beskriver vad den första versionen av Anstalld ska innehålla. Diagrammet visar: Klassens namn Klassens attribut (instansvariabler). Minus-tecknet före namnet anger att synligheten ska vara private. Klassens metoder (instansmetoder). Plus-tecknet före namnet anger att metoden ska vara public. En anställd har tre egenskaper (attribut): namn, arbetsgivare och lön. namn och arbetsgivare är av typen String och lön av typen double. Attributen ska ha modifieraren private. En deklaration av attributet namn ser ut så här: private String namn; Lägg till detta och de övriga två attributen i klassen. Anstalld - namn : String - arbetsgivare : String - lön : double + setnamn(string) + setarbetsgivare(string) + setlön(double) + getnamn() : String + getarbetsgivare() : String + getlön() : String : Då attributen är deklararade med modifieraren private så kan bara metoder i klassen Anstalld komma åt värdet. Om man vill att andra klasser ska kunna påverka eller se attributensvärde så kan man ha get-metoder och set-metoder. En set-metod för attributet namn ser ut så här: public void setnamn(string n){ namn=n; En get-metod retunerar ett attributsvärde. En get-metod för attributets namn ser ut så här: public String getnamn(){ return namn; Skriv set-metoder och get-metoder till alla attribut så att du kan testa klassen Anstalld med nedanstående testprogram. DA129A, Programmering 1 1
Testprogram // Den första anställda skapas Anstalld a1=new Anstalld(); a1.setnamn("anna Olsson"); a1.setarbetsgivare("eriksson"); a1.setlön(25700); // Den andra anställda skapas Anstalld a2=new Anstalld(); a2.setnamn("pontus Persson"); a2.setarbetsgivare("malmö högskola"); a2.setlön(23900); //De anställda skrivs ut System.out.println(); System.out.println(a1.getNamn()+ " har anställning hos " + a1.getarbetsgivare() + " med lönen " + a1.getlön() + "."); System.out.println(); System.out.println(a2.getNamn()+ " har anställning hos " + a2.getarbetsgivare() + " med lönen " + a2.getlön() + "."); Körresultat Anna Olsson har anställning hos Eriksson med lönen 25700.0. Pontus Persson har anställning hos Malmö högskola med lönen 23900.0. Uppgift 1b Skapa en metod tostring i din klass Anstalld med metodhuvudet: return ""; // Ersätt "" med en vettig sträng Denna metod returnerar ett värde av typen String, vilket innebär att det i metodkroppen måste finnas en rad som ser ut på följande sätt: return någon sträng ; Då du gör anropet System.out.println(a1.toString()); ska utskriften se ut så här: Anna Olsson har anställning hos Eriksson med lönen 25700.0. Ändra i testprogrammet för att testa din tostring-metod. Uppgift 2 Du ska skriva klassen Bostad vilken ska representera en bostad. Viktiga egenskaper i klassen är bostadsyta och antalet rum. Klassdiagrammet till höger beskriver de instansvariabler och metoder (instansmetoder) som ska ingå i klassen. Kortfattat är det dessa instansvariabler och metoder som ska ingå i klassen: Instansvariabler: private double bostadsyta; private int antalrum; Metoder: public void setbostadsyta(double yta) public void setantalrum(int antal) public double getbostadsyta() Bostad - bostadsyta:double - antalrum:int + setbostadsyta(double) + setantalrum(int) + getbostadsyta():double + getantalrum():int + tostring():string - private + public 2
public int getantalrum() public String tostring() Nedan ser du ett testprogram och körresultatet av programmet. Testprogram Bostad bostad1 = new Bostad(); Bostad bostad2 = new Bostad(); bostad1.setbostadsyta(55); bostad1.setantalrum(2); bostad2.setbostadsyta(108.6); bostad2.setantalrum(4); System.out.println(bostad1.toString()); System.out.println("Yta: " + bostad2.getbostadsyta() + " m2" + " Antal rum: " + bostad2.getantalrum()); Körresultat Bostad med ytan 55.0 m2 och 2 rum. Yta: 108.6 m2 Antal rum: 4 Uppgift 3 Du ska skriva klassen Vara vilken ska representera en vara i en affär. Viktiga egenskaper i klassen är varans namn, varans pris och antalet exemplar i affären. Klassdiagrammet till höger beskriver de instansvariabler och metoder (instansmetoder) som ska ingå i klassen. Nedan ser du ett testprogram och körresultatet av programmet. Testprogram Vara envara = new Vara(); envara.setnamn("standardmjölk"); envara.setpris(8.20); envara.setantal(120); Output.meddelande(enVara.toString()); envara.setnamn("7-växlad Crescent"); Output.meddelande(enVara.getNamn() + ": Pris=" + Output.format(enVara.getPris(),0,2) + " kr Antal=" + envara.getantal()); Körresultat Vara - namn : String - pris : double - antal : int + setnamn(string) + setpris(double) + setantal(int) + getnamn() : String + getpris() : double + getantal() : int + tostring():string 3
Uppgift 4 Skapa klassen Bok som beskriver en bok. Vilka attribut ska finnas? Vilka metoder? 1. Konstruera ett klassdiagram som visar vad klassen ska innehålla. 2. Skriv sedan klassen.bok. 3. Gör slutligen en testklass som testar din Bok-klass med ett antal olika böcker. Uppgift 5 Nu ska du lägga till ett par metoder i klassen Anstalld. Gör en metod som beräknar årslönen för en anställd med följande metodhuvud public double årslön() Metoden ska alltså returnera en double. Returvärdet ska vara den anställdes årslön. Ändra i testprogrammet (Uppgift 1) för att testa din årslön-metod. Gör en metod som kontrollerar om två anställda har samma arbetsgivare: public boolean sammaarbetsgivare(anstalld a) Metoden ska returnera true om attributet arbetsgivare är det samma som a s arbetsgivare. Du ska använda metoden equals, som finns i klassen String, för att jämföra strängarna. String s1, s2; : if(s1.equals(s2)) { // s1.equals(s2) är true om strängarna samma, annars false : Ändra i testprogrammet (Uppgift 1) för att testa din sammaarbetsgivare-metod. 4
Lösningsförslag public class Anstalld { private String namn; private String arbetsgivare; private double lön; public void setnamn(string n) { namn = n; public void setarbetsgivare(string a) { arbetsgivare = a; public void setlön(double l) { lön = l; public String getnamn() { return namn; public String getarbetsgivare() { return arbetsgivare; public double getlön() { return lön; public double årslön() { return 12*lön; public boolean sammaarbetsgivare(anstalld a) { return arbetsgivare.equals(a.getarbetsgivare()); ----------------------------------------------------------------- public class Bostad { private double bostadsyta; private int antalrum; public void setbostadsyta(double yta) { bostadsyta = yta; public void setantalrum(int antal) { antalrum = antal; public double getbostadsyta() { return bostadsyta; 5
public int getantalrum() { return antalrum; return "Bostad med ytan " + bostadsyta + " m2 och " + antalrum + " rum."; public static void main(string[] args) { Bostad bostad1 = new Bostad(); Bostad bostad2 = new Bostad(); bostad1.setbostadsyta(55); bostad1.setantalrum(2); bostad2.setbostadsyta(108.6); bostad2.setantalrum(4); System.out.println(bostad1.toString()); System.out.println("Yta: " + bostad2.getbostadsyta() + " m2" + " Antal rum: " + bostad2.getantalrum()); ----------------------------------------------------------------- import extra.*; public class Vara { private String namn; private double pris; private int antal; public void setnamn(string varunamn) { namn = varunamn; public void setpris(double varupris) { pris = varupris; public void setantal(int antalvaror) { antal = antalvaror; public String getnamn() { return namn; public double getpris() { return pris; public int getantal() { return antal; return namn + ": Pris=" + Output.format(pris,0,2) + " kr Antal=" + antal; public static void main(string[] args) { Vara envara = new Vara(); 6
envara.setnamn("standardmjölk"); envara.setpris(8.20); envara.setantal(120); Output.meddelande(enVara.toString()); envara.setnamn("7-växlad Crescent"); Output.meddelande(enVara.getNamn() + ": Pris=" + Output.format(enVara.getPris(), 0,2) + " kr Antal=" + envara.getantal()); ----------------------------------------------------------------- public class Bok { private String titel; private String författare; private String kategori; private int antal; public void settitel(string boktitel) { titel = boktitel; public void setförfattare(string författare) { this.författare = författare; // Nästa föreläsning public void setkategori(string område) { kategori = område; public void setantal(int antalböcker) { antal = antalböcker; public String gettitel() { return titel; public String getförfattare() { return författare; public String getkategori() { return kategori; public int getantal() { return antal; return "Titel: " + titel + " Författare: " + författare + " Kategori" + kategori + " Antal: " + antal; 7