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。