以下 JAVA 代码,Test 执行时的输出结果是__?

class A
{
    public void printValue()
    {
        System.out.print("A");
    }
}

class S extends A
{
    public void printValue()
    {
        System.out.print("S");
    }
}

public class Test
{
    public static void main(String[] args)
    {
        S s = new S();
        s.printValue();
        A as = (A)s;
        as.printValue();
        as = new A();
        as.printValue();
    }
}
1433 次浏览
  • A、编译不通过
  • B、SSS
  • C、SSA
  • D、SAA
类S继承自A,子类继承父类成员方法时,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。因此,对象s调用printValue方法时,会使用子类中的方法,也就是print("S")。 as.printValue()语句考查的是隐藏和覆盖的区别。覆盖只针对非静态方法,而隐藏是针对成员变量和静态方法的。这两者者之间的区别是:覆盖受RTTI(Runtime type identification)约束,而隐藏却不受该约束,也就是说只有覆盖方法才会进行动态绑定,而隐藏是不会发生动态绑定的。在Java中,除了static方法和final方法,其他所有的方法都是动态绑定。所以as.printValue()的结果是print("S")。 最后,as=new A()语句中,自然执行的是print("A")。
ppq
挑战成功
7个月前
挑战成功
2年前
挑战失败
2年前
挑战失败
2年前
挑战成功
2年前
挑战失败
2年前
挑战失败
2年前
挑战成功
3年前
挑战失败
3年前
挑战失败
3年前