在继承中转换对象,为什么要输出?

时间:2016-04-06 15:46:59

标签: java inheritance casting polymorphism output

有T类:

 =ARRAYFORMULA(IF(ISURL(A2:A),IMAGE(A2:A),))

G类:

public class T
{
    protected String name;
    public T(String name)
    {
        this.name = name;
    }
    public String toString()
    {
        return "T:"+this.name;
    }
}

当我跑步时

public class G extends T
{
     public G(String name)
     {
          super(name);
     }
     public String toString()
     {
          return "G:" + super.toString();
     }
}

打印G a3 = new G("me"); System.out.println((T)a3)

我不明白为什么。我以为会打印G:T:me。我声称这是因为它被作为对象T来表达。因此,使用类T的T:me。但是,我错了。为什么会这样?

我知道类没有好名字,这是一个关于理解多态和继承的问题,而不仅仅是编写我需要的特定代码。

3 个答案:

答案 0 :(得分:4)

类G 中的方法toString()会覆盖类T中的方法,因此会被选中。编译器使用对象的静态类型来决定要使用的方法的重载。如果在T上定义了两个不同的 toString()方法可供选择,和/或G在某种程度上定义了另一个toString()重载,它只会产生影响 - 尽管它'当方法没有参数时,这是不可能的。

答案 1 :(得分:3)

这里的关键点是演员表不会以任何方式改变对象。它所做的只是允许您将其视为不同(兼容)类型。对象功能保持完全相同

代码:

 public String toString()
 {
      return "G:" + super.toString();
 }

将旧toString完全删除到根本不再可访问的位置(主要是)。

答案 2 :(得分:3)

  

G a3 =新G(" me");

这一行既调用T的构造函数,也调用G。

public T(String name)
{
    this.name = name;
    // so, this.name gets initialised to me.
}

public G(String name)
 {
      super(name);
 }

现在,由于您已覆盖toString()方法 ,因此调用System.out.println((T)a3)并不会更改a3的类型从Object到任何其他类型。它可以打印a3作为对象(因为println()也接受Object类型的参数),但是,a3仍然在两个类中被重写。

因此,您的toString()方法将被调用,从而导致G:T:me.的打印。