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.
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 *
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.
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();
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.
...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? :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.
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.