【问题标题】:Why can I create an variable with type of parent class为什么我可以创建具有父类类型的变量
【发布时间】:2015-03-23 02:16:14
【问题描述】:

当我有这些课程时:

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()。

那么当变量忽略这个时为什么要给它一个类型呢?或者换句话说,当绝地大师实际上是奴隶绝地时,它有什么功能来声明大师?

【问题讨论】:

  • 这是dynamic method binding的一个例子,不能访问Slave.mehh()- 因为,你只能访问在子类中被覆盖的方法。
  • 你问的是C#还是Java?
  • 这就是(Java)多态的本质。如果它不这样做,那么多态的意义何在?
  • @Vsevolod Goloviznin 在一般 oop 的情况下以及与 java 或 c# 一起使用
  • @sirwilliam Java 和 C# 可以不同地处理子类化。

标签: java oop inheritance polymorphism extends


【解决方案1】:

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

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

【讨论】:

  • 所以目的就像拥有一个人对象,所以它是抽象的,但我们可以拥有一个实际上是员工或客户的人
  • @sirwilliam 是的。您只需调用在基类中声明的方法,如果派生类提供该方法的更专业的实现,则调用该实现,而无需您更改调用它的代码。这对于局部变量并不明显,但在您从其他代码(例如作为参数)接收对象并且您不知道确切类型的情况下,您会看到它的用途。
【解决方案2】:

因为继承的工作方式。如果一个方法被从属复制(就像你复制test 方法一样),它的从属版本总是优先。无法访问mehh的原因是因为它不在Master中,所以程序找不到它。如果你想使用Master和Slave的所有方法,请Slave s = new Slave();

【讨论】:

    猜你喜欢
    • 2020-06-27
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 2018-11-26
    相关资源
    最近更新 更多