6.4. Stamklassen Object

Klassen Object (i pakken java.lang) er 'alle klassers moder', dvs. superklasse for alle andre klasser. Arver en klasse ikke fra noget andet, vil den automatisk arve fra Object.

Alle klasser arver fra Object

Således arver f.eks. Terning fra Object. FalskTerning1 arver indirekte fra Object gennem Terning. Alle standardklasserne arver også fra Object, muligvis gennem andre klasser.

Figur 6-7. Java

Det er derfor, at bl.a. toString()-metoden findes på alle objekter; den er defineret i Object og arves til alle klasser i Java. Her ses, hvad der sker, hvis man udskriver et (f.eks. Boks-) objekt der ikke har sin egen toString():


...
  Boks b = new Boks();
  System.out.println("b = "+b);   // b.toString() kaldes implicit
...

Resultatet bliver:


  b = Boks@4852d1b0

Den bruger toString() fra Object, og man kan altså se, at implementationen af toString() i Object returnerer klassens navn, et '@' og et tal, f.eks. Boks@4852d1b0.

En anden metode i Object er equals(). Den har vi brugt til at undersøge, om strenge er ens, men den findes altså på ethvert objekt og kan f.eks. også bruges til at undersøge om to vektorer indeholder de samme elementer.

6.4.1. Referencer til objekter

Når alle objekter arver fra Object, kan man i en variabel af denne type gemme en reference til ethvert slags objekt, jf. reglerne om typekonvertering:


  Object o;
  o=new Point();
  o="hej";
  o=new FalskTerning2();

Omvendt kan man ikke rigtig bruge variablen til noget, før man har lavet en eksplicit referencetypekonvertering:


  Terning t;
  t=(Terning) o;
  t.kast();

Her var jeg heldig, at o faktisk refererede til en (underklasse) af Terning. Jeg får først at vide, om min typekonvertering er gået godt på kørselstidspunktet.

Tilsvarende kan man bruge Object som parameter / returtype og få et fleksibelt, men ikke særlig sikkert program. Klassen Vector benytter sig af dette: Vektorer arbejder med lister af typen Object, det er derfor, man kan gemme alle slags objekter i dem.


  vector v = new Vector();
  Point p = new Point();
  v.addElement(p);

Metoden addElement() tager et objekt af typen Object (dvs. et hvilket som helst objekt) som parameter.

Nedenfor er vist det samme, men her bruges en mellemvariabel, der illustrerer, at der sker en implicit reference-typekonvertering (p skal jo konverteres fra en Point-reference til en Object-reference):


  vector v = new Vector();
  Point p = new Point();
  Object o;                  // overflødig mellemvariabel
  o = p;                     // implicit reference-typekonvertering
  v.addElement(o);

Når man kalder elementAt() for at få fat i objektet igen, er det nødvendigt med en eksplicit reference-typekonvertering, fordi konverteringen sker den anden vej, fra superklasse til underklasse:


  p = (Point) v.elementAt(0);

Igen vises det samme blot med mellemvariabel, så man kan se, hvilken typekonvertering der finder sted:


  o = v.elementAt(0);        // ingen konvertering
  p= (point) o;              // eksplicit reference-typekonvertering