为什么这不打印“超级”?

时间:2013-10-04 02:19:33

标签: java polymorphism

我有这段代码:

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

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

5 个答案:

答案 0 :(得分:4)

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

由于Subclass覆盖Superclass的toString,调用任何Subclass实例将始终解析为Subclass的toString。

Object obj = new Subclass();
obj.toString();  // will still return "sub"

答案 1 :(得分:1)

这是因为你没有调用super.print()。默认情况下,子类的方法会覆盖超类的一个,无论你做什么演员

public class Subclass extends Superclass { 

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

相关问题