Kap 17 øvelse 1 (Et forslag til løsning) + mange spørgsmål

Her kan du diskutere opgaverne til Java serien og evt. dele dine egne løsningsforslag med andre.
Besvar
Henrik Halle
Entusiast
Entusiast
Indlæg:38
Tilmeldt:4. maj 2014, 09:22
Kap 17 øvelse 1 (Et forslag til løsning) + mange spørgsmål

Indlæg af Henrik Halle » 20. maj 2014, 20:00

Først kommer mine tre classer som kode, så mine spørgsmål.

Kode: Vælg alt

package kap14;

public class Main {

	public static void main(String[] args) {
		
		Bog mobyDick = new Bog();
		mobyDick.setSidetal(245);
		mobyDick.setPris(150.50);
		mobyDick.setForfatter("MobyDick ");
		mobyDick.setForlag("(Nordisk Bøger) ");
	
		mobyDick.info();
		
		Bog guideToTheGalaxy = new Bog();
		guideToTheGalaxy.setSidetal(185);
		guideToTheGalaxy.setPris(75.95);
		guideToTheGalaxy.setForfatter("Guide To The Galaxy");
		guideToTheGalaxy.setForlag("Et eller andet");
		guideToTheGalaxy.info();
		
		Bog learnCode = new Bog();
		learnCode.setSidetal(345);
		learnCode.setPris(450.75);
		learnCode.setForfatter("Learn Code");
		learnCode.setForlag("Et eller andet");
		
		learnCode.info();
		
		Religion Biblen = new Religion();
		Biblen.setSidetal(123);
		Biblen.setPris(255.0);
		Biblen.setForfatter("Biblen");
		Biblen.setForlag("Heaven Books");
		Biblen.setreligion("Kristendom");
		
		Biblen.info();
		}
}

Kode: Vælg alt

package kap14;

public class Bog {

	// Instanser
	
	int sidetal;
	double pris;
	String forfatter;
	String forlag;
	
	
	
	// Set- Metoder
	
	void setForlag(String forlag){
		this.forlag= forlag;
	
	info();	
	}
	
	void setForfatter(String forfatter){
	this.forfatter = forfatter;
	
	}
	
	
	void setSidetal(int sidetal) {
	this.sidetal=sidetal;
	
	}
	
	void setPris(double pris) {
		this.pris= pris;
		
	}
	
	// Get-Metoder
	
	int getSidetal(){
		return sidetal;
		
	}
	
	double getPris(){
		return pris;
	}
	
	String getForlag(){
		return forlag;
		}
 
	String getForfatter(){
		return forfatter;
		
	}
 // Info-metode
	
	void info(){
		String infoString = "Title: " + forfatter + " Forlag: " + forlag + " Pris: " + pris + " Sidetal: " + sidetal;
		
	System.out.println(infoString);
	
	
	}
	
}


Kode: Vælg alt


package kap14;

public class Religion extends Bog {
	// instanser
	String religion;
	
	// Set- metoder
	void setreligion (String religion){
		this.religion = religion;
	
	}
	
		// Get-metoder 
	
	String getReligion (){
	return religion;
	
	}
	
	// Info-metode
		
				void info(){
					String infoString = "Title: " + forfatter + " Forlag: " + forlag + " Pris: " + pris + " Sidetal: " + sidetal + " Religion: " + religion;
					
				System.out.println(infoString);
	
	}
	
}

Så mine Spørgsmål.

Spørgsmål til min kode.
I min class Bog kalder jeg en info(); Men hvis jeg flytter den til et andet sted i koden udskriver den ikke noget.
Det vil sige den kan kun stå i set motoden, hvorfor det?
2. I min main class havde jeg

Religion Biblen = new Religion();

Biblen.setForfatter("Biblen");
Biblen.setForlag("Heaven Books");
Biblen.setSidetal(123);
Biblen.setPris(255.0);
Biblen.setreligion("Kristendom");

Her blev mit sidetal og retuneret til 0. Hvis jeg flytter set.pris og set.sidetal op til dette.
Religion Biblen = new Religion();
Biblen.setSidetal(123);
Biblen.setPris(255.0);
Biblen.setForfatter("Biblen");
Biblen.setForlag("Heaven Books");
Biblen.setreligion("Kristendom");

Virker det fint. Hvorfor?

@override virker ikke. Jeg får denne fejl.

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Syntax error, annotations are only available if source level is 1.5 or greater
override cannot be resolved to a type


3. Jeg var nødt til at flytte mit info(); kald ud af Bog og over i main.

Hvis jeg beholdte den i Bog retuneret religion null og ikke Kristendom. Jeg kan godt forstå at setreligion ikke er sat endnu ved udprintningen og derfor returnerer null.

Hvis jeg sætter en info(); ind i mit set metode på religion classen fungerer det i forhold til data
Men den returnerer så
Title: MobyDick Forlag: (Nordisk Bøger) Pris: 150.5 Sidetal: 245
Title: Guide To The Galaxy Forlag: Et eller andet Pris: 75.95 Sidetal: 185
Title: Learn Code Forlag: Et eller andet Pris: 450.75 Sidetal: 345
Title: Biblen Forlag: Heaven Books Pris: 255.0 Sidetal: 123 Religion: null
Title: Biblen Forlag: Heaven Books Pris: 255.0 Sidetal: 123 Religion: Kristendom

Den eneste løsning jeg kunne komme på var at kalde info (); fra Main.

