webForumDet fria alternativet

Förklaring av vad som händer vid enkelriktad association

Java

6 svar · 356 visningar · startad av erka

Medlem sedan dec. 19996 522 inlägg
Frågan#1

Hej!

Undrar om någon kan förklara exakt och utförligt vad som händer här steg för steg, för en nybörjare :) . Jag har säg två klasser, Student och Kurs, där en ärare ska ansvara för en Kurs.

Student


public class Student {

	private String namn;
	private Kurs laserKurs;
	
	public Student(){
	}
	
	public Student(String nyttNamn){
		setNamn(nyttNamn);
	}
	
	public void setNamn(String nyttNamn){
		namn = nyttNamn;
	}
	
	public String getNamn(){
		return namn;
	}
	
	public void setLaserKurs(Kurs newKurs){
		laserKurs = newKurs;	
	}
	
	public Kurs getLaserKurs(){
		return laserKurs;
	}
}

Kurs

public class Kurs {
	
	private String kursKod;
	private int kursPoäng;
	
	public Kurs(){}
	
	public Kurs(String newKursKod){	
		setKursKod(newKursKod);
	}
	
	public void setKursKod(String newKursKod){
		kursKod = newKursKod;
	}
	
	public String getKursKod(){
		return kursKod;
	}
	
	public void setKursPoäng(int newKursPoäng){
		kursPoäng = newKursPoäng;
	}
	
	public int getKursPoäng(){
		return kursPoäng;
	}
}

Det jag undrar över är vad exakt som händer här när jag skapar en testklass som heter just:

testKlass

public class testKlass {

	public static void main(String[] args) {
		Student student1 = new Student("Anders And");
		Kurs kurs1 = new Kurs("INF 610");
		Kurs testKurs;
			
		kurs1.setKursPoäng(10);	
		student1.setLaserKurs(kurs1);
		testKurs = student1.getLaserKurs();
		
		System.out.println ("Studennamn: " + student1.getNamn());
		System.out.println ("Kurs: " + testKurs.getKursKod());
		System.out.println ("Kurspoäng: " + testKurs.getKursPoäng());

	}
}

Det jag inte exakt hajjar är raden

testKurs = student1.getLaserKurs();

skriver jag tex

System.out.println (student1.getLaserKurs());

får jag "Kurs@1cde100", är det en minnesadress eller vad är det, vad är det exakt som händer vid testKurs = student1.getLaserKurs();.

Tacksam

Medlem sedan juli 2001228 inlägg
#2

Här sätter du studentens kurs till Kurs objektet som kurs1 refererar till.
student1.setLaserKurs(kurs1);

Här tilldelar du referensen testKurs samma objekt.
testKurs = student1.getLaserKurs();

Nu refererar både kurs1 och testKurs till samma objekt (samma adress i minnet).

När du kör en printout på ett objekt används objektets toString() metod och så länge man inte har överlagrat den så körs farfarklassen Object's toString(), vilken bara skriver ut minnes adressen.

Skriv en egen toString() metod i klassen som returnerar något beskrivande för dess tillstånd.

mvh
phonk

Medlem sedan aug. 20021 752 inlägg
#3

Du har inte bifogat någon kod till klassen Student, så exakt vad som händer är svårt att säga, men en kvalifiserad gissning ska man nog kunna göra :)

När du anroppar funktionen getLaserKurs så retuneras en referens (pekare) till ett objekt av typen Kurs (troligtvis det objekt som du lägger till med funktionen setLaserKurs ovanför). När du försöker skriva ut den med System.out så anroppas funktionen toString, denna funktion finns i alla objekt, och den skriver ut namnet på klassen, Kurs och var den ligger i minnet.

/Viktor

Medlem sedan dec. 19996 522 inlägg
#4

Oj jag råkade kopiera in fel klass :( Nu är det rätt.

Tack för era svar, ska se om jag har hajjat det här rätt.

Jag kan inte få ut namnet på kursen som studenten läser (som jag satt via student1.setLaserKurs(kurs1);) ? Utan för att få det måste jag skapa en ny instans av kurs (testKurs) och tilldela det den kurs som studenten läser,och sedan skriva ut det. ?

Medlem sedan feb. 20002 300 inlägg
#5

Ja, antingen gör du så. Eller så skriver du t.ex:

System.out.println(student1.getLaserKurs().getKursKod());

Red:

Alternativt som Phonkworks skrev så lägger du till en metod toString() i klassen Kurs som kanske ser ut såhär:

public String toString()
{
    return "Kurskod: " + kursKod + " Kurspoäng: " + kursPoäng;
}

Alla objekt i java härstammar i grund och botten från samma Klass (Object). Denna klass har en metod toString() som default returnerar en sträng med det aktuella objektets adress (egentligen inte men vi säger det för enkelhetens skull.. ;)).

Om du lägger till en metod i din egen klass som du kallar för toString() så överlagrar du "defaultmetoden" toString().
Dvs du beskriver vad som ska returnera istället för adressen.

Så nu kan du t.ex. skriva:

Kurs kurs1 = new Kurs("INF 610");
kurs1.setKursPoäng(10);

System.out.println(kurs1); // Här anropas din egen toString() istället för Objects toString eftersom du överlagrat!
Medlem sedan juli 2001228 inlägg
#6

Njae, du behöver ju inte tilldela kursen som är sparad i student till en ny referens (testKurs).

Du kan göra så här tex:

public class testKlass {

	public static void main(String[] args) {
		Student student1 = new Student("Anders And");
		Kurs kurs1 = new Kurs("INF 610");
		//Kurs testKurs;
			
		kurs1.setKursPoäng(10);	
		student1.setLaserKurs(kurs1);
		//testKurs = student1.getLaserKurs();
		
		System.out.println ("Studennamn: " + student1.getNamn());
		System.out.println ("Kurs: " + student1.getLaserKurs().getKursKod());
		System.out.println ("Kurspoäng: " + student1.getLaserKurs().getKursPoäng());

	}
}

mvh
phonk

Medlem sedan dec. 19996 522 inlägg
#7

tack! nu är det klarare, förbannade lärare som krånglar till det för ens hjärna ;)

264 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
116 ms — ändringar (db)