关于java:实现接口,方法调用和类型转换的方法

Implements method of interface, method call and type cast

考虑以下代码

1
2
3
4
5
6
7
8
9
10
11
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){...}

}
  • 为什么我们不能在接口中定义静态方法?
  • 为什么不能用静态修饰符实现method()
  • 当我们引用对象调用MyMethod时,出现了编译错误。据我所知,编译器不会自动强制转换,不是吗?
  • 考虑以下代码

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

  • 在本例中,当我们强制转换到Number时,编译器在做什么?


    Why we cant define static method in interface?

    默认情况下,接口的所有方法都是public abstract。使用static修饰语没有意义。因为静态方法的调用不是多态的。从某种意义上说,你不能重写它们。只能对类名调用静态方法。好吧,您也可以在某些引用上调用它们,但最终将根据声明的引用类型来解决这一问题。现在,由于该方法在默认情况下是抽象的,所以调用它是没有意义的。它没有任何身体来完成任何任务。

    Why we cant implements method() with static modifier?

    当您试图向重写方法添加static修饰符时,它不会被视为重写。所以,类本质上有两个不同的方法,具有相同的名称、相同的参数和相同的返回类型。当然,这在类中是不允许的。

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

    When we are calling myMethod with reference to Object we have compile error. As i understood, compiler doesnt cast automatically, isnt it?

    Jave不进行自动缩小转换。您需要显式添加强制转换。但即使它允许,您希望代码的行为如何,因为您正试图用子类引用引用一个超类对象?当然,可以通过在调用方法时添加强制转换来编译代码:

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

    上述调用将在运行时产生一个ClassCastException

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

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

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


    Why we cant define static method in interface?

    基本上,接口设计用于多态性。多态性在接口上调用静态方法时,您如何知道要调用哪个实现?

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

    下一步:

    Why we cant implements method() with static modifier?

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

    When we are calling myMethod with reference to Object we have compile error. As i understood, compiler doesnt cast automatically, isnt it?

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

    What compiler is doing when we cast to Number in this case?

    它验证了someObj的值是空的,或者引用了Number或子类的实例。


    直到JDK7:

  • 因为静态方法绑定到类。您通常这样调用它们:

    1
    MyClass.method("");

    您不能覆盖它们。

  • 见1,所有接口方法都是public abstract,不能更改!

  • 不编译器不会自动强制转换

  • 他试着投,但失败了。