Java 为什么不打印;超级;?
我有以下代码:Java 为什么不打印;超级;?,java,polymorphism,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 Sub
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”,因为它被转换为超类,但事实并非如此——它打印“sub”。这是为什么?类型的向上转换没有任何不同。调用哪个
toString()
由实例的运行时类型决定,而不是引用
由于子类
覆盖了超类
的toString,因此调用任何子类
实例都将解析为子类
的toString
Object obj = new Subclass();
obj.toString(); // will still return "sub"
这是因为您没有调用super.print()。默认情况下,子类的方法将覆盖超类的方法,无论您进行什么类型的转换
public class Subclass extends Superclass {
public void print () {
super.print();
System.out.println ("sub");
}
}
因为您正在隐式重写子类中的方法 如果您以前使用过C#,这可能会令人困惑,因为Java不需要覆盖关键字来覆盖方法。Java自动覆盖具有相同签名的方法
您可能会在方法上看到
@Override
注释,但这只是确保您实际上正在重写某些内容的一种保护措施(它可以防止键入错误等);它实际上不会影响程序本身。类型转换对象不会改变对象本身。它基本上帮助您访问字段/方法,这些字段/方法是您键入对象引用的类的契约的一部分。
假设您的子类具有以下定义:
public class Subclass extends Superclass {
public void print ( ) {
System.out.println ("sub");
}
public void subClassMethod()
{
//do something
}
}
创建Subclass类型的对象,但使用超类变量保存引用:
超类obj4=新的子类()代码>
现在,obj4只允许您访问超类的约定,因此您不能调用obj4.Subclass方法(),这将导致编译时错误
在这种情况下,您将把它类型转换为Subclass以访问Subclass方法:
((子类)obj4).子类方法()
如果要从超类重写方法,则需要在子类中包含@Override符号。
另外,如果要使用超类的print()方法,在子类的print()方法中,可以使用super.print()代码>即时消息100%有效。你需要用谷歌搜索什么是多态性/后期绑定。你不能这样向上转换,它就是这样,对象是一个子类
也请不要在无参数函数的括号内加空格。这让我很恼火:(@Dgrin:这不是Java约定吗?实际上子类
重写print()
而不是toString()
方法。无论如何+1。