对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); } }