java 中对多态性概念的混淆

Confusion over polymorphism concept in java

我对 java 中的多态性概念有点困惑,因为不同的作者写法不同。

案例-1

动态(运行时)多态性---方法重载和使用实例方法覆盖方法是动态多态性的例子。

静态(编译时)多态性---使用静态方法的方法重载和方法覆盖;使用私有或最终方法覆盖的方法是静态多态性的例子

案例二

方法重载是编译time/static多态

的一个例子

方法覆盖是运行 time/dynamic 多态性

的一个例子

所以哪种情况是正确的??? 并且 java 支持静态或动态多态性?

编译时重载。 覆盖是在运行时。 所以情况2是正确的。

情况2正确

方法覆盖 - 运行 时间多态性

方法重载 - 编译时多态性

编译时运行时 多态性与调用解析 的时间直接相关。

编译时多态性中,调用在编译时解析。方法重载是编译时多态性的一个例子。重载 无关 是在实例级别还是 class 级别

示例:

 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 同时支持 staticdynamic 多态性。

基本上方法重载是静态绑定,你也可以说是早期绑定。因为编译器在编译时只能识别你实际想要调用的方法。

Method Overriding 是动态绑定或后期绑定,其中 JVM 将仅在 运行 时间识别方法调用(取决于 Base class 引用指向哪个Child class object).

你可以检查这个方法过载:

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