Подтвердить что ты не робот

Что такое виртуальный метод вызова в java?

Ive увидел следующий абзац в каком-то тесте на компьютерную науку, и я надеюсь, что могу получить здесь хорошее объяснение того, что это значит, потому что я разобрал его в течение часа и ничего не нашел.

"Когда мы говорим, что язык Java имеет виртуальный метод, вызывающий, мы подразумеваем, что в Java-приложениях выполненный метод определяется типом объекта во время выполнения"

Что это значит? может ли кто-нибудь объяснить это лучше?

4b9b3361

Ответ 1

Автор этих строк использовал терминологию С++ virtual.

Лучшей терминологией является динамическая привязка/динамическая отправка.

Это означает, что динамический объект type - это "выбор", который будет вызываться, а не статический.

Например: [псевдо-код]:

class A {
  public void foo() { }
}
class B extends A { 
  public void foo() { }
}

при вызове:

A obj = new B();
obj.foo();

B.foo(), и NOT A.foo(), так как динамический тип obj равен B.

Ответ 2

мы понимаем, что в Java-приложениях выполненный метод определяется типом объекта во время выполнения

interface Animal{
  public void eat();
}


class Person implements Animal{
   public void eat(){ System.out.println("Eating Food");}
}



class Eagle implements Animal{
   public void eat(){ System.out.println("Eating Snake");}
}

в главном

Animal animal = new Person();
animal.eat(); //it will print eating food
animal = new Eagle();
animal.eat(); //it will print eating snake

Ответ 3

Предположим, у вас есть класс Fruit, с двумя подклассами Orange и Banana. И предположим, что у Fruit есть метод String getColor().

Orange может переопределить метод getColor(), чтобы вернуть "оранжевый". То же самое для банана, которое может вернуть его "желтым".

Когда какой-то метод использует объект типа Fruit и вызывает метод getColor(), метод, который будет вызываться, будет Banana.getColor(), если тип Fruit на самом деле является бананом.

 private void printColor(Fruit f) {
     System.out.println(f.getColor());
 }

 ...

 Fruit fruit1 = new Banana();
 Fruit fruit2 = new Orange();
 printColor(fruit1); // prints yellow
 printColor(fruit2); // prints orange     

Ответ 4

Employee.java

public class Employee
{
   private String name;
   private String address;
   private int number;
   public Employee(String name, String address, int number)
   {
      System.out.println("Constructing an Employee");
      this.name = name;
      this.address = address;
      this.number = number;
   }
   public void mailCheck()
   {
      System.out.println("Mailing a check to " + this.name
       + " " + this.address);
   }
}

VirtualMethod.java

class Salary extends Employee
{
   private double salary; //Annual salary
   public Salary(String name, String address, int number, double
      salary)
   {
       super(name, address, number);
       this.salary=salary;
   }
   public void mailCheck()
   {
       System.out.println("Within mailCheck of Salary class ");
       System.out.println("Mailing check to " 
       + " with salary " + salary);
   }

}

public class VirtualMethod
{
   public static void main(String [] args)
   {
      Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
      Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
      System.out.println("Call mailCheck using Salary reference --");
      s.mailCheck();
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
    }
}

Выход

Constructing an Employee
Constructing an Employee
Call mailCheck using Salary reference --
Within mailCheck of Salary class
Mailing check to  with salary 3600.0

Call mailCheck using Employee reference--
Within mailCheck of Salary class
Mailing check to  with salary 2400.0

Объяснение

здесь мы создаем два объекта Salary. Один использует ссылку Salary s, а другой - ссылку Employee e.

При вызове s.mailCheck() компилятор видит mailCheck() в классе Salary во время компиляции, а JVM вызывает mailCheck() в классе Salary во время выполнения.

Вызов mailCheck() on e совсем другой, поскольку e является ссылкой Employee. Когда компилятор видит e.mailCheck(), компилятор видит метод mailCheck() в классе Employee.

Здесь во время компиляции в Employee для проверки этого утверждения компилятор использовал mailCheck(). Однако во время выполнения JVM вызывает mailCheck() в классе Salary.