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)
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)