1

我有这个代码:

public class Superclass {

    public void print() {
        System.out.println("super");
    }
}

public class Subclass extends Superclass {

    public void print() {
        System.out.println("sub");
    }
}

然后这个:

Subclass obj4 = new Subclass();
((Superclass) obj4).print();

我认为上面的打印语句打印“super”,因为它被转换为超类,但事实并非如此 - 它打印“sub”。为什么是这样?

4

5 回答 5

4

类型的向上转换没有任何不同。调用哪个toString()取决于实例的运行时类型,而不是引用。

由于SubclassoverrodeSuperclass的toString,调用任何Subclass实例将始终解析为SubclasstoString。

Object obj = new Subclass();
obj.toString();  // will still return "sub"
于 2013-10-04T02:22:17.270 回答
1

这是因为你没有调用 super.print()。默认情况下,子类的方法会覆盖超类的方法,无论您进行什么转换

public class Subclass extends Superclass { 

   public void print () { 
       super.print();
       System.out.println ("sub"); 
   } 
}
于 2013-10-04T02:23:08.643 回答
1

因为您隐式地覆盖了子类中的方法。

如果您以前使用过 C#,这可能会令人困惑,因为 Java 不需要 override 关键字来覆盖方法。Java 会自动覆盖具有相同签名的方法。

您可能会看到@Override方法上的注释,但这只是确保您实际上覆盖某些内容的保障措施(它可以防止拼写错误等);它实际上不会影响您的程序本身。

于 2013-10-04T02:25:14.620 回答
1

对对象进行类型转换不会改变对象本身。它基本上可以帮助您访问作为类型转换对象引用的类合同的一部分的字段/方法。假设您的子类具有以下定义:

public class Subclass extends Superclass { 

  public void print ( ) { 
    System.out.println ("sub"); 
  } 

  public void subClassMethod()
  {
    //do something
  }
}

然后创建一个 Subclass 类型的对象,但使用 Superclass 变量保存引用: Superclass obj4 = new Subclass ();

现在 obj4 只允许您访问 Superclass 的合同,因此您不能调用 obj4.subClassMethod() 这会给您一个编译时错误。

在这种情况下,您会将其类型转换为 Subclass 以访问 subClassMethod: ((Subclass)obj4).subClassMethod()

于 2013-10-04T02:43:21.083 回答
0

如果要覆盖超类中的方法,则需要在子类中包含@Override表示法。此外,如果你想使用超类的 print() 方法,在你的子类的 print() 方法中,你可以使用super.print();100% 的 im 。

于 2013-10-04T02:53:37.713 回答