我有这段代码:
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”。这是为什么?
答案 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%的方法。