1. Ama hepsi bu kadar değil.

Sınıfın diğer iki yöntemi çağıran Cowbir yöntemi olduğunu varsayalım . printAll()Ardından kod şu şekilde çalışacaktır:

kod Tanım
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();
}
Ekran çıktısı şöyle olacaktır:
I'm a white whale
I'm a whale

printAll()Sınıftaki yöntem bir nesneCow üzerinde çağrıldığında , yöntemdekinin değil, sınıfın yönteminin kullanıldığını unutmayın .WhaleprintNameWhaleCow

Önemli olan yöntemin yazıldığı sınıf değil, yöntemin çağrıldığı nesnenin türü (sınıfı).

Yalnızca statik olmayan yöntemler devralınabilir ve geçersiz kılınabilir. Statik yöntemler miras alınmaz ve bu nedenle geçersiz kılınamaz.

WhaleKalıtım ve yöntem geçersiz kılma uygulandıktan sonra sınıfın nasıl göründüğü aşağıda açıklanmıştır :

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");
   }
}
Kalıtım ve yöntem geçersiz kılma uygulandıktan sonra sınıf şu şekilde görünür: Herhangi bir eski yöntem Whalehakkında bilgimiz yok .printName

2. Tahmin

Burada daha da ilginç bir nokta var. Bir sınıf, üst sınıfının tüm yöntemlerini ve verilerini miras aldığından, alt sınıfın bir nesnesine yapılan başvuru, türü üst sınıfla (ve ebeveynin üst sınıfıyla, vb.) aynı olan değişkenlerde saklanabilir (atanabilir). sınıfa kadar Object). Örnek:

kod Tanım
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printColor();
}
Ekran çıktısı şöyle olacaktır:
I'm a white whale
public static void main(String[] args)
{
   Cow cow = new Whale();
   cow.printColor();
}
Ekran çıktısı şöyle olacaktır:
I'm a white whale
public static void main(String[] args)
{
   Object o = new Whale();
   System.out.println(o.toString());
}
Ekran çıktısı şöyle olacaktır:
Whale@da435a.

Yöntem sınıftan toString()miras alınırObject

Bu çok değerli bir özellik: biraz sonra pratikte nasıl kullanılacağını anlayacaksınız.


3. Bir nesne üzerinde bir yöntem çağırma

Bir değişken üzerinde bir yöntem çağrıldığında, yöntem aslında bir nesne üzerinde çağrılır. Bu mekanizmaya dinamik yöntem gönderimi denir.

İşte nasıl göründüğü:

kod Tanım
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printName();
}
Ekran çıktısı şöyle olacaktır:
I'm a whale
public static void main(String[] args)
{
   Cow cow = new Whale();
   cow.printName();
}
Ekran çıktısı şöyle olacaktır:
I'm a whale

printName()Çağrılan yöntemin (sınıftaki Cowveya sınıftaki Whale) özel uygulamasının değişkenin türü tarafından değil, değişkenin başvurduğu nesnenin türü tarafından belirlendiğini unutmayın.

Değişken , Cowbir nesneye bir referans depolar Whaleve printName()sınıfta tanımlanan yöntem Whaledenir.

Bu çok açık değil. Ana kuralı unutmayın:

Bir değişken üzerinde çağrılabilecek yöntemler kümesi, değişkenin türüne göre belirlenir. Ve çağrılan belirli yöntem uygulaması, değişken tarafından atıfta bulunulan nesnenin türü/sınıfı tarafından belirlenir.

Bununla her zaman karşılaşacaksınız, bu yüzden bunu ne kadar çabuk hatırlarsanız o kadar iyi.