接口,抽象类和具有相同方法的内在子类,获取不同的类型参数,是否使用?

时间:2017-12-07 22:15:46

标签: java object inheritance override overloading

我有这些界面和类:

public interface AlternateLight {

     public String change(long time);
}

public abstract class AbstractLight {

    public String change(int time) {
        return "AbstractLight Method was used";
    }
}

public class DistinctAlternateLight extends AbstractLight implements AlternateLight {

    public String change(long time) {
        return "DistinctAlternateLight Method was used";
    }
}

现在我用以下main方法调用方法change():

public class WhatUsedTest {

    public static void main(String[] args) {
        AlternateLight al = new DistinctAlternateLight();
        System.out.println(al.change(100));
    }
}

它打印“使用了DistinctAlternateLight方法”,但为什么呢?我认为既然我没有在100后面加上“L”作为参数,它会调用抽象类的方法,因为它的方法采用整数。错过了“L”,我猜测编译器不会将100作为一个长值处理并调用该方法取长,但确实如此。为什么会这样?

3 个答案:

答案 0 :(得分:0)

将使用与您的类型参数最匹配的方法。 但是对于兼容的数字,最深的是声明了一个。

答案 1 :(得分:0)

你也可以看到“al”对象的类型是一个接口类型,所以你不能在没有强制转换的情况下从超类调用该方法,你也不能在没有强制转换的情况下从AbstractLight调用任何方法。您只能调用接口类中声明的方法。在这种情况下,编译器将支持接口类中的方法。 如果您编写类似的东西,可以强制编译器从抽象类调用方法:

System.out.println(((AbstractLight)al).change(100));

答案 2 :(得分:0)

这是由于多态性,如果您使用AlternateLight类声明您的变量,并且此类型只能更改(长时间)。

小心点。如果使用接口作为引用类型并为其分配实现类的对象,则只能调用在接口内声明的那些方法。这很明显,因为实现类可以定义自己的方法,这些方法不是接口和类之间的契约的一部分。因此,要调用这些方法,您必须使用类作为引用类型,如下所示:

DistinctAlternateLight al =new DistinctAlternateLight();