Java 在继承中强制转换对象,为什么要使用此输出? 有T类: G类:

Java 在继承中强制转换对象,为什么要使用此输出? 有T类: G类:,java,inheritance,casting,polymorphism,output,Java,Inheritance,Casting,Polymorphism,Output,当我跑的时候 G a3 = new G("me"); System.out.println((T)a3) 它打印G:T:me 我不明白为什么。我以为它会打印T:me。我声明这一点是因为它被强制转换为对象T。因此,使用类T的toString()。但是,我错了。为什么会发生这种情况 我知道类没有好的名称,这是一个关于理解多态性和继承的问题,而不仅仅是为了编写我需要的特定代码。这里的关键点是强制转换不会以任何方式改变对象。它所做的只是允许您将其视为不同(兼容)类型。对象功能保持完全相同 守则: p

当我跑的时候

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

我不明白为什么。我以为它会打印
T:me
。我声明这一点是因为它被强制转换为对象T。因此,使用类T的
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。

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

什么是
super.toString()
do?你是在问我一个让你理解的问题,还是一个让我思考的问题?使用该代码,它将激活T类的方法toString()。因此您可以考虑一下。@噢,我说得对吗?我不明白的是,为什么它不激活方法toString()在T类上。你是什么意思?将其视为不同的兼容类型?@PichiWuana-compatible表示你可以向上或向下施法,但不能跨越。例如,您可以将任何对象强制转换为
(object)
或其实际类型,但不能转换为
Integer
HashMap
之类的对象。如果
a4
是T对象,那么
System.out.println((g)a4)会发生什么情况
?@PichiWuana-它将始终调用它拥有的实际对象的方法,而不是它假装的类型。在你的例子中,如果
a4
T
,那么
System.out.println((G)a4)
每次都会调用
T.toString()
。但是你能把它转换给T的儿子吗?
 public String toString()
 {
      return "G:" + super.toString();
 }
public T(String name)
{
    this.name = name;
    // so, this.name gets initialised to me.
}

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