Java Dynamic Binding

0

Ho difficoltà a capire il principio Polymorphic OOP di Dynamic Binding (Late Binding) in Java. Ho cercato una domanda relativa a java e non ero sicuro che se una risposta generale a come funziona il binding dinamico riguarderebbe Java Dynamic Binding, ho scritto questa domanda.

Data:

class Person
{
     private String name;

     Person(intitialName)
     {
          name = initialName;
     }

     // irrelevant methods is here.

     // Overides Objects method
     public void writeOutput()
     {
          println(name);
     }
}

class Student extends Person
{

     private int studentNumber;

     Student(String intitialName, int initialStudentNumber)
     {
     super(intitialName);
     studentNumber = initialStudentNumber;
     }

     // irrellevant methods here...

     // overides Person, Student and Objects method
     public void writeOutput()
     {
      super.writeOutput();
      println(studentNumber);
     }   
  }

class Undergaraduate extends Student
{

     private int level;

     Undergraduate(String intitialName, int initialStudentNumber,int initialLevel)
     {
     super(intitialName,initialStudentNumber);
     level = initialLevel;
     }

     // irrelevant methods is here.

     // overides Person, Student and Objects method
     public void writeOutput()
     {
      super.writeOutput();
      println(level);
     }

  }

Mi sto chiedendo. se avessi un array chiamato persona dichiarata per contenere oggetti di tipo Person:

  Person[] people = new Person[2];
  person[0] = new Undergraduate("Cotty, Manny",4910,1);
  person[1] = new Student("DeBanque, Robin", 8812);

Dato che quella persona [] è dichiarata per essere di tipo Persona, ti aspetteresti, ad esempio, nella terza riga dove persona [0] è inizializzata a nuovo oggetto Undergraduate, per ottenere solo la variabile di istanza dai Metodi di Persona e Persone poiché non l'assegnazione a un nuovo Undergraduate al suo antenato denota l'oggetto Undergraduate per accedere a Persona - è Ancestors, metodi e variabili di isntance ...

Quindi ... con il seguente codice mi aspetterei

  person[0].writeOutput();  // calls Undergraduate::writeOutput()
  person[1].writeOutput();  // calls Student::writeOutput() 

persona [0] per non avere il metodo sovrascritto writeOutput () di Undergraduate, né fare in modo che la persona [1] abbia il metodo sovrascritto di Student - writeOutput ().

Se avessi

Person mikeJones = new Student("Who?,MikeJones",44,4);
mikeJones.writeOutput();

Il metodo Person :: writeOutput () verrebbe chiamato.

Perché non è così? Ha a che fare con qualcosa che non capisco riguardo ai matrici? La dichiarazione Person [] people = new Person [2] non vincola il metodo come il codice precedente sarebbe?

    
posta Chris Okyen 16.11.2012 - 01:35
fonte

1 risposta

1

Non ha nulla a che fare con gli array, è l'effetto del "binding tardivo". Il compilatore Java controlla solo che Persona abbia il metodo writeOutput , ma non associa la chiamata a quel metodo di classe. L'associazione viene eseguita in fase di esecuzione, in cui la JVM rileva che Persona [0] è un UnderGraduate e chiama la definizione del metodo da UnderGraduate , e non quella da Person .

Capisco che C ++ funzioni nell'altro modo, a meno che tu non specifichi virtual , ma è meglio così (se pensi che una classe incapsuli dati e metodi, assicuri che i metodi usati siano quelli che contano davvero dati incapsulati).

    
risposta data 16.11.2012 - 01:57
fonte

Leggi altre domande sui tag