为什么我可以创建一个父类型为 class 的变量
Why can I create an variable with type of parent class
当我有这些时 类:
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()
(因为 Slave 是 Master 的子类型)。
而且因为我可以...为什么我在变量设置为 Master 时得到 "I am the slave object"
。我得到了 Slave.test() 的结果,但无法访问 Slave.mehh()。
那么当变量忽略了这个原因时,为什么要给它一个类型呢?或者换句话说,当 Master jedi 实际上是 Slave jedi 时,声明 Master 有什么功能?
因为继承的工作方式。如果一个方法被 slave 复制(你复制 test
方法的方式),它的 slave 版本总是优先的。你不能访问mehh
的原因是因为它不在Master
中,所以程序找不到它。如果要使用Master和Slave的所有方法,做Slave s = new Slave();
.
这称为多态性(事实上,它是我们使用面向对象编程的主要原因之一)。它允许您从基类型变量调用不同的方法(在相同的签名下),而无需事先知道所包含对象的类型。因此,这允许您拥有更抽象的代码(不密切依赖于其部分的确切实现的代码)。
如果您希望根据它们的运行时类型(它们的实际类型)动态分派这些方法,您可以使用实例方法。如果您希望这些方法根据它们的编译时类型(您分配给它们的变量的类型)进行静态分派,您可以改用静态方法。
当我有这些时 类:
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()
(因为 Slave 是 Master 的子类型)。
而且因为我可以...为什么我在变量设置为 Master 时得到 "I am the slave object"
。我得到了 Slave.test() 的结果,但无法访问 Slave.mehh()。
那么当变量忽略了这个原因时,为什么要给它一个类型呢?或者换句话说,当 Master jedi 实际上是 Slave jedi 时,声明 Master 有什么功能?
因为继承的工作方式。如果一个方法被 slave 复制(你复制 test
方法的方式),它的 slave 版本总是优先的。你不能访问mehh
的原因是因为它不在Master
中,所以程序找不到它。如果要使用Master和Slave的所有方法,做Slave s = new Slave();
.
这称为多态性(事实上,它是我们使用面向对象编程的主要原因之一)。它允许您从基类型变量调用不同的方法(在相同的签名下),而无需事先知道所包含对象的类型。因此,这允许您拥有更抽象的代码(不密切依赖于其部分的确切实现的代码)。
如果您希望根据它们的运行时类型(它们的实际类型)动态分派这些方法,您可以使用实例方法。如果您希望这些方法根据它们的编译时类型(您分配给它们的变量的类型)进行静态分派,您可以改用静态方法。