Java 多态性和参数?
因此,我理解,由于多态性,一个人可以: 超类Apt=新的子类; 但我想知道的是:Java 多态性和参数?,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,因此,我理解,由于多态性,一个人可以: 超类Apt=新的子类; 但我想知道的是: Superclass Abc = new Subclass(); do(Abc); void doThat(Superclass Abc) Abc.Ball(); 因此,在方法dotThat内部的Abc.method调用中,它是调用超类的Ball方法,还是调用子类的Ball方法,假设子类已重写Ball方法。如果它确实调用了子类的重写Ball方法,为什么我们不能将方法doThat改为:void doThat
Superclass Abc = new Subclass();
do(Abc);
void doThat(Superclass Abc)
Abc.Ball();
因此,在方法dotThat内部的Abc.method调用中,它是调用超类的Ball方法,还是调用子类的Ball方法,假设子类已重写Ball方法。如果它确实调用了子类的重写Ball方法,为什么我们不能将方法doThat改为:void doThat Subclass Abc。谢谢你的帮助,如果没有意义,我会进一步澄清 如果Ball方法是静态的,它将调用超级类,因为Ball方法是在类级别定义的,而如果它是在对象级别定义的,那么它肯定会调用子类上的重写方法。如果Ball方法是静态的,它将调用超级类,因为Ball方法是在类级别定义的,而如果它是在对象级别定义的,然后它肯定会调用子类上的重写方法。在您描述的情况下,调用
Abc.Ball();
将在子类中调用实现。在您描述的情况下,调用
Abc.Ball();
将调用子类中的实现。它正在调用重写的方法,而重写的方法正是针对该方法的
void doThat(Subclass Abc)
如果您在这里使用子类,则只能将子类实例传递给此。相反,如果你有
void doThat(Superclass Abc)
然后,您可以传递实现了多态性所在的超类的任何对象。如果该方法接受多种类型的对象,唯一的要求是它应该实现超类
如果我进一步解释,
假设您有两个子类,子类1和子类2,它们是超类的实现,其中超类是一个接口。这些子类应该实现超类方法定义,因此这两个子类都有ball方法
然后,无论实例到达doThat方法,它都会调用相应对象的ball方法。由于void dothat超类Abc接受超类类型。它正在调用重写的方法,该方法是重写的对象
void doThat(Subclass Abc)
如果您在这里使用子类,则只能将子类实例传递给此。相反,如果你有
void doThat(Superclass Abc)
然后,您可以传递实现了多态性所在的超类的任何对象。如果该方法接受多种类型的对象,唯一的要求是它应该实现超类
如果我进一步解释,
假设您有两个子类,子类1和子类2,它们是超类的实现,其中超类是一个接口。这些子类应该实现超类方法定义,因此这两个子类都有ball方法
然后,无论实例到达doThat方法,它都会调用相应对象的ball方法。作为void dothat超类Abc接受超类类型
这是调用超类的Ball方法还是调用子类的Ball方法
Ball将调用子类中的重写方法
如果它确实调用了子类的重写Ball方法,为什么我们不能将方法doThat改为:void doThat Subclass Abc
假设您有两个子类的超类:
定义void dothatsuberclass abc意味着方法doThat将接受作为超类或其任何子类实例的任何对象。然后可以执行doThatabc和doThatxyz,这两种方法都将在适当的实例中调用Ball方法
相反,如果您有dothatsublassaabc,那么对于超类的每个子类,您也需要一个特定的方法,比如dothatsublasszxyz
这是调用超类的Ball方法还是调用子类的Ball方法
Ball将调用子类中的重写方法
如果它确实调用了子类的重写Ball方法,为什么我们不能将方法doThat改为:void doThat Subclass Abc
假设您有两个子类的超类:
定义void dothatsuberclass abc意味着方法doThat将接受作为超类或其任何子类实例的任何对象。然后可以执行doThatabc和doThatxyz,这两种方法都将在适当的实例中调用Ball方法
相反,如果您有dothatsublassaabc,那么对于超类的每个子类,您也需要一个特定的方法,比如dothatsublasszxyz