seerex
Entusiast
Entusiast
Indlæg:37
Tilmeldt:17. apr 2014, 17:23

Re: Kap 17 øvelse 1 (Et forslag til løsning) + mange spørgs

Indlæg af seerex » 23. maj 2014, 08:38

Hej Henrik,
Henrik Halle skrev:I min class Bog kalder jeg en info(); Men hvis jeg flytter den til et andet sted i koden udskriver den ikke noget.
Det vil sige den kan kun stå i set motoden, hvorfor det?
Du skulle gerne kunne flytte den metode rundt? Du kunne for eksempel sætte den i en get-metode, og så hver gang du kaldte get metoden ville den så kalde info metoden.

Husk, at den skal placeres INDE i en metode (imellem { } ) og at du skal kalde metoden ude fra din main class af, før den jo kalder videre til info metoden. For eksempel skulle det her gerne virke:

Bog class

Kode: Vælg alt

void setForfatter(String forfatter){
   this.forfatter = forfatter;
   info();
   }
Main class

Kode: Vælg alt

Bog mobyDick = new Bog();
      mobyDick.setSidetal(245);
      mobyDick.setPris(150.50);
      mobyDick.setForlag("(Nordisk Bøger) ");
      mobyDick.setForfatter("MobyDick ");
  
Der har jeg sat setForfatter som det sidste metode kald, da jeg ønsker alle de andre er kaldt inden jeg kalder info metoden så jeg får alt info printet ud. Kalder jeg setForfatter før, som jo så kalder info metoden, er alle værdier jo ikke sat endnu.

Henrik Halle skrev:2. I min main class havde jeg…..
Jeg går ud fra, at det er din info() metode der udprinter sidetal og pris på 0. Men prøv og set på rækkefølgen af dine metodekald. Husk, at din info() metode jo kaldes fra din setForlag metode. Det betyder, at hver gang du kalder forlag med Biblen.setForlag("Heaven Books"); så kalder den info() metoden og udprinter informationen om bogen. Problemet her, er jo at du kalder forlag INDEN du kalder setSidetal og setPris. Derfor er der jo ikke sat nogen pris og sidetal, og derfor defaulter den bare til 0. Hvis du sætter forlag som det aller sidste kald, så ved du at alle værdierne er sat, og så skulle den gerne udprinte rigtigt.

Det er også derfor din anden løsning virder, da du der netop har sat setForlag nederst (eller anden nederst, men hvert fald under setPris og setSidetal). :)
Henrik Halle skrev:3. Jeg var nødt til at flytte mit info(); kald ud af Bog og over i main.
Samme svar som spørgsmål 2. Det er rækkefølgen af metodekaldende der forvirrer dig :) Det kan godt være lidt tricky det her med at en metode kalder en anden metode, og i sådanne tilfælde er det vigtigt at kalde i rigtig rækkefølge. Din info() metode kalder du jo fra setForlag, men når du laver din bibel så kalder du setReligion EFTER du har kaldt setForlag, og derfor er den ikke sat endnu. Bytter du om på rækkefølgen af de 2, skulle det gerne virke :)

Så kort sagt, så var det egentlig bare rækkefølgen af metodekaldende der var anledning til de fleste af dine problemer :) Det er bare øvelse der skal til, og så skal man hele tiden huske, at når man kalder en metode fra en anden metode, så er det jo ligesom en "chain of events". Først kalder du den første metode, og den kalder så den anden metode, og når den er færdig returnerer den hele vejen tilbage (prøv eventuelt at tegn dette scenarie med cirkler eller firkanter). At visualiserer denne process kan nogen gange være gavnligt, for ligesom at forstå at metodekald kører på sådan en "snor" efter hinanden.

Håber det hjælper :)

** EDIT **
Ups, glemte helt dit problem med override. :)
- Override er sådan en "fail safe". Noget der ligesom skal hjælpe dig med, om det du nu laver rent faktisk overrider en metode. Det er derfor ikke noget der giver nogen funktionalitet på nogen måde, men det er bare rart at vide at man rent faktisk overrider en metode (som man har planlagt), og at den ikke bare opretter en ny metode. For eksempel, hvis du vil override info() metoden i din religion klasse, men du kommer til at skrive:

infoo()

Altså lige sætter et ekstra 'o' på, så vil den ikke override info() metoden, så vil den oprette en ny metode der hedder infoo(), uden brok og det kunne godt være lidt nasty at debugge :) Men, så kommer Override til redningen, og ved at sætte den før du prøver at override metoden, så tjekker den lige for dig. I førnævnte eksempel, ville den komme og sige noget med "infoo() metoden er ikke en metode jeg kan override, har du lavet en fejl?" (dog mindre pædagogisk) :)

Nå, det var lige et sidespring om override, beklager :P Nu til dig spørgsmål -> tryk på den lille lampe (dit fejl ikon), og vælg den ene quick-fix der er. Det er noget med den ændrer et eller andet til at være 1.5. Jeg mener, det er fordi dit Java projekt er blevet oprettet i en ældre version, end Override er kompitabel med. Når du bruger denne quick-fix, så konverterer den dit projekt til en nyere og kompitabel version, og så skulle Override gerne stoppe med at brokke sig :)

Quick-fix er nogen gange en fin feature, men pas meget på med at bruge den! Den kan virkelig gøre nogle mest mærkværdige ting nogen gange, men i dette her tilfælde skulle den gerne kunne klare det :)

Besvar