当我有这些课程时:
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?
答案 0 :(得分:2)
由于继承的方式有效。如果从属方式复制方法(复制test
方法的方式),则它的从属版本始终优先。您无法访问mehh
的原因是因为它不在Master
中,因此程序无法找到它。如果您想使用Master和Slave的所有方法,请执行Slave s = new Slave();
。
答案 1 :(得分:1)
这称为多态(事实上,它是我们使用面向对象编程的主要原因之一)。它允许您从基本类型变量调用不同的方法(在相同的签名下),而不事先知道所包含对象的类型。因此,这允许您拥有更多抽象代码(代码不会严格依赖于其部件的确切实现)。
如果希望根据运行时类型(实际类型)动态调度方法,则使用实例方法。如果希望根据编译时类型(已分配给它们的变量的类型)静态调度方法,则可以使用静态方法。