Laboration 8 Avsikten med laborationen ä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å laborationen. Uppgift 1a Du ska skapa en klass Anstalld. Klassdiagrammet till höger beskriver vad klassen Anstalld ska innehålla. Diagrammet visar i vanlig ordning: 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å ska man ha get-metoder och/eller set-metoder. En set-metod för attributet namn ser ut så här: public void setnamn(string n){ this.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 this.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: public String tostring() { return ""; // Ersätt "" med en vettig sträng Metoden tostring 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 en 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: Instansvariabler: private double bostadsyta; private int antalrum; Metoder: public void setbostadsyta(double yta) public void setantalrum(int antal) public double getbostadsyta() public int getantalrum() public String tostring() Bostad - bostadsyta:double - antalrum:int + setbostadsyta(double) + setantalrum(int) + getbostadsyta():double + getantalrum():int + tostring():string - private + public 2
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 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. Uppgift 5 Komplettera klassen Bostad med nedanstående metoder. Men testa metoderna en åt gången tills de fungerar. public double kvmperrum() Metoden ska räkna ut antalet kvadratmeter bostadsyta per rum för aktuellt objekt. Resultatet av beräkningen ska returneras. Bostad b = new Bostad(); b.setbostadsyta(110); b.setantalrum(5); System.out.println(b.kvmPerRum); Ger utskriften: 22.0 public double jämförbostadsyta(bostad b) Metoden ska jämföra två bostäder, aktuellt objekt och inparametern b, avseende deras yta. Beräkna skillnaden mellan ytan i aktuellt objekt och ytan i b. Returnera skillnaden. Detta innebär att * om aktuellt objekt har störst yta så returneras ett positivt värde (>0). * om bostäderna har samma yta så returneras 0. * om bostaden b har störst yta så returneras ett negativt värde (<0). Extrametod public Bostad flestrum(bostad b) Metoden ska returnera en referens till den bostad som har flest rum. Om de har lika många rum ska referens till aktuellt objekt returneras. 4
Uppgift 6 Komplettera klassen Bostad med följande konstruktorer: public Bostad() Denna konstruktor ska sätta bostadsytan till 100 m 2 och antalet rum till 4. public Bostad(double inbostadsyta, int inantalrum) Denna konstruktor ska föra över parametrarnas värde till attributen i klassen. Bostad bostad1 = new Bostad(); Bostad bostad2 = new Bostad(55,2); System.out.println(bostad1.toString()); System.out.println(bostad2.toString()); Ger utskriften Bostad med ytan 100.0 m2 och 4 rum. Bostad med ytan 55.0 m2 och 2 rum. - bostadsyta:double - antalrum:int Bostad + Bostad() + Bostad(double, int) + setbostadsyta(double) + setantalrum(int) + getbostadsyta():double + getantalrum():int + tostring():string + kvmperrum() : double +jämförbostadsyta(bostad b) : double + copybostad() : Bostad + flestrum(bostad b) : Bostad Extrametod public Bostad copybostad() Metoden ska returnera en kopia av aktuellt objekt. Uppgift 7 Komplettera klassen Vara med följande metoder: public boolean slut() Metoden ska returnera true om det finns minst ett exemplar av varan. Annars ska metoden returnera false. public Vara billigast(vara v) Metoden ska returnera en referens till den billigaste varan. Komplettera klassen Vara med följande konstruktorer: public Vara(String namn, double pris, int antal) Denna konstruktor ska föra över parametrarnas värde till attributen i klassen. public Vara(Vara v) Denna konstruktor ska föra v:s värde (på attributen) till attributen i klassen. Denna kosntruktor kallas ibland för kopieringskonstruktor. Det nya objektet blir en kopia av objektet som används som argument. Vara vara1 = new Vara("Standardmjölk", 8.20, 120); Vara vara2 = new Vara(vara1); vara2.setpris(8.45); System.out.println(vara1.toString()); System.out.println(vara2.toString()); Ger utskriften Standardmjölk: Pris=8.20 kr Antal=120 Standardmjölk: Pris=8.45 kr Antal=120 5
Uppgift 8 I denna uppgift ska du arbeta med klassen Anstalld. Lägg till följande konstruktorer i klassen: public Anstalld(String namn, String arbetsgivare, double lön) Denna konstruktor ska föra över parametrarnas värde till attributen i klassen. public Anstalld(String namn) Denna konstruktor ska skapa objektet anropa konstruktorn Anstalld(String, double). public Anstalld(String namn, double lön) Denna konstruktor ska skapa objektet anropa konstruktorn Anstalld(String, String, double). Anstalld a1=new Anstalld("Rut Andersson"); Anstalld a2=new Anstalld("Ragnar Olsson",20000); Anstalld a3=new Anstalld("Ragnar Olsson","Gambro", 23000); String res = a1.tostring() + "\n" + a2.tostring() + "\n" + a3.tostring(); javax.swing.joptionpane.showmessagedialog( null, res ); Ger körresultatet 6
Lösningsförslag package laboration8; public class Anstalld { private String namn; private String arbetsgivare; private double lön; public void setnamn(string n) { this.namn = n; public void setarbetsgivare(string a) { this.arbetsgivare = a; public void setlön(double l) { this.lön = l; public String getnamn() { return this.namn; public String getarbetsgivare() { return this.arbetsgivare; public double getlön() { return this.lön; public String tostring() { return (this.namn + " har anställning hos " + this.arbetsgivare + " med lönen " + this.lön + "."); package laboration8; public class Bostad { private double bostadsyta; private int antalrum; public void setbostadsyta(double yta) { this.bostadsyta = yta; public void setantalrum(int antal) { this.antalrum = antal; public double getbostadsyta() { return this.bostadsyta; public int getantalrum() { return this.antalrum; 7
public String tostring() { return "Bostad med ytan " + this.bostadsyta + " m2 och " + this.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()); package laboration8; import javax.swing.*; public class Vara { private String namn; private double pris; private int antal; public void setnamn(string varunamn) { this.namn = varunamn; public void setpris(double varupris) { this.pris = varupris; public void setantal(int antalvaror) { this.antal = antalvaror; public String getnamn() { return this.namn; public double getpris() { return this.pris; public int getantal() { return this.antal; public String tostring() { String res = this.namn + ": Pris=" + String.format( "%1.2f", this.pris ) + " kr Antal=" + this.antal; return res; public static void main(string[] args) { Vara envara = new Vara(); envara.setnamn("standardmjölk"); 8
envara.setpris(8.20); envara.setantal(120); JOptionPane.showMessageDialog( null, envara.tostring() ); envara.setnamn("7-växlad Crescent"); JOptionPane.showMessageDialog( null, envara.getnamn() + ": Pris=" + String.format( "%1.2f", envara.getpris() ) + " kr Antal=" + envara.getantal() ); // Uppgift 4 public double årslön() { return 12 * this.lön; public boolean sammaarbetsgivare(anstalld a) { return this.arbetsgivare.equals(a.getarbetsgivare()); // Uppgift 5 public double jämförbostadsyta(bostad b) { return this.bostadsyta - b.getbostadsyta(); public double kvmperrum() { return this.bostadsyta / this.antalrum; // Extrauppgift public Bostad flestrum(bostad b) { if(this.antalrum < b.antalrum) return b; return this; // Uppgift 6 public Bostad() { this.bostadsyta = 100; this.antalrum = 4; public Bostad(double bostadsyta, int antalrum) { this.bostadsyta = bostadsyta; this.antalrum = antalrum; // Extrauppgift public Bostad copybostad() { return new Bostad( this.bostadsyta, this.antalrum ); // Uppgift 7 public boolean slut() { return this.antal==0; public Vara billigast(vara v) { if(this.pris <= v.getpris()) return this; return v; 9
public Vara(String namn, double pris, int antal) { this.namn = namn; this.pris = pris; this.antal = antal; public Vara(Vara v) { this(v.getnamn(), v.getpris(), v.getantal()); // Uppgift 8 // Arbetsgivare: Okänd, Lön: 0 public Anstalld(String namn) { this( namn, 0 ); // Arbetsgivare: Okänd public Anstalld(String namn, double lön) { this( namn, "Okänd arbetsgivare", lön ); public Anstalld(String innamn, String inarbetsgivare, double inlön) { this.namn = innamn; this.arbetsgivare = inarbetsgivare; this.lön = inlön; 10