Java 静态和动态类型之间的差异

Java 静态和动态类型之间的差异,java,polymorphism,Java,Polymorphism,我正在学习Java,我不理解这些作业之间的区别: Superclass x = new Superclass(); Superclass x = new Subclass(); Subclass x = new Subclass(); 其中子类扩展了超类。我的意思是,我知道第一个赋值可以引用扩展超类的所有子类,最后一个赋值只能接受特定子类的引用。我还知道,在第二个赋值中,超类是在编译时检查的“静态类型”(不知道这样说是否正确),子类是在运行时检查的“动态类型”。但是我无法想象一个用例中选择第二

我正在学习Java,我不理解这些作业之间的区别:

Superclass x = new Superclass();
Superclass x = new Subclass();
Subclass x = new Subclass();

其中子类扩展了超类。我的意思是,我知道第一个赋值可以引用扩展超类的所有子类,最后一个赋值只能接受特定子类的引用。我还知道,在第二个赋值中,超类是在编译时检查的“静态类型”(不知道这样说是否正确),子类是在运行时检查的“动态类型”。但是我无法想象一个用例中选择第二个任务而不是另外两个任务会更好。所以,如果你能解释一下这些作业有什么不同,那就太好了!谢谢:)

您的第一行和最后一行代码正在为同一类类型分配构造函数引用,它称为静态绑定,即编译时绑定。而第二行代码通常是动态绑定或运行时绑定

//First Line
Superclass x = new Superclass();
//Third Line
Subclass x = new Subclass();
在第一行和第三行代码中引用了相同的类构造函数。这意味着在这个引用中它总是指向类的当前实例,并引用静态方法和变量

//Second Line
Superclass x = new Subclass();
在这里,这种方法在java中称为动态绑定,这是java中的一种继承属性,允许父类引用引用子类对象。这种方法主要用于有多个子类且所有子类都抽象为其父类的情况。因此,您无需费心创建多个子引用和一个子类引用可以实现运行时多态性

下面是一个明确你的概念的例子

class Superclass {
   public static void getClassName()
   {
       System.out.println("Superclass static method called");
   }
}
class Subclass extends Superclass {
   public static void getClassName(){
       System.out.println("Subclass ");
   }
   public static void main( String args[]) {
       /* Reference is of Superclass type and object is
        * Subclass type
        */
       Superclass obj = new Subclass();
       /* Reference is of Superclass type and object is
        * of Subclass type.
        */
       Superclass obj2 = new Superclass();
       obj.getClassName();
       obj2.getClassName();
   }
}

//The output will be
Superclass static method called
Superclass static method called

因为引用总是指与父静态方法相关的:如果你想要一个用例,可以在GitHub或其他地方阅读其他人的代码。你会经常看到这一点。无论如何,这就是多态性的意义所在。您可以有一个方法来描述常规类型的一些步骤,它将适用于扩展常规类型的任何特定类型实例。例如,您可以使用
voidmove(shapes,intx,inty){s.setX(s.getX()+x);s.setY(s.getY()+y);}
并像
移动(矩形,10,20)
移动(三角形,20,30)
一样调用它。因此,我们可以对代码进行泛化,同时,当我们需要更改传递给方法的实际参数而不中断时,我们可以灵活地处理。