猿问

动态绑定的疑惑:编译器到底是看穿了一切还是啥都没看穿

//这是一个Employee类
import java.util.Date;
import java.util.GregorianCalendar;

public class Employee {
       private String name;
       private double salary;
       private Date hireDay;

       public Employee(String n, double s, int year, int month, int day)
       {
          name = n;
          salary = s;
          GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
          // GregorianCalendar uses 0 for January
          hireDay = calendar.getTime();
       }

       public String getName()
       {
          return name;
       }

       public double getSalary()
       {
          return salary;
       }

       public Date getHireDay()
       {
          return hireDay;
       }
       
       public void raiseSalary(double byPercent)
       {
          double raise = salary * byPercent / 100;
          salary += raise;
       }
}
————————————————————————————————————————
//这是一个Manage类,继承Employee类
public class Manager extends Employee {

    private double bonus;
    
    public void setBonus(double b){
        bonus=b;
    }
    
    public Manager(String n, double s, int year, int month, int day) {
        super(n, s, year, month, day);
        bonus=0;
    }
    
    public double getSalary(){
        return super.getSalary()+bonus;
    }
}
——————————————————————————————————————————————
//测试类
public class ManageTest {
    public static void main(String[] args) {
        Employee[] staff=new Employee[3];
        Manager boss=new Manager("Carl Cracker",80000,1987,12,15);
        boss.setBonus(5000);
        staff[0]=boss;
        staff[1]=new Employee("Harry Hacker",50000,1989,10,1);
        staff[2]=new Employee("Tommy Tester",40000,1990,3,15);
        
        //首先举个例子:报错,编译器将staff[0]看做Employee对象,不允许调用Manager类对象的方法。
        staff[0].setBonus(1000);    

        /*
         * 那么当for循环i=0时,staff[i]调用的getSalary()为什么还是Manager类的方法,salary=85000;
         * 我知道“动态绑定”这个概念。但是我不懂的问题在于:
         * 前面已经举例了,编译器将staff[0]看作Employee对象,那么应该说明编译器不知道staff[0]是Manager对象,
         * 应该会调用Employee类的getSalary()方法啊。结果为什么还是调用了Manager()中的getSalary()方法?
         * 哪里理解错了吗?
         */
        for(int i=0;i<staff.length;i++){
            System.out.println("name="+staff[i].getName()+",salary="+staff[i].getSalary());
        }
    }
}
——————————————————————————
//运行结果
name=Carl Cracker,salary=85000.0(不是我想象中的80000.0)
name=Harry Hacker,salary=50000.0
name=Tommy Tester,salary=40000.0



问题在测试类的注释中。
七九九
浏览 1475回答 2
2回答

幽凝

staff[0] = new Manager(....................);staff[0].setBonus(..........);试试
随时随地看视频慕课网APP

相关分类

Java
我要回答