CodeGym /Kurslar /Java SELF AZ /Polimorfizm, hissə 2

Polimorfizm, hissə 2

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

1. Amma hələ bu hamısı deyil

Tutaq ki, Cow sinfində printAll() metodu var, hansı ki, iki başqa metodu çağırır. Onda kod belə işləyəcək:

Kod Təsvir
class Cow
{
   public void printAll()
   {
      printColor();
      printName();
   }

   public void printColor ()
   {
      System.out.println("Mən - ağam");
   }

   public void printName()
   {
      System.out.println("Mən - inəyəm");
   }
}

class Whale extends Cow
{
   public void printName()
   {
      System.out.println("Mən - balinayam");
   }
}
public static void main(String[] args)
{
   Whale whale = new Whale ();
   whale.printAll();
}
Ekranda aşağıdakı yazı görünəcək:
Mən - ağam
Mən - balinayam

Diqqət yetirin: printAll() metodu çağırıldıqda, hansı ki, Cow sinfində yazılıb, Whale tipli obyekt üçün printName metodu Whale sinfindən istifadə olunur, Cow deyil.

Əsas məsələ metodun hansı sinifdə yazılması deyil, bu metodun çağırıldığı obyektin tipi (sinifi).

Yalnız static olmayan metodları miras almaq və yenidən təyin etmək olar. Static metodlar miras alınmır və buna görə də yenidən təyin edilmir.

Miras alınma və metodların yenidən təyini tətbiq edildikdən sonra Whale sinfi belə görünür:

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

   public void printColor()
 {       System.out.println("Mən - ağam");
   }

   public void printName()
   {
      System.out.println("Mən - balinayam");
   }
}
Miras alınma və metodların yenidən təyini tətbiq edildikdən sonra Whale sinfi belə görünür. Artıq köhnə printName metodu haqqında bir şey bilmirik.

2. Tiplərin gətirilməsi

Burada daha maraqlı bir məqam var. Belə ki, sinif irsi olaraq ana sinfin bütün metodlarını və məlumatlarını alır, bu sinfin obyekti ana sinfin dəyişənlərində (və ana-ananın, və s., Object sinfinə qədər) saxlanıla (təyin edilə) bilər. Misal:

Kod Təsvir
public static void main(String[] args)
{    Whale whale = new Whale();
   whale.printColor();
}
Ekranda bu yazı görsənəcək:
Mən ağam
public static void main(String[] args)
{
   Cow cow = new Whale();
   cow.printColor();
}
Ekranda bu yazı görsənəcək:
Mən ağam
public static void main(String[] args)
{
   Object o = new Whale();
   System.out.println(o.toString());
}
Ekranda bu yazı görsənəcək:
Whale@da435a.

toString() metodu Object sinfindən miras alınıb

Bu çox qiymətli xüsusiyyətdir: bir az sonra bunun praktikada necə istifadə ediləcəyini başa düşəcəksiniz.


3. Obyekt metodunun çağırılması

Bir dəyişənin metodu çağırıldıqda, real metod obyekt üzərində çağırılır. Bu mexanizm metodların dinamik dispetçerizasiyası adlanır.

Bu, necə görünür:

Kod Təsvir
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printName();
}
Ekranda bu yazı görsənəcək:
Mən - balina
public static void main(String[] args)
{
   Cow cow = new Whale();
   cow.printName();
}
Ekranda bu yazı görsənəcək:
Mən - balina

Nəzərə alın ki, hansı məhz printName() metodu çağırılacaqsa, Cow və ya Whale sinfindən, dəyişənin tipi deyil, obyektin tipi təsir edir.

Cow tipində dəyişəndə Whale tipli obyektə istinad saxlanılır və Whale sinfində təsvir edilmiş printName() metodu çağırılacaq.

Bu o qədər də açıq-aşkar deyil. Əsas qaydanı yadda saxlayın:

Bir dəyişən üçün çağırıla bilən metodlar dəsti dəyişənin tipi ilə müəyyən edilir. Amma məhz hansı metod/hansı realizasiya çağırılacaqsa, bu, dəyişənin istinad saxladığı obyektin tipi/sinfi ilə müəyyən edilir.

Siz buna daim rast gələcəksiniz, ona görə də nə qədər tez yadda saxlasanız, bir o qədər yaxşıdır.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION