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()
на e
совершенно иначе, поскольку e
является ссылкой Employee
.Когда компилятор видит e.mailCheck()
, компилятор видит метод mailCheck()
в классе Employee
.
Здесь, во время компиляции, компилятор использовал mailCheck()
в Employee
для проверки этого оператора.Однако во время выполнения JVM вызывает mailCheck()
в классе Salary
.