多态性:从超类的变量中调用子类的方法

时间:2018-09-24 05:40:21

标签: java polymorphism

在Java中,当要执行一个方法时,首先在对象的真实类(定义对象的真实类型)中搜索其声明。如果找不到,则检查超类。如果也没有找到,则检查下一个父类,依此类推。但是,请看下面的示例:

   SuperClass s = new SubClass(list of parameter);
   s.someMethodExistOnlyInSubClass();

这将给我一个编译时错误。我认为,如上所述,它会首先在someMethodExistOnlyInSubClass()中寻找SubClass,验证它是否存在然后立即执行。如果我使用类型SuperClass的变量来引用SubClass的实例,则某些参数将通过调用SuperClass进入super()的构造函数,并且该对象将是在那里实例化。在这种情况下,其余参数又去了哪里?

3 个答案:

答案 0 :(得分:4)

通过将对SubClass实例的引用分配给类型为SuperClass的变量,该变量被视为引用了SuperClass实例。因此,它将不了解SubClass中明确声明的任何方法。不过请注意,在SubClass中执行的替代仍然有效。

在您描述的上下文中,要访问someMethodExistOnlyInSubClass(),必须将s强制转换为类型SubClass。看下面:

((SubClass) s).someMethodExistOnlyInSubClass();

答案 1 :(得分:1)

根据其声明类创建对象。 当您将其声明为SuperClass s时,该对象将没有任何称为someMethodExistOnlyInSubClass的方法。因此,当您尝试调用此方法时,甚至在查看子类之前,都会遇到编译错误。

对象s仅约束超类的所有内容,除非您将对象类型强制转换为子类,否则该对象将不知道任何子类。

答案 2 :(得分:1)

仅当在父类和子类中都定义了该方法时,您要尝试做的事情才能起作用。

    import java.util.*;
    class Parent 
    {
        public void sample()
        {
            System.out.println("Method of parent is getting Called");
        }
    }


    class Subclass extends Parent
    {
        public void sample()
        {
            System.out.println("Method of Child class is getting Called");
        }
    }

    public class Main
    {
        public static void main(String[] args){
            Parent p = new Subclass();
            p.sample();
        }
    }

OUTPUT : Method of Child class is getting Called

如果该方法仅存在于Child类中。您将必须自己创建Child类的实例。

类似这样的东西:

import java.util.*;
class Parent 
{

}

class Subclass extends Parent
{
    public void sample()
    {
        System.out.println("Method of Child class is getting Called");
    }
}

public class Main
{
    public static void main(String[] args){
        Subclass p = new Subclass();
        p.sample();
    }
}

或者您可以像之前的文章中所述键入强制转换

Parent p = new Subclass();
((Subclass)p).sample();