多态误解

时间:2017-01-14 02:42:49

标签: java exception polymorphism

当我调用s1.dub(7)或s2.dub(7)时,它不起作用 ,但用s2.dub(" 9")之类的字符串调用它可以工作并打印双字符串

有谁可以告诉我为什么?

这是代码

interface Inter {
  int number();
}
abstract class Abs {
static int foo = 12;
    int number() { return 5; }
    abstract int ace();
}
final class Sub extends Super {
    Sub(int bar) { foo = bar; }
    public int number() { return 10; }
    int ace() { return 13; }
    int dub(int i) { return 2 * i; }
}
public class Super extends Abs implements Inter {
    public int number() { return 11; }
    public static void main(String args[]) {
        Super s1 = new Super();
        Super s2 = new Sub(16);
        //System.out.println(s1.dub(7));     //doesn't work
        //System.out.println(s2.dub(7));     //doesn't work
        //System.out.println(s1.dub("7"));   //works giving 77
        //System.out.println(s2.dub("7"));   //works giving 77
    }
    int twice(int x) { return 2 * x; }
    public int thrice(int x) { return 3 * x; }
    int ace() { return 1; }
    String dub(String s) { return s + s; }
 }

1 个答案:

答案 0 :(得分:0)

非常简单..你上课超级定义了一种方法:

String dub(String s) { return s + s; }

在主方法中实例化Super:

Super s1 = new Super(); // this has a dub( String ) method

然后你尝试调用这个方法(dub)传递一个整数而不是字符串:

System.out.println(s1.dub(7)); // s1.dub(...) takes a String, not a number

编辑:此代码不应编译或运行,因为您要将两个实例分配给超类Super(未定义dub(int)方法)。

不确定您是如何获得例外的?

谢谢@ Jean-FrançoisSavard - 我完全错过了!

EDIT2:原始问题已被修改,不再表示抛出异常,这是有道理的,因为代码根本不应该编译。

EDIT3 :(最后一个,由于原始问题的变化)

System.out.println(s1.dub(7)); //- this will never work unless you change your class' definition

System.out.println(s2.dub(7)); //- will work if you also change the following line:

从:

Super s2 = new Sub(16);

为:

Sub s2 = new Sub(16);