Java多态性中的混淆

Java多态性中的混淆,java,Java,我对java多态性感到困惑。在动态方法绑定中,jvm在运行时决定必须调用哪个类方法。假设我有三个班A,B和C class A{ int get(){ return 10; } int getParent(){ return 10; } } class B extends A { int get(){ return 20; } } public class C { public stati

我对java多态性感到困惑。在动态方法绑定中,jvm在运行时决定必须调用哪个类方法。假设我有三个班A,B和C

class A{
    int get(){
        return 10;
    }

    int getParent(){
        return 10;
    }
}

class B extends A
{
    int get(){
        return 20;
    }
}

public class C
{
    public static void main(String args[])
    {
        A a = new A();
        A a1 = new B();
        System.out.println(a.get());/////////////////////////LINE1    
        System.out.println(a1.get  ());////////////////////////LINE2    
        System.out.println(a.getParent());////////////////////////LINE3
    }
}
在编译时和运行时绑定时,我对第1行和第3行感到困惑。 在第3行中,它是一个.getParent(),这个方法只在父类中,所以它必须在运行时决定什么

在第1行中,引用和对象都来自同一个类,所以它必须决定什么


请给我发送任何关于运行时和编译时绑定如何工作的好链接。

类B重写了get()方法。因此,无论何时对类型为B的对象调用get(),它都将使用重写的方法


因为B不重写getparent(),所以当您在类B上调用父getparent()时,将调用它。类B重写get()方法。因此,无论何时对类型为B的对象调用get(),它都将使用重写的方法


因为B不重写getparent(),所以在类B上调用父getparent()时将调用它。类A为对象实例
A
提供了一个包含A.get和A.getparent的虚拟方法表

类B为对象实例
a1
提供了一个虚拟方法表,首先从类a中获取并展开(这里没有可展开的内容)。
get
方法被B.get覆盖


a1.get即使是a,也将调用B.get。

类a为对象实例
a
提供一个虚拟方法表,其中包含a.get和a.getParent

    class A
    {
      public doIt( )
      {
        //this does something
      }
    }

    class B extends A
    {
      public doIt( )
      {
        //this does something
      }
    }

    class C extends B
    {
      public doIt( )
      {
        //this does something
      }

    }        

    public static void main(String[] args) {
          A x = new B( );

          x.doIt( );

    }
类B为对象实例
a1
提供了一个虚拟方法表,首先从类a中获取并展开(这里没有可展开的内容)。
get
方法被B.get覆盖

get,即使是a,也会叫B.get

    class A
    {
      public doIt( )
      {
        //this does something
      }
    }

    class B extends A
    {
      public doIt( )
      {
        //this does something
      }
    }

    class C extends B
    {
      public doIt( )
      {
        //this does something
      }

    }        

    public static void main(String[] args) {
          A x = new B( );

          x.doIt( );

    }
引起很多混乱的语句是“ax=newb();”语句。尽管变量x是类型A的对象,但它被实例化为类B的对象——因为语句中的“=new B();”部分。Java运行时基本上会看到这条语句,并说“尽管x明确声明为类型A,但它被实例化为类B的对象,因此我将运行在类B中定义的doIt()方法的版本。”

对象x执行的doIt()方法的版本是类B中的版本,因为Java中称之为动态绑定——上面的代码可以被视为动态绑定的示例。动态绑定基本上意味着实际调用的方法实现是在运行时确定的,而不是在编译时确定的。这就是为什么它被称为动态绑定——因为将要运行的方法是在运行时选择的。动态绑定也称为后期绑定。

早期绑定中在complie时间绑定数据和方法,其中 后期绑定数据和方法将在运行时绑定

引起很多混乱的语句是“ax=newb();”语句。尽管变量x是类型A的对象,但它被实例化为类B的对象——因为语句中的“=new B();”部分。Java运行时基本上会看到这条语句,并说“尽管x明确声明为类型A,但它被实例化为类B的对象,因此我将运行在类B中定义的doIt()方法的版本。”

对象x执行的doIt()方法的版本是类B中的版本,因为Java中称之为动态绑定——上面的代码可以被视为动态绑定的示例。动态绑定基本上意味着实际调用的方法实现是在运行时确定的,而不是在编译时确定的。这就是为什么它被称为动态绑定——因为将要运行的方法是在运行时选择的。动态绑定也称为后期绑定。

早期绑定中在complie时间绑定数据和方法,其中
延迟绑定数据和方法将在运行时绑定。

此处的多态性仅适用于line2。没有多态性的概念应用于第1行和第3行。

此处的多态性仅适用于第2行。第1行和第3行没有多态性的概念