繁体   English   中英

实现接口方法,方法调用和类型转换

[英]Implements method of interface, method call and type cast

考虑以下代码

interface MyInterface{
    void method(String s);// if we write static modifier we have compile error
}
class MyClass implements MyInterface{
    public static void main(String[] args){
        myMethod(new Object());//Compile error
    }
    static void method(String s){...}// compile error
    static void myMethod(Number n){...}

}
  1. 为什么我们不能在接口中定义静态方法?
  2. 为什么我们不能用静态修饰符实现method()
  3. 当我们参考对象调用myMethod时,发生编译错误。 据我了解,编译器不会自动强制转换,不是吗?
  4. 考虑以下代码

    Object someObj; ... Number n= (Number) someObj;

在这种情况下,当我们转换为Number时,编译器在做什么?

为什么我们不能在接口中定义静态方法?

接口的所有方法默认情况下都是public abstract 使用static修饰符没有意义。 因为静态方法的调用不是多态的。 从某种意义上说,您不能覆盖它们。 您只能在类名称上调用静态方法。 好了,您也可以在某些引用上调用它们,但是最终将根据声明的引用类型来解决。 现在,由于默认情况下该方法是抽象的,因此调用它没有任何意义。 它没有任何机构可以执行任何任务。

为什么我们不能用静态修饰符实现method()?

当您尝试将static修饰符添加到重写的方法时,不认为它是重写的。 因此,您的类实际上具有两种不同的方法,它们具有相同的名称,相同的参数和相同的返回类型。 当然,这是不允许在班级内部进行的。

请注意,您必须在类的重写方法中显式添加public修饰符,否则您的代码将无法编译。 原因是,您不能降低子类中重写方法的可见性。

当我们参考对象调用myMethod时,发生编译错误。 据我了解,编译器不会自动强制转换,不是吗?

Jave不会自动缩小转换范围。 您需要显式添加演员表。 但是,即使允许,您仍希望代码表现如何,因为您尝试使用子类引用来引用超类对象? 您当然可以通过在调用方法时添加强制类型转换来使代码进行编译:

myMethod((Number)new Object());  // This will compile, but fail at runtime

上面的调用将在运行时导致ClassCastException

但是,如果您有一个Object引用引用Number的任何子类的对象,则可以添加一个显式的强制类型转换,该类型将是安全的:

Object obj = new Integer(5);
Number num = (Number)obj;  // This is fine. Because `obj` is referring to an `Integer`.

最后,您的main方法的签名不正确。 您缺少public修饰符。

为什么我们不能在接口中定义静态方法?

基本上,接口旨在与多态一起使用。 多态性当在接口上调用静态方法时,如何知道要调用哪个实现?

// Should that invoke MyClass.method or MyOtherImplementation.method?
MyInterface.method("foo");

下一个:

为什么我们不能用静态修饰符实现method()?

这个想法是在实现接口的某些对象上调用该方法-这使其成为实例方法。

当我们参考对象调用myMethod时,发生编译错误。 据我了解,编译器不会自动强制转换,不是吗?

不,编译器不会自动强制转换。 没有从ObjectNumber隐式转换,因此您不能使用Number类型的参数和Object类型的参数来调用方法。

在这种情况下,当我们转换为Number时,编译器在做什么?

验证someObj值为null或对Number实例或子类的引用。

直到JDK7:

  1. 因为静态方法绑定到该类。 您通常按如下方式调用它们:

     MyClass.method(""); 

    您无法覆盖它们。

  2. 参见1,所有接口方法都是public abstract您不能更改!

  3. 否编译器不会自动强制转换

  4. 他试图抛投失败

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM