webForumDet fria alternativet

toString metod ?

16 svar · 790 visningar · startad av Sunix

SunixMedlem sedan juli 2004307 inlägg
#1

Hej!

Jag hade en tentamen i grundläggande java för ett tag sedan.
på tentan var en fråga ungefär så här.

public void skrivUt()
{
   System.out.println("*** Attributinnehåll ***");
   System.out.println("Regnr: " + regNr + ", ägare: " + ägare);
   System.out.println("*******************");
}

Gör en toString metod som gör att rad 3 i nedanstående kod ger samma resultat som rad 2

up3.skrivUt(); // rad 2. skrivUt() är samma metod som den ovan
System.out.println(up3); // rad 3

Hur gör man detta? up3 är ju en referens till ett objekt, ingen metod ??

Tack

ViktorMedlem sedan aug. 20021 710 inlägg
#2

Alla klasser i Java ärver från klassen Object, klassen Object har en funktion som heter just toString() som retunerar en sträng. När du säger till att du vill skriva ut ett objekt så anroppar System.out.println just denna toString funktion hos det objekt som du har skickat med som argument så för att själv styra vad som skrivs ut när man gör på detta sätt är det bara att överlagra toString() funktionen i din egna klass.

public class Up3
{
	public void skrivUt()
	{
		System.out.println("*** Attributinnehåll ***");
		System.out.println("Regnr: " + regNr + ", ägare: " + ägare);
		System.out.println("*******************");
	}

	public String toString()
	{
		String str="*** Attributinnehåll ***\n";
		str+="Regnr: " + regNr + ", ägare: " + ägare+"\n";
		str+="*******************\n";
		return(str);
	}

}

/Viktor

SunixMedlem sedan juli 2004307 inlägg
#3

Ok, och med överlagra menar du att om en metod har samma namn i en subklass som en metod i en superklass så används subklassens metod ifall man har en referens till subklassen?

För visst är det så att en referens till en subklass alltid når superklassens metoder ?? men inte tvärtom.
Då får man använda casting eller?

ex: superklass Person
subklass Elev

Elev a = new Elev();
a.metodISuperKlass();

Person p = new Person();
p.nårInteMetodISubKlass(); ?

Person p = new Elev();
(Elev(p)).nuNårJagMetodenEller(); ?

Sedan har jag lite problem att förstå alla begrepp.

Instans eller referens är det samma sak ?
ex:
Person p = new Person(); // Skapar en referens(p) till objektet Person. Eller skapas en instans av objektet Person??
Suck *

Tack för ditt svar !!

aasahMedlem sedan mars 20033 451 inlägg
#4

I JAVA fungerar det på följande sätt:

public class Person {
  private String namn;
  private String pnr;
  
  //...

  public String getID() {
    return pnr;
  }  

}

public class Student extends Person {
  private String study;
  private String kårID;

  //

  public String getID() {
    return kårID;
  }  

}

Person p = new Student(); //OK Student är en Person

Men samtidigt når du din student via p, så:
p.getID() returnerar p's kårID, inte personnummer. Skälet är att metoden är överskriven till att returnera kårID i stället för pnr.

Och att även om p:s typ är Person, så pekar den på en student, så de metoder som körs är Studentens metoder.

****
Referens är ett begrepp du helst ska glömma bort i Java. Det finns objekt, instanser och pekare.

När du skapar en "individ" av en viss klass mha new så får du en instans.

SunixMedlem sedan juli 2004307 inlägg
#5

Ok, men på vår tenta fanns det frågor som blandade mellan referens och instans så jag hade svårt att greppa det.

Men om jag skriver:
Person p = new Student();
så måste jag väl använda casting för att komma åt Students metoder eller hur!?

(Student(p)).metodIStudent()

aasahMedlem sedan mars 20033 451 inlägg
#6

Sunix skrev:

Ok, men på vår tenta fanns det frågor som blandade mellan referens och instans så jag hade svårt att greppa det.

Men om jag skriver:
Person p = new Student();
så måste jag väl använda casting för att komma åt Students metoder eller hur!?

(Student(p)).metodIStudent()

Du är säker på att du postat i rätt forum? Allt du säger är rätt och vettigt för C++ men inte för Java.

Referens är ett begrepp som används mycket inom C++, men jag har aldrig - tror jag - mött det i Java. (Har i och för sig inte använt senaste Java-versionen.)

En överskriven metod som både finns i superklassen och subklassen (getID i mitt exempel, toString som det här startade med) kommer att returnera rätt saker vid anrop (dvs subklassens). En metod som bara finns i subklassen når du med casting:
((Student)p).metodIStudent();

ViktorMedlem sedan aug. 20021 710 inlägg
#7

aasah skrev:

