Laboration 16 Avsikt Avsikten med denna laboration är att öva på arv i objektorienterad programmering. Du ska skapa en klasshierarki som ser ut som figuren till höger: Fordon MotorFordon Bil Motorcykel Uppgift 1 Skriv klassen Fordon enligt beskrivningen nedan. Ägaren är av typen String. Klassen Fordon instansvariabel: ägare metoder: konstruktorer setägare getägare tostring Skapa sedan en testklass med följande main-metod: public static void main(string[] args){ Fordon f1= new Fordon(); Fordon f2= new Fordon("Lina Nilsson"); System.out.println(f1); System.out.println(f2); f1.setägare("ola Torstensson"); System.out.println(f1.getÄgare()); Körning ger följande utskrift: Ägare: Okänd ägare Ägare: Lina Nilsson Ola Torstensson DA129A Programmering 1 1
Uppgift 2 Skriv klassen MotorFordon enligt beskrivningen nedan. Hästkrafter är av typen int. Klassen MotorFordon: är subklass till kassen Fordon (ärver från Fordon) instansvariabler: hk (hästkraft) metoder: konstruktorer gethk sethk tostring I tostring-metoden ska ett anrop till tostring-metoden i superklassen Fordon göras: super.tostring() Skapa en testklass med följande main-metod: public static void main(string[] args){ MotorFordon m1= new MotorFordon(); MotorFordon m2= new MotorFordon("Lina Nilsson",100); System.out.println(m1); System.out.println(m2); m1.setägare("ola Torstensson"); m1.sethk(200); System.out.println(m1); Körning ger följande utskrift: Ägare: Okänd ägare Motorns hästkrafter: 0 Ägare: Lina Nilsson Motorns hästkrafter: 100 Ägare: Ola Torstensson Motorns hästkrafter: 200 Uppgift 3 Skriv klasserna Bil och Motorcykel enligt nedanstående beskrivningar: Klassen Bil är subklass till klassen MotorFordon (ärver från MotorFordon) instansvariabler: regnr (registreringsnummer) metoder: konstruktorer getregnr setregnr tostring 2
Klassen Motorcykel är subklass till klassen MotorFordon (ärver från MotorFordon) instansvariabler: regnr (registreringsnummer) metoder: konstruktorer getregnr setregnr tostring I tostring-metoden ska ett anrop till tostring-metoden i superklassen MotorFordon göras: super.tostring() Gör en testklass som har följande main-metod: public static void main(string[] args) { Fordon[] fordonslista= new Fordon[3]; fordonslista[0]=new Bil("Doris Bengtsson",80,"FGT 450"); fordonslista[1]=new Motorcykel("Klas Bengtsson",70,"KKI 333"); Bil b=new Bil(); b.setägare("fredrik Hansson"); b.sethk(100); b.setregnr("hhh 778"); fordonslista[2]=b; for (int i=0;i<fordonslista.length;i++){ System.out.println(fordonslista[i].getClass()); System.out.println(fordonslista[i]); System.out.println(); Körning ger följande utskrift: class Bil Ägare: Doris Bengtsson Motorns hästkrafter: 80 Registeringsnummer: FGT 450 class Motorcykel Ägare: Klas Bengtsson Motorns hästkrafter: 70 Registeringsnummer: KKI 333 class Bil Ägare: Fredrik Hansson Motorns hästkrafter: 100 Registeringsnummer: HHH 778 Uppgift 4 Skapa ny klass Cykel med en ägare och ett antal växlar. Vad är det lämpligt att Cykel ärver ifrån? Gör lämpliga metoder åt den nya klassen. Testa denna klass genom att göra en testklass med en main-metod. 3
Extrauppgift 1 Lägg till metoden public int compareto(object o) i klassen MotorFordon. Anropet b1.compareto(b2) ska retunera 1 om b1 har en motor med fler hästkrafter än b2. -1 om b2 har en motor med fler hästkrafter än b1 och 0 om deras motoerer har lika många hästkrafter. Använd denna metod för att skapa en metod i en testklass som utifrån en lista av MotorFordon och ett intervall returnerar en ny lista med de MotorFordon som har motorer med antalet hästkrafter inom intervallet. Metodhuvudet ska se ut så här: public MotorFordon[] inomintervallet(motorfordon[] inlista,int min,int max) Om det inte finns några MotorFordon inom intervallet retuneras en lista med längden 0. Testa din metod. Extrauppgift 2 Lägg till metoden public boolean equals(object o) hos alla klasserna i klassheirakin. Använd denna metod för att söka i en lista över olika fordon och se om ett fordon finns i listan. Du ska skapa en testklass som har en lista av fordon bestående av alla typer av fordon d.v.s. minst fem stycken. Du ska sedan låta användaren mata in en beskrivning på ett fordon och skapa ett objekt utifrån beskrivningen. Sedan ska du undersöka om fordonet finns i listan med hjälp av metoden equals. Ett krav för att två objekt ska vara lika det är att de är av samma typ. Ett sätt att kontrollera om två objekt tillhör samma klass är att använda getclass-metoden på båda objekten och sedan jämföra class-objekten med varandra (med equals-metoden). Ex. Class cls1 = this.getclass(); Class cls2 = o.getclass(); if( cls1.equals(cls2) ) {... eller if( this.getclass().equals(o.getclass()) ) {... returnerar true om this och o refererar till samma typ av objekt. Det kan vara lämpligt att kolla detta innan man försöker omvandla objektet till en mer specialiserad typ. 4
Förslag till lösningar public class Fordon { private String ägare; public Fordon() { this("okänd ägare"); public Fordon(String ägare) { this.ägare = ägare; public void setägare(string ägare) { this.ägare = ägare; public String getägare() { return ägare; return "Ägare: " + ägare; Fordon f = (Fordon) o; lika = ägare.equals(f.getägare()); ------------------------------------------------------ public class MotorFordon extends Fordon { private int hk; public MotorFordon() { public MotorFordon(String ägare, int hk) { super(ägare); this.hk = hk; public void sethk(int hk) { this.hk = hk; public int gethk() { return hk; return super.tostring() + " Motorns hästkrafter: " + hk; 5
MotorFordon m = (MotorFordon) o; lika = (hk == m.gethk()) && (super.equals(o)); // Extrauppgift 1 public int compareto(object o) { MotorFordon m = (MotorFordon) o; if(hk<m.gethk()) return -1; else if(hk>m.gethk()) return 1; else return 0; // Extrauppgift 1 public static MotorFordon[] inomintervallet(motorfordon[] inlista, int min, int max) { int antal = 0; MotorFordon[] res; for(int i=0; i<inlista.length; i++) if( (inlista[i].gethk()>=min) && (inlista[i].gethk()<=max) ) antal++; res = new MotorFordon[antal]; // fungerar även då antal==0 for(int i=inlista.length-1; i>=0; i--) if( (inlista[i].gethk()>=min) && (inlista[i].gethk()<=max) ) { antal--; res[antal] = inlista[i]; return res; // Test av extrauppgift 1 public static void main(string[] args){ MotorFordon[] fordon = {new MotorFordon("A",100), new MotorFordon("B",150),new MotorFordon("C",80), new MotorFordon("D",100),new MotorFordon("E",110); MotorFordon[] resultat = inomintervallet(fordon, 95, 110); for(int i=0; i<resultat.length; i++) System.out.println(resultat[i]); ------------------------------------------------------ public class Bil extends MotorFordon { private String regnr; public Bil() { regnr=""; public Bil(String ägare, int hk, String regnr) { super(ägare, hk); this.regnr = regnr; public void setregnr(string regnr) { this.regnr = regnr; 6
public String getregnr() { return regnr; return super.tostring() + " Registreringsnummer: " + regnr; Bil b = (Bil) o; lika = regnr.equals(b.getregnr()); // Registreringsnummer unika ------------------------------------------------------ public class Motorcykel extends MotorFordon { private String regnr; public Motorcykel() { regnr=""; public Motorcykel(String ägare, int hk, String regnr) { super(ägare, hk); this.regnr = regnr; public void setregnr(string regnr) { this.regnr = regnr; public String getregnr() { return regnr; return super.tostring() + " Registreringsnummer: " + regnr; Motorcykel m = (Motorcykel) o; lika = regnr.equals(m.getregnr()); // Registreringsnummer unika ------------------------------------------------------ public class Cykel extends Fordon { private int växlar=1; /** Creates a new instance of Cykel */ public Cykel() { public Cykel(String ägare, int växlar) { 7
super(ägare); this.växlar = växlar; public void setväxlar(int växlar) { this.växlar = växlar; public int getväxlar() { return växlar; return super.tostring() + " Antal växlar: " + växlar; Cykel c = (Cykel) o; lika = (växlar == c.getväxlar()) && (super.equals(o)); public static void main(string[] args){ Cykel c1= new Cykel(); Cykel c2= new Cykel("Sven Jakobi",21); System.out.println(c1); System.out.println(c2); c1.setägare("inga Bok"); c1.setväxlar(3); System.out.println(c1.getÄgare() + " " + c1.getväxlar() + " växlar"); 8