1. Men det er ikke alt.

Antag, at Cowklassen har en printAll()metode, der kalder to andre metoder. Så vil koden virke sådan:

Kode Beskrivelse
class Cow
{
   public void printAll()
   {
      printColor();
      printName();
   }

   public void printColor ()
   {
      System.out.println("I'm a white whale");
   }

   public void printName()
   {
      System.out.println("I'm a cow");
   }
}

class Whale extends Cow
{
   public void printName()
   {
      System.out.println("I'm a whale");
   }
}
public static void main(String[] args)
{
   Whale whale = new Whale ();
   whale.printAll();
}
Skærmoutput vil være:
I'm a white whale
I'm a whale

Bemærk, at når printAll()metoden i Cowklassen kaldes på et Whaleobjekt,printNameWhale bruges klassens metodeCow , ikke metoden i metoden.

Det vigtigste er ikke den klasse metoden er skrevet i, men snarere typen (klassen) af det objekt, som metoden kaldes på.

Kun ikke-statiske metoder kan nedarves og tilsidesættes. Statiske metoder nedarves ikke og kan derfor ikke tilsidesættes.

Sådan Whaleser klassen ud efter anvendelse af arv og metodetilsidesættelse:

class Whale
{
   public void printAll()
   {
      printColor();
      printName();
   }

   public void printColor()
   {
      System.out.println("I'm a white whale");
   }

   public void printName()
   {
      System.out.println("I'm a whale");
   }
}
Sådan Whaleser klassen ud efter at have anvendt arv og metodetilsidesættelse: Vi kender ikke til nogen gammel printNamemetode.

2. Typecasting

Der er en endnu mere interessant pointe her. Fordi en klasse arver alle metoder og data fra dens overordnede klasse, kan en reference til et objekt i den underordnede klasse lagres i (tildelt til) variabler, hvis type er den samme som den overordnede klasse (og forælderens overordnede osv. — helt op til klassen Object). Eksempel:

Kode Beskrivelse
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printColor();
}
Skærmoutput vil være:
I'm a white whale
public static void main(String[] args)
{
   Cow cow = new Whale();
   cow.printColor();
}
Skærmoutput vil være:
I'm a white whale
public static void main(String[] args)
{
   Object o = new Whale();
   System.out.println(o.toString());
}
Skærmoutput vil være:
Whale@da435a.

Metoden toString()er nedarvet fra Objectklassen

Dette er en meget værdifuld ejendom: lidt senere vil du forstå, hvordan du bruger den i praksis.


3. Kald en metode på et objekt

Når en metode kaldes på en variabel, kaldes metoden faktisk på et objekt. Denne mekanisme kaldes dynamisk metodeafsendelse.

Sådan ser det ud:

Kode Beskrivelse
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printName();
}
Skærmoutput vil være:
I'm a whale
public static void main(String[] args)
{
   Cow cow = new Whale();
   cow.printName();
}
Skærmoutput vil være:
I'm a whale

Bemærk, at den specifikke implementering af printName()metoden, der bliver kaldt — den i Coweller den i Whaleklassen — ikke bestemmes af variablens type, men af ​​typen af ​​objektet, som variablen refererer til.

Variablen Cowgemmer en reference til et Whaleobjekt, og den printName()metode, der er defineret i Whaleklassen, er det, der kaldes.

Dette er ikke særlig indlysende. Husk hovedreglen:

Sættet af tilgængelige metoder til at blive kaldt på en variabel bestemmes af variablens type. Og den specifikke metodeimplementering, der bliver kaldt, bestemmes af typen/klassen af ​​objektet, der henvises til af variablen.

Du vil støde på dette hele tiden, så jo før du husker det, jo bedre.