我有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!
}
}
抽象类
public abstract class AbstractClass {
}
扩展AbstractClass的子类
public class Subclass extends AbstractClass {
private int dataToExport;
public Subclass(){
this.dataToExport=2;
}
public int getDataToExport() {
return dataToExport;
}
}
最佳答案
AbstractClass array[]=new AbstractClass[1]; array[0]= new Subclass(); // is this even allowed?
Yes, that's fine, but it means that when you later go to use it, you only have access to what's defined in AbstractClass
(barring using a cast, but you want to avoid using casts wherever you can, and there's no need for one here).
The only real reason for making the array entries of type AbstractClass
would be if you only want to interact with the members defined in that class. So for instance, in this case, you'd probably want to have the getDataToExport
defined as an abstract method in the abstract class:
public abstract class AbstractClass {
public abstract int getDataToExport();
}
您可能还会考虑使用接口而不是抽象类。由于一个类只能从一个基类派生,但可以实现任意数量的接口,除非您将大量的通用实现放入抽象基类中,否则最好使用一个接口-因为它不会对该接口的实现施加不必要的约束。实际上,使用界面几乎总是更好。如果需要,您也总是可以有一个抽象的基础。
因此,例如:
public class MainClass {
public static void main() {
NiftyThingy array[]=new NiftyThingy[1];
array[0]= new NiftyThingyImplementation();
System.out.println(array[0].getDataToExport());
}
}
哪里
public interface NiftyThingy {
public int getDataToExport();
}
和
public class NiftyThingyImplementation implements NiftyThingy {
public int getDataToExport() {
return /* ... the data ... */;
}
}