对java中多态概念的困惑

时间:2015-01-06 13:42:51

标签: java polymorphism

我对java中的多态概念感到有点困惑,因为不同的作者用不同的方式编写它。

案例-1

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

静态(编译时)多态性---使用静态方法进行方法重载和方法重写;使用私有或最终方法重写的方法是静态多态的示例

案例2

方法重载是编译时/静态多态的一个例子

方法覆盖是运行时/动态多态的一个例子

那么哪种情况是正确的??? 和java支持静态或动态多态?

4 个答案:

答案 0 :(得分:0)

重载是在编译时。 覆盖是在运行时。 案例2是正确的。

答案 1 :(得分:0)

案例2是正确的

方法覆盖 - 运行时多态

方法重载 - 编译时多态

答案 2 :(得分:0)

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

编译时间多态性中,在编译期间解析调用。加载方法是编译时多态性的一个例子。重载是无论是否是实例级别或类级别

示例:

 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支持静态动态多态。

答案 3 :(得分:0)

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

方法重写是动态绑定或后期绑定,其中JVM仅在运行时标识方法调用(取决于指向哪个Child类对象的Base类引用)。

您可以检查方法重叠

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