AbstractClass array[]=new AbstractClass[1];
array[0]= new Subclass(); // is this even allowed?
Да, это нормально, но это означает, что когда вы позже перейдете к его использованию, у вас будет доступ только к тому, что определено в AbstractClass
(кроме использования приведения, но вы хотите избегать использования приведения везде, где можете, и есть здесь нет необходимости).
Единственная реальная причина для создания записей массива типа AbstractClass
была бы, если вы хотите взаимодействовать только с членами, определенными в этом классе. Так, например, в этом случае вы, вероятно, захотите определить getDataToExport
как абстрактный метод в абстрактном классе:
public abstract class AbstractClass {
public abstract int getDataToExport();
}
Вы можете также рассмотреть возможность использования интерфейса , а не абстрактного класса. Поскольку класс может быть производным только от одного базового класса, но может реализовывать столько интерфейсов, сколько ему захочется, за исключением случаев, когда существует большая часть общей реализации, которую вы бы поместили в абстрактный базовый класс, вам лучше использовать интерфейс & mdash ; потому что это не накладывает ненужных ограничений на реализацию этого интерфейса. На самом деле, вам почти всегда лучше с интерфейсом; вы всегда можете также иметь абстрактную базу, если хотите.
Так, например:
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 ... */;
}
}