在Java中,关于方法重写和变量隐藏的理解,以下代码的输出结果是什么? ``` class Employee { public int grade = 5; public void job() { System.out.println("我是一名普通的员工"); } } class Manager extends Employee { public int grade = 8; @Override public void job() { System.out.println("我是一名经理"); } } public class Example4_12 { public static void main(String[] args) { Employee em = new Manager(); System.out.println(em.grade); em.job(); } } ```
答案解析
在Java中,当子类中定义了一个与父类中同名的实例变量时,这个变量会隐藏父类中的变量,而不是覆盖它。因此,尽管em引用的是Manager对象,`em.grade`访问的是Employee类的grade变量,输出5。然而,对于方法重写,当子类重写了父类的方法,通过父类引用调用该方法时,实际执行的是子类中的方法。因此,`em.job()`调用的是Manager类中的job()方法,输出"我是一名经理"。所以,正确答案是C。选项A错误地认为job()方法没有被重写。选项B和D错误地认为grade的值是8,忽略了变量隐藏的规则。
正确答案:C