有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中多态性概念的混淆

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

案例-1

动态(运行时)多态性——使用实例方法的方法重载和方法重写就是动态多态性的例子

静态(编译时)多态性——使用静态方法的方法重载和方法重写;使用私有或final方法重写方法是静态多态性的示例

案例2

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

方法重写是运行时/动态多态性的一个示例

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


共 (4) 个答案

  1. # 1 楼答案

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

    编译时多态性中,调用在编译时解析。方法重载是编译时多态性的一个例子。重载是而不管它是在实例级还是在类级

    例如:

     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 楼答案

    案例2是正确的

    方法重写-运行时多态性

    方法重载-编译时多态性

  3. # 3 楼答案

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

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

    您可以检查此方法是否存在方法重载:

    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);
    }
    }
    
  4. # 4 楼答案

    重载是在编译时进行的。 重写是在运行时进行的。 因此,案例2是正确的