对java中多态概念的困惑
我对java中的多态概念感到有点困惑,因为不同的作者以不同的方式编写它。
情况1
动态(运行时)多态 – 使用实例方法的方法重载和方法重写是动态多态的示例。
静态(编译时)多态性—使用静态方法进行方法重载和方法重写; 使用私有或最终方法重写的方法是静态多态的示例
案例2
方法重载是编译时/静态多态的一个例子
方法覆盖是运行时/动态多态的一个例子
那么哪种情况是正确的??? 和java支持静态或动态多态?
编译时间和运行时多态性与解析调用的时间直接相关。
在编译时间多态性中,在编译期间解析调用。 加载方法是编译时多态性的一个例子。 重载无论是在实例级别还是在类级别
示例:
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); } }
O / P:样品。 请注意,在重写期间,方法签名是相同的。
所以,底线是:第二种情况是正确的。 Java支持静态和动态多态。
重载是在编译时。 覆盖是在运行时。 案例2是正确的。
案例2是正确的
方法覆盖 – 运行时多态
方法重载 – 编译时多态
基本上方法重载是静态绑定,你也可以说是早期绑定。 因为编译器只能在编译时识别您实际想要调用的方法。
方法重写是动态绑定或后期绑定,其中JVM将仅在运行时标识方法调用(取决于指向哪个Child类对象的Base类引用)。
你可以检查方法OverLoading :
class OverLoadedClass{ int x; int y; public void display(int x) { System.out.println(x); } public void display(int x,int y) { System.out.println(x+""+y); } } public class Test{ public static void main(String args[]){ OverLoadedClass o= new OverLoadedClass(); o.display(5); o.display(5,10); } }
你可以检查方法覆盖 :
class Base{ int x; public void display(int x) { System.out.println(x); } } class Child extends Base{ int x; public void display(int x) { System.out.println(x); } } public class Test{ public static void main(String args[]){ Base o= new Child(); o.display(5); } }