我对java中的多态概念有点困惑,因为不同的作者编写它的方式不同。
案例-1
动态(运行时)多态--方法重载和使用实例方法重写方法--是动态多态的例子。
静态(编译时)多态-方法重载和使用静态方法重写方法;使用私有或最终方法重写方法是静态多态的示例。
案例2
方法重载是编译时/静态多态的一个例子。
方法重写是运行时/动态多态的一个示例。
那么哪个案子是对的?java支持静态或动态多态?
发布于 2015-01-06 14:01:54
编译时间和运行时多态性与解析调用的时间直接相关。
在编译时多态性中,调用在编译时被解析。方法重载是编译时多态性的一个例子。重载无论是在实例级别还是在类级别。
例子:
public class Sample {
static void doSomething(InputStream is) {
System.out.println("is");
}
static void doSomething(OutputStream os) {
System.out.println("os");
}
public static void main(String args[]) {
System.out.println(doSomething(null)); // "compilation" error . Ambiguous call. Both InputStream and OutputStream can take `null` argument.
}
}接下来,运行时多态性:在这里,在编译期间检查调用/方法签名是否存在,但实际调用在运行时被解析。例子:
class ParentOfSample {
void testingOverriding(String s) {
System.out.println("Parent..");
}
}
public class Sample extends ParentOfSample {
static void doSomething(InputStream is) {
System.out.println("is");
}
static void doSomething(OutputStream os) {
System.out.println("os");
}
void testingOverriding(String s) {
System.out.println("Sample..");
}
public static void main(String args[]) {
ParentOfSample s = new Sample();
s.testingOverriding(null);
}
}样品。注意,在重写方法时,签名是相同的。
因此,底线是:第二种情况是对的。Java支持静态和动态多态。
发布于 2015-01-06 13:47:04
重载在编译时。覆盖在运行时。所以案例2是正确的。
发布于 2015-01-06 13:53:06
案例2是正确的
方法重写-运行时多态性。
方法重载-编译时多态性
https://stackoverflow.com/questions/27799920
复制相似问题