-compile time (statik)
-runtime (dinamik)
Compile time, və ya statik polimorfizm Java kodları baytkoda çevrilərkən, kompilyasiya prosesi zamanı baş verir. Ən çox bilinən forması: Overloading (çox yüklənmə)
Overloading həm konstruktorlar, həm də metodlar üçün keçərlidir. Bu zaman konstruktor və ya metodların adları eyni olur, lakin aldığı parametrlərin sayı, tipi və sıralaması fərqli olur. Məsələn,
public class Test
{
public Test()
{
...
}
public Test(String s)
{
...
}
public Test(int i)
{
...
}
public Test(String s, int i)
{
...
}
public Test(int i, String s)
{
...
}
}
Kod daxilində situasiyaya uyğun olaraq bu konstruktorlardan istənilən biri çağırıla bilər. Hansı parametr dəsti uyğun gəlsə, o konstruktor işə düşəcək. Mənbə kodun kompilyasiyası zamanı bu, artıq təyin olunmuşdur. Bu cür konstruktor və metodlar Overloaded adlanır.
Runtime, və ya dinamik polimorfizm kompilyasiya olmuş kodun icrası zamanı baş verir. Ən çox bilinən forması: Overriding (üst-üstə minmə).
Overriding varislik əlaqələrində özünü göstərir. Üst sinifdə yazılmış konstruktor və ya metod eyni imza (signature) və dönüş tipi ilə (return type) alt sinifdə yenidən yazılarsa, bu konstruktor və ya metod Overrided olmuş olur. Bunun mənası odur ki, hər sinifdə konstruktor və ya metodun işləmə prosesi bir-birindən fərqlənə bilər və həmin sinifə uyğun şəkildə yenidən yazılmalıdır. Məsələn,
Üst sinif:
public class Test
{
public String test(String s)
{
...
}
}
Alt sinif:
public class Test1 extends Test
{
public String test(String s)
{
...
}
public static void main(String[] arg)
{
Test1 t=new Test1();
t.metod("Java");
}
}
Burada Test1 sinfindən olan t obyekti Test1 sinfinin test metodunu çağırır. Əgər bu metod alt sinifdə yenidən yazılmış olmasaydı, bu zaman Test sinfindəki metod icra olunacaqdı. Bu, varislik mövzusunda daha geniş izah olunacaq.