[英]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){...}
}
method()
? 考虑以下代码
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时,发生编译错误。 据我了解,编译器不会自动强制转换,不是吗?
不,编译器不会自动强制转换。 没有从Object
到Number
隐式转换,因此您不能使用Number
类型的参数和Object
类型的参数来调用方法。
在这种情况下,当我们转换为Number时,编译器在做什么?
验证someObj
值为null或对Number
实例或子类的引用。
直到JDK7:
因为静态方法绑定到该类。 您通常按如下方式调用它们:
MyClass.method("");
您无法覆盖它们。
参见1,所有接口方法都是public abstract
您不能更改!
否编译器不会自动强制转换
他试图抛投失败
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.