Java 如何将子类作为超类类型调用

Java 如何将子类作为超类类型调用,java,superclass,Java,Superclass,我目前正在学习继承,在理解这个概念时遇到了一些困难。 对于下面的代码,有人能告诉我为什么不能声明超类类型的子类吗 public class Test{ public static void main(String[] args){ Superclass myA = new Superclass(); Superclass myB = new Subclass(); } public class Superclass{ private string a;

我目前正在学习继承,在理解这个概念时遇到了一些困难。 对于下面的代码,有人能告诉我为什么不能声明超类类型的子类吗

public class Test{
    public static void main(String[] args){
    Superclass myA = new Superclass();
    Superclass myB = new Subclass();
    }
public class Superclass{
    private string a;

    public Superclass()
    {
        a="";
    }
    public void setA(String userA)
    {
        a = userA;     
    }
}
public class Subclass extends Superclass{
    private String b;

    public Subclass()
    {
        b = "";
    }
    public void setB(String userB)
    {
        b = userB;
    }
    public void display()
    {
        System.out.print(b)
    }
}
myA没有给我任何问题,但myB有。我想做一个数组,比如说超类, 但我希望能够使用子类,类似这样的

Superclass[] X = new Superclass[2];
x[0] = new Subclass();
X[0].setB("hello");
X[0].display();

这里的主要乐趣在于,无论何时调用引用上的任何方法,该方法都应该出现在其类声明中

方法是否可以调用取决于引用类型,但要调用的实现实例取决于其对象类型

因为在超类中并没有setB方法,所以编译器不知道这个方法来自哪里,所以它会给出编译时错误


希望有帮助

将子类中的setB重命名为setA,将函数display添加到超类中,并将子类中的setA调用为X[0];您将看到这是如何工作的。

像这样更改代码-将setA和setB更改为set-您的代码将工作。这种行为称为多态性,是面向对象编程的主要概念之一

public class Superclass{
    private string a;

    public Superclass()
    {
        a="";
    }
    public void set(String userA)
    {
        a = userA;     
    }
}
public class Subclass extends Superclass{
    private String b;

    public Subclass()
    {
        b = "";
    }
    @override
    public void set(String userB)
    {
        b = userB;
    }
    public void display()
    {
        System.out.print(b)
    }
}

您正在尝试将子类类型对象分配给它的超类类型对象X[0]

因此,在分配时不会显示任何错误。但您可以在子类中调用与超类中同名的方法

比如说

如果将setB重命名为setA,则可以找到预期结果,但不能调用setB

现在尝试分配myB=X[0];跑

您将得到以下错误:线程主java.lang.NullPointerException中出现异常

现在,如果您创建一个新的子类对象,即Subclass subc=newsubclass

并尝试将X[0]分配给subc,subc=X[0];
您将得到这个错误,不兼容的类型需要子类,发现了超类

您正在将子类对象分配给一个超类类型变量,也就是说,上传完成了,没问题。 但是当你这样做的时候,只有超类方法可以被访问。因此,为了访问子类方法,请对其子类类型进行向下转换。 例如


您的X变量属于超类类型,因此您只能访问此类或其超类中的可见方法和属性超类的超类,但不能访问其子类。 您认为可以调用setB方法的问题是,您看到的是分配给超类[]X(新的超类[2])的对象类型,因此当您在方法中将此类对象的引用作为属性时会发生什么?你甚至不知道它是调用方,如果它有子类,你可以猜测和调用它的子类的什么方法?你不能

    Superclass[] X = new Superclass[2];
    X[0] = new Subclass();
    ((Subclass) X[0]).setB("hello");
    ((Subclass) X[0]).display();