Referens är ett begrepp som används mycket inom C++, men jag har aldrig - tror jag - mött det i Java. (Har i och för sig inte använt senaste Java-versionen.)

Är du säker att det är rätt forum ;)

Jag är ingen begrepps människa men jag är säker på att jag många gånger har hört "I Java finns inga pekare bara referenser!", men nu är det ju i stort sätt samma sak så det är väll bara en begrepps fråga.

Person p=new Person();

Om man bryter ner den här koden,

Person p

Skapar en behållare som kan referera till ett object/en instans av typen Person och alla klasser som ärver från Person.

new Person();

Denna del skapar en ny instans av klassen Person, ett nytt objekt.

=

Säger att p ska referera till just den instans som skapas.

/Viktor

SunixMedlem sedan juli 2004307 inlägg
#8

Hur duktig är du egentligen Viktor!

Så behållaren p av typen Person blir en referens som refererar till en kopia(instans) av objektet Person. Har jag fattat det rätt?

Skiver man lilla p p.g.a. att det är en referensvariabel?

Så:

Media m = new Video();
Behållaren m av typen Media refererar till en instans av objektet Video.

Tack för alla svar!

ViktorMedlem sedan aug. 20021 710 inlägg
#9

I Java bör (ska...) alla klasser börja med stor bokstav och alla variabler/funktioner börja med liten bokstav.

Media m = new Video();
Behållaren m av typen Media refererar till en instans av objektet Video.

Japp, så länge som Video ärver av Media :)

/Viktor

SunixMedlem sedan juli 2004307 inlägg
#10

Kul kul :)

aasahMedlem sedan mars 20033 451 inlägg
#11

Viktor skrev:

...Jag är ingen begrepps människa men jag är säker på att jag många gånger har hört "I Java finns inga pekare bara referenser!", men nu är det ju i stort sätt samma sak så det är väll bara en begrepps fråga...

Ja. Jag förstår vad du menar, nu.

PeWMedlem sedan juni 20006 839 inlägg
#12

aasah skrev:

Referens är ett begrepp som används mycket inom C++, men jag har aldrig - tror jag - mött det i Java.

Ähum..
http://www.webforum.nu/showthread.php?s=&postid=600660#post600660 :h

'Referens' används ganska flitigt i de flesta språk ;)

aasahMedlem sedan mars 20033 451 inlägg
#13

PeW skrev:

aasah skrev:

Referens är ett begrepp som används mycket inom C++, men jag har aldrig - tror jag - mött det i Java.

Ähum..
http://www.webforum.nu/showthread.php?s=&postid=600660#post600660 :h...

Ja? :q DU pratar om referens, jag om pekare i citatet ovan. Enligt min åsikt finns inte referenser i Java. Inte med den definition som jag har på "referens". Å andra sidan är inte det en åsikt jag tänker pracka på andra. Att jag nämnde det i denna tråd berodde på att jag missförstod en annan del av hans fråga först. Och när jag insåg mitt misstag och ändrade den nedre delen av svaret, glömde jag att ändra den kommentaren. Och när jag kom tillbaka tyckte jag inte att jag kunde ta bort den eftersom andra redan kommenterat den. Jag har redan hållit med om att det är en begreppsfråga.

PeWMedlem sedan juni 20006 839 inlägg
#14

Enligt min åsikt finns inte referenser i Java

Du får väl ha din åsikt, men vilken kurslitteratur i java använder INTE begreppet referens när man menar en pekarliknande variabel?

F.ö var det lite lustigt att du inte stött på uttrycket tidigare ;)

SunixMedlem sedan juli 2004307 inlägg
#15

Sluta bråka nu!

Sang-draxMedlem sedan juli 2002570 inlägg
#16

PeW skrev:

Enligt min åsikt finns inte referenser i Java

Du får väl ha din åsikt, men vilken kurslitteratur i java använder INTE begreppet referens när man menar en pekarliknande variabel?

F.ö var det lite lustigt att du inte stött på uttrycket tidigare ;)

I Java heter det NullPointerException, inte NullReferenceException. :)

I C++ kan pekare vara lika med 0, referenser kan det inte. Referenser i C++ kan inte byta det de refererar till, men det kan pekare.
Med C++-ögon skulle man kunna säga att sakerna i Java är mer lika pekare än referenser.

Dock är detta en helt meningslös fråga, då det bara finns en sort i Java råder det följdaktligen heller inte någon tvekan om vad man menar. Referens och pekare är heller inte någon fastslagen betydelse, utan det är upp till varje språk att definera betydelsen.

Sang-draxMedlem sedan juli 2002570 inlägg
#17

.

Genererad på 376 ms · cache AV · v20260730165559-full.f96bc7eb