我有这些界面和类:
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作为一个长值处理并调用该方法取长,但确实如此。为什么会这样?
答案 0 :(得分:0)
将使用与您的类型参数最匹配的方法。 但是对于兼容的数字,最深的是声明了一个。
答案 1 :(得分:0)
你也可以看到“al”对象的类型是一个接口类型,所以你不能在没有强制转换的情况下从超类调用该方法,你也不能在没有强制转换的情况下从AbstractLight调用任何方法。您只能调用接口类中声明的方法。在这种情况下,编译器将支持接口类中的方法。 如果您编写类似的东西,可以强制编译器从抽象类调用方法:
System.out.println(((AbstractLight)al).change(100));
答案 2 :(得分:0)
这是由于多态性,如果您使用AlternateLight类声明您的变量,并且此类型只能更改(长时间)。
小心点。如果使用接口作为引用类型并为其分配实现类的对象,则只能调用在接口内声明的那些方法。这很明显,因为实现类可以定义自己的方法,这些方法不是接口和类之间的契约的一部分。因此,要调用这些方法,您必须使用类作为引用类型,如下所示:DistinctAlternateLight al =new DistinctAlternateLight();