为什么我可以使用父类的类型创建变量

时间:2015-01-23 22:57:35

标签: java oop inheritance polymorphism extends

当我有这些课程时:

public class Master{

    public String test(){
        return "I am the master object";
    }

    public String boeh(){
        return "Only inside master";
    }

}

public class Slave extends Master{

    public String test(){
        return "I am the slave object";
    }

    public String mehh(){
        return "Only insde slave";
    }

}

我知道我可以这样做:Master jedi = new Slave()(因为奴隶是一种儿童类型的主人)。

因为我可以......当变量设置为Master时,为什么我得到"I am the slave object"。我得到Slave.test()的结果但无法访问Slave.mehh()。

那么为什么在忽略这个变量时给出变量类型的原因是什么?或者换句话说,当Master jedi实际上是Slave jedi时,它有什么功能来宣告Master?

2 个答案:

答案 0 :(得分:2)

由于继承的方式有效。如果从属方式复制方法(复制test方法的方式),则它的从属版本始终优先。您无法访问mehh的原因是因为它不在Master中,因此程序无法找到它。如果您想使用Master和Slave的所有方法,请执行Slave s = new Slave();

答案 1 :(得分:1)

这称为多态(事实上,它是我们使用面向对象编程的主要原因之一)。它允许您从基本类型变量调用不同的方法(在相同的签名下),而不事先知道所包含对象的类型。因此,这允许您拥有更多抽象代码(代码不会严格依赖于其部件的确切实现)。

如果希望根据运行时类型(实际类型)动态调度方法,则使用实例方法。如果希望根据编译时类型(已分配给它们的变量的类型)静态调度方法,则可以使用静态方法。