una para pagina otra imagenes imagen hipervinculos hipervinculo hacer emplea ejemplos como atributos atributo agregar java oop polymorphism dynamic-binding static-binding

java - para - hipervinculos en html ejemplos



Enlace estático y enlace dinámico (6)

Caso 1:

Animal a =new Animal(); a.eat();

Caso 2

Animal a=new Dog(); a.eat();

Aquí ambos son vinculantes dinámicos porque durante el tiempo de compilación se determina el tipo de objeto, pero en el tiempo de ejecución basado en la instancia, el objeto al que se le asigna el método de coma correspondiente se vinculará dinámicamente por la JVM.

En el primer caso, se llama el método de comer de la clase animal, mientras que en el segundo, se llama a la clase de perro como el objeto Animal se le asigna una instancia de Perro. La instancia de Perro es también una instancia de animal. Es decir, puede tomarlo como " es una " relación de que un perro es un animal. Por lo tanto, aquí el tipo de objeto se determina como perro en tiempo de ejecución y JVM vincula dinámicamente el método de comer de la clase de perro.

Verifique estos enlaces también

http://www.javatpoint.com/static-binding-and-dynamic-binding

http://www.coderanch.com/t/386124/java/java/Static-Binding-Dynamic-Binding

Estoy realmente confundido sobre el enlace dinámico y el enlace estático. He leído que determinar el tipo de un objeto en tiempo de compilación se llama enlace estático y determinarlo en tiempo de ejecución se denomina enlace dinámico.

Qué sucede en el siguiente código:

¿Enlace estático o enlace dinámico?
¿Qué tipo de polimorfismo muestra esto?

class Animal { void eat() { System.out.println("Animal is eating"); } } class Dog extends Animal { void eat() { System.out.println("Dog is eating"); } } public static void main(String args[]) { Animal a=new Animal(); a.eat(); }


Esto realmente depende de la sobrecarga y anulación si hiciste algo como esto:

public class Animal{} public class Dog extends Animal{} public class AnimalActivity{ public void eat(Animal a){ System.out.println("Animal is eating"); } public void eat(Dog d){ System.out.println("Dog is eating"); } }

luego en la clase principal:

public static void main(String args[]) { Animal a=new Animal(); Animal d=new Dog(); AnimalActivity aa=new AnimalActivity(); aa.eat(a); aa.eat(d); }

el resultado en los dos casos será: el Animal is eating

pero vamos a darle un giro, vamos a tener esto:

public class Animal{ public void eat(){ System.out.println("Animal is eating"); } }

entonces:

public class Dog extends Animal{ public void eat(){ System.out.println("Dog is eating"); } }

luego en la clase principal:

public static void main(String args[]){ Animal d=new Dog(); Animal a=new Animal(); a.eat(); d.eat(); }

ahora el resultado debería ser:

Animal is eating Dog is eating

esto se debe a que la sobrecarga se une en el tiempo de compilación "enlace estático" mientras que la anulación se une en el tiempo de ejecución "enlace dinámico"


Para las funciones no estáticas, utiliza el enlace estático siempre que la función no sea virtual, es decir, se le aplica la palabra clave final y / o la función es private . final implica que la función no se puede cambiar y la palabra clave private implica que solo tiene alcance de clase. De lo contrario, se utiliza el enlace dinámico.

Para las funciones estáticas, siempre se utiliza el enlace estático. Si se pasa un tipo A , ejecutará el método de A, independientemente de dónde se refieran A


Su código actual dará salida Animal is eating

Sin embargo, en tu clase principal, si creaste un objeto de tipo Dog y lo Animal a Animal , entonces tu salida será Dog is eating debido a la vinculación dinámica.

public static void main(String args[]) { Animal a = new Dog(); // An object of Dog is assigned to Animal a.eat(); // Dynamically determines which eat() method to call }

Aunque a se declara como Animal , apunta a un objeto de tipo Dog . Entonces, en tiempo de ejecución, se determina el tipo de objeto y se llama al método eat() apropiado.

Una forma de pensarlo es method overloading está estáticamente vinculada y la method overriding está vinculada dinámicamente.


Su ejemplo es el enlace dinámico , porque en el tiempo de ejecución se determina qué tipo de a es y se invoca el método apropiado.

Ahora suponga que tiene los dos métodos siguientes también:

public static void callEat(Animal animal) { System.out.println("Animal is eating"); } public static void callEat(Dog dog) { System.out.println("Dog is eating"); }

Incluso si cambia su main a

public static void main(String args[]) { Animal a = new Dog(); callEat(a); }

esto imprimirá Animal is eating , porque la llamada a callEat usa enlace estático , y el compilador solo sabe que a es de tipo Animal .


compruebe que esta clase de empleado tiene la función abstracta de earning() y cada clase tiene una implementación deferente toString()

Employee[] employees = new Employee[4]; // initialize array with Employees employees[0] = new SalariedEmployee(); employees[1] = new HourlyEmployee(); employees[2] = new CommissionEmployee(); employees[3] = new BasePlusCommissionEmployee(); for (Employee currentEmployee : employees){ System.out.println(currentEmployee); // invokes toString System.out.printf("earned $%,.2f%n", currentEmployee.earnings()); }

Todas las llamadas al método toString y las earnings se resuelven en el execution time , según el type of the object al que se refiere currentEmployee,

Este proceso se conoce como dynamic binding o late binding

referencia: Java ™ How to Program (Early Objects), décima edición