Java对象数组和继承

Luk*_*uka 2 java arrays inheritance object

我有3个类,具有主要方法的MainClass,一个名为AbstractClass和Subclass的抽象类,将通过AbstractClass进行扩展。

对象数组是在main方法中从包含1个成员的AbstractClass类型创建的。然后,我将数组的1个元素初始化为Subclass类型(可以吗?)。问题是我无法使用创建的对象(array [0])的getDataToExport()方法。我怀疑出现问题是因为数组是AbstractClass类型...而问题是:这是否有可能实现?我想做的是使用类型为AbstractClass的数组,并用由不同的子类(在此代码中仅是一个-> Subclass)制成的对象填充它,但该类继承了AbstractClass,但我无法使用该子类的方法。

主类与主方法

public class MainClass {

    public static void main() {

        AbstractClass array[]=new AbstractClass[1];
        array[0]= new Subclass(); // is this even allowed?
        System.out.println(array[0].getDataToExport()); // Problem!

    }

}
Run Code Online (Sandbox Code Playgroud)

抽象类

public abstract class AbstractClass {

}
Run Code Online (Sandbox Code Playgroud)

扩展AbstractClass的子类

public class Subclass extends AbstractClass {

    private int dataToExport;

    public Subclass(){
        this.dataToExport=2;
    }

    public int getDataToExport() {
        return dataToExport;
    }   

}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

AbstractClass array [] = new AbstractClass [1];
array [0] = new Subclass(); //这甚至允许吗?

是的,这很好,但是这意味着您以后使用它时,您只能访问其中的定义AbstractClass(禁止使用强制转换,但是您要尽可能避免使用强制转换,这里不需要一个)。 。

生成类型为数组的条目的唯一真实原因AbstractClass是,如果您只想与该类中定义的成员进行交互。因此,例如,在这种情况下,您可能希望将其getDataToExport定义为抽象类中的抽象方法:

public abstract class AbstractClass {
    public abstract int getDataToExport();
}
Run Code Online (Sandbox Code Playgroud)

您可能还会考虑使用接口而不是抽象类。由于一个类只能从一个基类派生,但可以实现任意数量的接口,除非您将大量的通用实现放入抽象基类中,所以最好使用一个接口-因为它不会对该接口的实现施加不必要的约束。实际上,使用界面几乎总是更好。如果需要,您也总是可以有一个抽象的基础。

因此,例如:

public class MainClass {

    public static void main() {

        NiftyThingy array[]=new NiftyThingy[1];
        array[0]= new NiftyThingyImplementation();
        System.out.println(array[0].getDataToExport());

    }

}
Run Code Online (Sandbox Code Playgroud)

哪里

public interface NiftyThingy {

    public int getDataToExport();

}
Run Code Online (Sandbox Code Playgroud)

public class NiftyThingyImplementation implements NiftyThingy {

    public int getDataToExport() {
        return /* ... the data ... */;
    }

}
Run Code Online (Sandbox Code Playgroud)