实例化如何在这个java代码片段中发生

时间:2012-08-08 18:33:53

标签: java

我的代码是

class Alpha
{
public void foo()
    {
    System.out.print("Alpha ");
    }
}

class Beta extends Alpha
{
public void foo()
    {
    System.out.print("Beta ");
    }

public static void main(String[]args)
   {
    Alpha a = new Beta();
    Beta b = (Beta)a;

    a.foo();
    b.foo();
   }
}

输出: -

Beta Beta

我是java的新手,这是我第一次遇到的这种实例化,这就是为什么我无法理解为什么输出不是

Alpha Beta

如果'a'是Alpha类的对象那么为什么不调用Alpha的方法?

请帮帮我。

5 个答案:

答案 0 :(得分:1)

创建的对象是Beta类型,因为它是由new创建的。因此,当调用foo()时,无论您在代码中“调用”它,它都会处理Beta对象。

答案 1 :(得分:1)

将Object作为其超类进行转换或引用不会取消覆盖方法。即使您最初将foo()对象作为Beta对象引用,Alpha方法仍会在{{1}}对象上调用。

答案 2 :(得分:0)

当父类变量引用子类对象时,引用将调用子方法。

答案 3 :(得分:0)

您只有一个Beta类型的对象。转换对象不会使java使用父方法。

答案 4 :(得分:0)

在java中,默认情况下方法是虚拟的。在决定实际调用什么方法时,底层对象的类型很重要,而不是对象引用的类型。