繁体   English   中英

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

[英]Casting an object in inheritance, why this output?

有T级:

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

G类:

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:me 我声称这是因为它被转换为对象T.因此,使用类T的toString()但是,我错了。 为什么会这样?

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

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

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

编码:

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

完全删除旧的toString ,使其完全不再可访问(大多数情况下)。

G a3 =新G(“我”);

这一行既调用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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM