Jaka jest różnica między dynamicznym i statycznym polimorfizmem w Javie?

Czy ktoś może podać prosty przykład, który wyjaśnia różnicę między dynamicznym i statycznym polimorfizmem w Javie?

Author: ROMANIA_engineer, 2013-12-26

12 answers

polimorfizm

1. Wiązanie statyczne / Wiązanie w czasie kompilacji / wczesne Wiązanie / przeciążenie metody.(w tej samej klasie)

2. Dynamiczne wiązanie / wiązanie w czasie wykonywania / późne wiązanie / nadpisywanie metod.(w różnych klasach)

Przykład przeciążenia:

class Calculation {  
  void sum(int a,int b){System.out.println(a+b);}  
  void sum(int a,int b,int c){System.out.println(a+b+c);}  

  public static void main(String args[]) {  
    Calculation obj=new Calculation();  
    obj.sum(10,10,10);  // 30
    obj.sum(20,20);     //40 
  }  
}  

Przykład nadrzędny:

class Animal {    
   public void move(){
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {

   public void move() {
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal a = new Animal(); // Animal reference and object
      Animal b = new Dog(); // Animal reference but Dog object

      a.move();//output: Animals can move

      b.move();//output:Dogs can walk and run
   }
}
 138
Author: KhAn SaHaB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-14 10:05:09
  • Przeciążenie metodą byłoby przykładem polimorfizmu statycznego

  • Natomiast nadpisywanie byłoby przykładem polimorfizmu dynamicznego.

    Ponieważ, w przypadku przeciążenia, kompilator wie, którą metodę połączyć z wywołaniem. Jednak w czasie wykonywania określa się dynamiczny polimorfizm

 24
Author: user1374,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-26 10:38:18

Polimorfizm dynamiczny (run time) jest polimorfizmem istniejącym w czasie wykonywania. Tutaj kompilator Javy nie rozumie, która metoda jest wywoływana w czasie kompilacji. Tylko JVM decyduje, która metoda jest wywoływana w czasie wykonywania. Przeciążanie metod i nadpisywanie metod za pomocą metod instancji są przykładami dynamicznego polimorfizmu.

Na przykład

  • Rozważ aplikację, która serializuje i de-serializuje różne rodzaje dokumenty.

  • Możemy mieć 'Document' jako klasę bazową i inny typ dokumentu klasy wynikające z niego. Np. XMLDocument, worddocument itp.

  • Klasa dokumentu zdefiniuje 'Serialize ()' i ' De-serialize ()' metody jako wirtualne i każda klasa pochodna zaimplementuje te metody na swój sposób oparte na rzeczywistej zawartości dokumentów.

  • Kiedy różne rodzaje dokumentów muszą być serialized/de-serialized, obiekty dokumentu będą kierowane przez "Document" class reference (or pointer) and when the" Wywołane są metody Serialize() ' lub 'De-serialize()' , wywoływane są odpowiednie wersje metod wirtualnych.

Polimorfizm statyczny (czas kompilacji) jest polimorfizmem wykazywanym w czasie kompilacji. Tutaj kompilator Javy wie, która metoda jest wywoływana. Przeciążanie metod i nadpisywanie metod za pomocą metod statycznych; nadpisywanie metod za pomocą metod prywatnych lub końcowych są przykładami statycznych polimorfizm

Na przykład

  • Obiekt pracowniczy może mieć dwie metody print (). jedna nie argumenty i jeden przyjmujący ciąg przedrostkowy, który ma być wyświetlany wraz z dane pracownika.

  • Biorąc pod uwagę te interfejsy, gdy metoda print () jest wywoływana bez żadnych arguments, kompilator, patrząc na argumenty funkcji wie, która funkcja ma być wywołana i generuje kod obiektowy odpowiednio.

Po więcej szczegółów proszę przeczytać "co to jest polimorfizm "(Google to).

 12
Author: rachana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-26 13:59:53

Polimorfizm: Polimorfizm to zdolność obiektu do przyjmowania wielu form. Najczęstsze użycie polimorfizmu w OOP występuje, gdy odwołanie do klasy nadrzędnej jest używane do odniesienia się do obiektu klasy potomnej.

Dynamiczne Wiązanie / Polimorfizm Runtime:

Polimorfizm czasu pracy znany również jako nadpisywanie metod. W tym mechanizmie wywołanie nadpisanej funkcji jest rozwiązywane w czasie wykonywania.

public class DynamicBindingTest {

    public static void main(String args[]) {
        Vehicle vehicle = new Car(); //here Type is vehicle but object will be Car
        vehicle.start();       //Car's start called because start() is overridden method
    }
}

class Vehicle {

    public void start() {
        System.out.println("Inside start method of Vehicle");
    }
}

class Car extends Vehicle {

    @Override
    public void start() {
        System.out.println("Inside start method of Car");
    }
}

Wyjście:

Inside start metoda samochodu

Polimorfizm wiązania statycznego / czas kompilacji:

O tym, Która metoda ma być wywołana, decyduje tylko w czasie kompilacji.

public class StaticBindingTest {

    public static void main(String args[])  {
       Collection c = new HashSet();
       StaticBindingTest et = new StaticBindingTest();
       et.sort(c);

    }

    //overloaded method takes Collection argument
    public Collection sort(Collection c){
        System.out.println("Inside Collection sort method");
        return c;
    }


   //another overloaded method which takes HashSet argument which is sub class
    public Collection sort(HashSet hs){
        System.out.println("Inside HashSet sort method");
        return hs;
    }

}

Wyjście: Inside Collection sort metho

 6
Author: loknath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-21 06:08:35

Metoda przeciążenia jest przykładem compile time/static polymorphism ponieważ powiązanie metody pomiędzy wywołaniem metody i definicją metody zachodzi w czasie kompilacji i zależy od referencji klasy (Referencja utworzona w czasie kompilacji i trafia do stosu).

Metoda nadrzędna jest przykładem run time/dynamic polymorphism ponieważ powiązanie metody pomiędzy wywołaniem metody i definicją metody następuje w czasie uruchomienia i zależy od obiektu klasy (obiekt wytworzony w trybie runtime i trafia do sterty) .

 6
Author: Sujith PS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-20 13:56:27

w prostych słowach :

polimorfizm statyczny : Ta sama nazwa metody to przeciążony z innym typem lub liczbą parametrów w ta sama klasa (inny podpis). Wywołanie metody docelowej jest rozwiązywane podczas kompilacji.

polimorfizm dynamiczny: Ta sama metoda to overridden z tym samym podpisem w różne klasy. Rodzaj obiektu, na którym metoda jest wywoływane nie jest znane w czasie kompilacji, ale zostanie podjęta decyzja w czasie wykonywania.

Ogólnie przeciążenie nie będzie uważane za polimorfizm.

From Java tutorial page :

Podklasy klasy mogą definiować własne unikalne zachowania, a mimo to współdzielić niektóre z tych samych funkcji klasy nadrzędnej

 6
Author: Ravindra babu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-19 10:14:32

Powiązanie odnosi się do związku między wywołaniem metody a definicją metody.

To zdjęcie wyraźnie pokazuje, co jest wiążące.

Wiązanie

Na tym zdjęciu, " a1.methodOne () "wywołanie jest wiążące z odpowiednią definicją methodOne () i" a1.methodTwo () " wywołanie jest wiążące z odpowiadającą mu definicją methodTwo ().

Dla każdego wywołania metody powinna być odpowiednia definicja metody. Jest to zasada w języku java. Jeśli kompilator nie widzi właściwej metody definicja dla każdego wywołania metody rzuca błąd.

Teraz przejdźmy do wiązania statycznego i wiązania dynamicznego w Javie.

Statyczne Wiązanie W Javie:

Wiązanie statyczne jest wiązaniem, które dzieje się podczas kompilacji. On nazywane również wczesnym wiązaniem, ponieważ Wiązanie dzieje się przed programem faktycznie działa

.

Wiązanie statyczne można zademonstrować jak na poniższym obrazku.

Tutaj wpisz opis obrazka

Na tym zdjęciu 'a1' jest zmienna odniesienia typu klasy A wskazująca na obiekt klasy A. " a2 " jest również zmienną odniesienia typu klasy A, ale wskazującą na obiekt klasy B.

Podczas kompilacji, podczas wiązania, kompilator nie sprawdza typu obiektu, do którego wskazuje dana zmienna odniesienia. Sprawdza tylko typ zmiennej referencyjnej, za pomocą której wywołana jest metoda i sprawdza, czy istnieje dla niej definicja metody w tym typie.

Na przykład dla " a1.method () " wywołanie metody na powyższym obrazku kompilator sprawdza, czy istnieje definicja metody method() w klasie A. Ponieważ' a1 ' jest typem klasy A. Podobnie, dla " a2.method () "wywołanie metody, sprawdza, czy istnieje definicja metody dla metody () w klasie A. Ponieważ' a2 ' jest również typem klasy A. Nie sprawdza, do którego obiektu, 'a1' i 'a2' są wskazywane. Ten rodzaj wiązania nazywa się wiązaniem statycznym.

Dynamiczne Wiązanie W Javie:

Dynamiczne Wiązanie jest wiązaniem, które dzieje się podczas biegu. Jest to również nazywane późnym wiązaniem, ponieważ Wiązanie dzieje się wtedy, gdy program faktycznie jest bieganie.

W czasie wykonywania rzeczywiste obiekty są używane do wiązania. Na przykład dla " a1.method () " wywołanie na powyższym obrazku zostanie wywołane method() rzeczywistego obiektu, do którego wskazuje 'a1'. Dla " a2.method () " wywołanie, metoda() rzeczywistego obiektu, do którego wskazuje 'a2' zostanie wywołana. Ten rodzaj wiązania nazywa się wiązaniem dynamicznym.

Dynamiczne Wiązanie powyższych przykład można zademonstrować jak poniżej.

Tutaj wpisz opis obrazka

Reference static-binding-and-dynamic-binding-in-java

 5
Author: Elsayed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-22 21:11:50

Polimorfizm statyczny: jest tam, gdzie w czasie kompilacji określa się decyzję o rozstrzygnięciu, którą metodę wykonać. Przykładem może być przeciążenie metodą.

Dynamiczny polimorfizm: to miejsce, w którym w czasie wykonywania ustawiana jest decyzja o wyborze metody do wykonania. Przykładem może być nadpisywanie metod.

 3
Author: Kulasangar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-16 18:04:38

Metoda Overloading jest znana jako polimorfizm statycznyi znana również jako polimorfizm czasu kompilacjilub Wiązanie statyczne, ponieważ przeciążone wywołania metody są rozwiązywane w czasie kompilacji przez kompilator na podstawie listy argumentów i referencji, na podstawie której wywołujemy metodę.

I metoda nadrzędna jest znana jako dynamiczny polimorfizm lub prosty polimorfizm lub metoda Runtimelub dynamiczny Binding ponieważ overridden wywołanie metody zostanie rozwiązane w czasie wykonywania.

Aby zrozumieć dlaczego tak jest, weźmy przykład Mammal i Human klasy

class Mammal {
    public void speak() { System.out.println("ohlllalalalalalaoaoaoa"); }
}

class Human extends Mammal {

    @Override
    public void speak() { System.out.println("Hello"); }

    public void speak(String language) {
        if (language.equals("Hindi")) System.out.println("Namaste");
        else System.out.println("Hello");
    }

}

Dodałem zarówno wyjście jak i Bajt kodu w poniższych liniach kodu

Mammal anyMammal = new Mammal();
anyMammal.speak();  // Output - ohlllalalalalalaoaoaoa
// 10: invokevirtual #4 // Method org/programming/mitra/exercises/OverridingInternalExample$Mammal.speak:()V

Mammal humanMammal = new Human();
humanMammal.speak(); // Output - Hello
// 23: invokevirtual #4 // Method org/programming/mitra/exercises/OverridingInternalExample$Mammal.speak:()V

Human human = new Human();
human.speak(); // Output - Hello
// 36: invokevirtual #7 // Method org/programming/mitra/exercises/OverridingInternalExample$Human.speak:()V

human.speak("Hindi"); // Output - Namaste
// 42: invokevirtual #9 // Method org/programming/mitra/exercises/OverridingInternalExample$Human.speak:(Ljava/lang/String;)V

I patrząc na powyższy kod możemy zobaczyć, że bajtodes of humanMammal.mów (), człowiek.speak() I human.speak ("Hindi") są zupełnie inne, ponieważ kompilator jest w stanie odróżnić je na podstawie argumentu lista i odniesienie do klasy. I dlatego metoda przeciążenia jest znana jako polimorfizm statyczny .

Ale bajt dla anyMammal.speak() i humanMammal.speak () jest taki sam, ponieważ według kompilatora obie metody są wywoływane na referencji, ale wyjście dla obu wywołań metod jest inne, ponieważ w czasie wykonywania JVM wie, jaki obiekt posiada Referencja i JVM wywołuje metodę na obiekcie i dlatego metoda jest znana jako dynamiczna Polimorfizm.

Z powyższego kodu i bajtowego kodu wynika, że w fazie kompilacji wywołanie metody jest brane pod uwagę od typu referencyjnego. Jednak w czasie wykonania metoda zostanie wywołana z obiektu, w którym znajduje się Referencja.

Jeśli chcesz dowiedzieć się więcej na ten temat, możesz przeczytać więcej na Jak JVM radzi sobie z Przeciążaniem i nadpisywaniem metod wewnętrznie.

 1
Author: Naresh Joshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-14 17:53:40

Polimorfizm w czasie kompilacji (Wiązanie statyczne / wczesne Wiązanie): w polimorfizmie statycznym, jeśli wywołamy metodę w naszym kodzie, to która definicja tej metody ma być wywołana, zostanie rozwiązana tylko w czasie kompilacji.

(lub)

Podczas kompilacji Java wie, którą metodę wywołać, sprawdzając podpisy metod. Nazywa się to polimorfizmem w czasie kompilacji lub wiązaniem statycznym.

Polimorfizm dynamiczny (polimorfizm późnego wiązania/ Runtime): w czasie wykonywania, Java czeka do czasu uruchomienia, aby określić, na który obiekt jest rzeczywiście wskazywany przez odniesienie. Rozdzielczość metody została podjęta w czasie wykonywania, ze względu na to, że nazywamy polimorfizmem czasu wykonywania.

 1
Author: Pavan Reddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-30 09:18:47

Przeciążenie metody jest polimorfizmem czasu kompilacji, weźmy przykład, aby zrozumieć to pojęcie.

class Person                                            //person.java file
{
    public static void main ( String[] args )
    {
      Eat e = new Eat();
       e.eat(noodle);                                //line 6
    }

   void eat (Noodles n)      //Noodles is a object    line 8                     
   {

   }
   void eat ( Pizza p)           //Pizza is a object
  {

  }

}
W tym przykładzie osoba ma metodę jedzenia, która oznacza, że może jeść pizzę lub makaron. Że metoda jedzenia jest przeciążona podczas kompilacji tej osoby.java kompilator rozwiązuje wywołanie metody " e. eat (noodles) [która znajduje się w linii 6] z definicją metody podaną w linii 8 to jest to metoda, która przyjmuje noodles jako parametr i cały proces odbywa się przez Kompilator więc jest to polimorfizm czasu kompilacji. Proces zamiany wywołania metody na definicję metody jest wywoływany jako Wiązanie, w tym przypadku jest to wykonywane przez kompilator, więc jest wywoływane jako wczesne Wiązanie.
 0
Author: Manoj Gururaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-20 13:36:07

Polimorfizm odnosi się do zdolności obiektu do zachowania się inaczej dla tego samego wyzwalacza.

Polimorfizm statyczny (polimorfizm w czasie kompilacji)

  • polimorfizm statyczny decyduje, którą metodę wykonać podczas kompilacji czas.
  • Przeciążenie metodą jest przykładem polimorfizmu statycznego i jest wymagane do statycznego polimorfizmu.
  • polimorfizm statyczny uzyskany przez wiązanie statyczne.
  • polimorfizm statyczny zachodzi w tym samym klasy.
  • przypisanie obiektu nie jest wymagane dla polimorfizmu statycznego.
  • dziedziczenie niezwiązane z polimorfizmem statycznym.

Polimorfizm Dynamiczny (Polimorfizm Czasowy)

  • Dynamiczny polimorfizm decyduje o tym, którą metodę należy wykonać w trybie runtime.
  • metoda jest przykładem polimorfizmu dynamicznego i jest wymagany do dynamicznego polimorfizmu.
  • Dynamiczny polimorfizm uzyskany poprzez dynamiczne Wiązanie.
  • Dynamiczny Polimorfizm zachodzi między różnymi klasami.
  • jest wymagane, gdy obiekt podklasy jest przypisany do klasy super obiekt do dynamicznego polimorfizmu.
  • dziedziczenie związane z dynamicznym polimorfizmem.
 0
Author: Saveendra Ekanayake,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-06 11:24:17