我有3个类,MainClass使用main方法,一个抽象类名为AbstractClass,Subclass将使用AbstractClass进行扩展。
对象数组是在main方法中从包含1个成员的AbstractClass类型创建的。 然后我将数组的1个元素初始化为类型Subclass(这可以吗?)。 问题是我无法访问创建对象(array [0])的getDataToExport()方法。 我怀疑问题发生是因为数组是AbstractClass类型... 问题是:这甚至可能实现吗? 我要做的是使用一个AbstractClass类型的数组,并用不同的子类(在这段代码中只是一个>子类)填充它与AbstractClass扩展但我无法获得该子类的方法
使用main方法的主类
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;
}
}
答案 0 :(得分:5)
AbstractClass array[]=new AbstractClass[1]; array[0]= new Subclass(); // is this even allowed?
是的,这很好,但这意味着当你以后去使用它时,你只能访问AbstractClass
中定义的内容(除非使用强制转换,但你想避免在任何地方使用强制转换,这里没有必要。)
制作类型AbstractClass
的数组条目的唯一真正原因是,如果您只想与该类中定义的成员进行交互。例如,在这种情况下,您可能希望将getDataToExport
定义为抽象类中的抽象方法:
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 ... */;
}
}
答案 1 :(得分:2)
您必须将AbstractDataToExport()声明为AbstractClass中的抽象方法。
答案 2 :(得分:0)
你将无法获得它,因为你要声明一个AbstractClass数组,以便看到它们有两个选择
声明将在抽象类上使用的常用方法,并将它们声明为抽象方法。覆盖子类中的那些方法。例如:
public abstract class AbstractClass { public abstract int getDataToExport(); }
每个子类都必须覆盖该方法,或者也应该声明为抽象。
创建一个Sublclass数组:
Subclass array [] = new Sublcass [1]; array [0] = new Subclass(); 的System.out.println(数组[0] .getDataToExport());
答案 3 :(得分:0)
是的,这一切都很好。您唯一遗漏的一步是您需要强制转换对象的实例到具有所需方法的类型。通常的做法是:
AbstractClass ac = array[0];
if (ac instanceof Subclass) {
System.out.println(((Subclass)ac).getDataToExport()); // No problem!
}
但是你可能想要考虑另一种方式。例如,在返回null的抽象类中实现默认版本的getDataToExport。这样您就不必进行强制转换或实例测试。
答案 4 :(得分:0)
AbstractClass array[]=new AbstractClass[1];
array[0]= new Subclass(); // is this even allowed?
确实有效,因为SubClass
是AbstractClass
的派生类。
System.out.println(array[0].getDataToExport());
失败是因为编译器找不到AbstractClass.getDataToExport()
方法。它只有SubClass
才有方法,而不是它的父级。
有几种方法可以解决这个问题:
将抽象方法getDataToExport
添加到AbstractClass
,如下所示:
public abstract class AbstractClass {
public abstract int getDataToExport();
}
OR, Typecast 您的变量到其派生(具体)类的getDataToExport()
方法,如下所示:
if (array[0] instanceof SubClass) {
System.out.println(((SubClass)array[0]).getDataToExport());
}
instanceof
运算符只是声明该属性属于类X(其中X是SubClass
)。