Objektorienterad programmering, Z1 Lösningsförslag övning 2. Uppgift 1. public class SIUnits { public static double yardspermeter = 1.093613; public static double poundperkilo = 2.204623; public static double pintperliter = 1.759750; public static double metertoyard(double meter) { return meter * yardspermeter; }//metertoyard public static double yardtometer( double yard) { return yard / yardspermeter; }//yardtometer public static double kilotopound( double kilo) { return kilo * poundperkilo; }//kilotopound public static double poundtokilo( double pound) { return pound / poundperkilo; }//poundtokilo public static double litertopint( double liter) { return liter * pintperliter; }//litertopint public static double pinttoliter( double pint) { return pint / pintperliter; }//pinttoliter }// SIUnits public class TestClassSIUnits { public static void main(string[] a) { System.out.println("Förväntat värde: 10.9361 " + " Erhållet värde: " + SIUnits.meterToYard(10)); + SIUnits.yardToMeter(10.9361)); System.out.println("Förväntat värde: 22.04623 " + " Erhållet värde: " + SIUnits.kiloToPound(10)); + SIUnits.poundToKilo(22.04623)); System.out.println("Förväntat värde: 17.59750 " + " Erhållet värde: " + SIUnits.literToPint(10)); + SIUnits.pintToLiter(17.59750)); }// TestClassSIUnits Övning 2 - lösningsförslag 1 Z1 Objektorienterad programmering, HT12
Uppgift 2 public class CurrencyConverter { private double exangerate; public CurrencyConverter( double exangerate) { this.exangerate = exangerate; public double fromvalue( double foreingnmony) { return foreingnmony/exangerate; }//fromvalue public double tovalue( double domesticmony) { return domesticmony*exangerate; }//tovalue public void setexangerate( double exangerate) { this.exangerate = exangerate; }//setexangerate }//CurrencyConverter public class TestClassCurrencyConverter { public static void main(string[] args) { CurrencyConverter ustoskr = new CurrencyConverter(7.4512); System.out.println("Förväntat värde: 74.512 " + " Erhållet värde: " + ustoskr.tovalue(10)); System.out.println("Förväntat värde: 10 " + " Erhållet värde: " + ustoskr.fromvalue(74.512)); CurrencyConverter rubeltoskr = new CurrencyConverter(0.2551); System.out.println("Förväntat värde: 2.551 " + " Erhållet värde: " + rubeltoskr.tovalue(10)); System.out.println("Förväntat värde: 10 " + " Erhållet värde: " + rubeltoskr.fromvalue(2.551)); ustoskr.setexangerate(7.3852); System.out.println("Förväntat värde: 73.852 " + " Erhållet värde: " + ustoskr.tovalue(10)); System.out.println("Förväntat värde: 10 " + " Erhållet värde: " + ustoskr.fromvalue(73.852)); }//TestClassCurrencyConverter Övning 2 - lösningsförslag 2 Z1 Objektorienterad programmering, HT12
Uppgift 3 a) Om ingen konstruktor definieras i en klass skapas automatiskt en default konstruktor, vilket är den tomma konstruktorn (konstruktorn som saknar parametrar). Om däremot en klass definierar någon annan konstruktor än den tomma konstruktorn, men man även vill ha den tomma konstruktorn så måste klassen definiera denna. Definieras en konstruktor så skapas ingen default konstruktor. När ett objekt skapas nollställs alla bits i det minnesutrymme som objektets instansvariabler kommer att lagras. Är instansvariabeln en int råkar då det nollställda minnesutrymmet motsvara värdet 0. Om en klass innehåller någon instansvariabel, bör man deklarera den tomma konstruktorn om man inte har någon annan konstruktor i klassen (och avsiktligt utelämnat den tomma konstruktorn). En klass utan instansvariabler innehåller endast klass entiteter statiska metoder, statiska variabler och/eller statiska konstanter, och en sådan klass finns det ingen anledning att skapa instanser av. b) Horstmann borde ha deklarerat den tomma konstruktorn enligt: public Counter() { public class BoundedCounter { private int value; private int modulus; public BoundedCounter(int modulus) { this.modulus = modulus; public void count() { value = (value + 1) % modulus; }//count public int getvalue() { return value; }//getvalue public void reset() { }//reset public String tostring() { return "Value: " + value + " Modulus: " + modulus; }//tostring }//BoundedCounter Övning 2 - lösningsförslag 3 Z1 Objektorienterad programmering, HT12
public class TestClassBoundedCounter { public static void main(string[] args) { BoundedCounter counter = new BoundedCounter(5); System.out.println("Förväntat värde : 1 " + " Erhållet värde: " + counter.getvalue()); System.out.println("Förväntat värde : 4 " + " Erhållet värde: " + counter.getvalue()); counter.reset(); }//TestClassBoundedCounter Uppgift 4 public class Shareholding { private String name; private int quantity; private String purchasedate; private double purchaseprice; private double presentprice; public Shareholding(String name, int quantity, String purchasedate, double purchaseprice) { this. name = name; this. quantity = quantity; this.purchasedate = purchasedate; this. purchaseprice = purchaseprice; presentprice = purchaseprice; }//konstruktor public void setpresentprice(double presentprice) { this. presentprice = presentprice; }// setpresentprice public double getprofit(){ return quantity *(presentprice - purchaseprice); }// getprofit public String tostring() { return " Namn: " + name + "\nantal: " + quantity + "\ninköpsdag: " + purchasedate + "\ninköpspris: " + String.format("%.2f",purchasePrice) + "\nnuvarande pris: " + String.format("%.2f", presentprice) + "\nbehållning: " + String.format("%.2fs", getprofit()); }//tostring }// Shareholding Övning 2 - lösningsförslag 4 Z1 Objektorienterad programmering, HT12
Uppgift 5 a) Felet beror på att metoden setcolor är en statisk metod (klassmetod) medan variabeln color som används i denna metod är en instansvariabel. Varje objekt (instans) av klassen BounceBall har alltså sin egen variabel color, det finns alltså många variabler med namnet color och det är omöjligt att avgöra vilken av dessa variabler som avses utan att specificera detta. b) Det finns två lösningar på problemet. Antingen kan man göra instansvariabeln color till en statisk variabel (klassvariabel), men då kommer alla objekt av klassen att ha samma färg. Detta är ingen snyggt objektorienterat tillvägagångssätt!! Lösningen blir därför att göra metoden setcolor till en instansmetod, enligt nedan: import java.awt.color; public class BounceBall { private Color color; public BounceBall() {} //andra ointressanta metoder public void setcolor(color color) { this.color = color; }// setcolor public static void main(string[] arg) { BounceBall boing = new BounceBall(); boing.setcolor(color.pink); } //main }// BounceBall Övning 2 - lösningsförslag 5 Z1 Objektorienterad programmering, HT12