2010-11-09 59 views
2

我有3个类,MainClass和main方法,一个名为AbstractClass的抽象类和Subclass,它将被AbstractClass扩展。java对象和继承数组

对象数组是在包含1个成员的类AbstractClass的main方法中创建的。 然后,我将数组的1个元素初始化为类型Subclass(这可以吗?)。 问题是我无法到达创建的对象(数组[0])的getDataToExport()方法。 我怀疑问题发生,因为该数组是AbstractClass类型... 而问题:这甚至有可能完成? 我想要做的是使用一个AbstractClass类型的数组,并填充由不同的子类(在这段代码中只是一个 - >子类)扩展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 { 

} 

子类,其延伸抽象类

public class Subclass extends AbstractClass { 

    private int dataToExport; 

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

    public int getDataToExport() { 
     return dataToExport; 
    } 

} 

回答

2

,必须声明getDataToExport()作为抽象类的抽象方法。

4
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 ... */; 
    } 

} 
+0

谢谢,这真的帮了我很多 – Luka 2010-11-09 21:12:25

+0

@Luka:很酷,很高兴帮助。如果您觉得它回答了这个问题,您需要点击答案开头左侧的空白复选标记,以便您将问题标记为“已回答”。 (如果你*不认为这回答了这个问题,那么不要那样做。:-)) – 2010-11-09 22:18:05

0

你将无法得到它,因为你是抽象类声明的数组为了看到他们你有两种选择

  • 声明您将在抽象类上使用的常用方法,并将它们声明为抽象类。覆盖子类中的这些方法。例如:

    public abstract class AbstractClass public abstract int getDataToExport(); }

而且每个子类都必须重写该方法或应声明为抽象。

  • 创建Sublclass的数组:

    子类阵列[] =新Sublcass [1]; array [0] = new Subclass(); System.out.println(array [0] .getDataToExport());

0

是的,这一切都很完美。您唯一遗漏的一步是您需要转换为具有所需方法的类型的对象实例。通常的做法是:

AbstractClass ac = array[0]; 
if (ac instanceof Subclass) { 
    System.out.println(((Subclass)ac).getDataToExport()); // No problem! 
} 

但是,您可能需要考虑以另一种方式进行操作。例如,在返回null的抽象类中实现getDataToExport的默认版本。这样你就不必进行演员或实例测试。

0
AbstractClass array[]=new AbstractClass[1]; 
    array[0]= new Subclass(); // is this even allowed? 

事实上,作为​​是AbstractClass的派生类。之所以

System.out.println(array[0].getDataToExport()); 

失败是因为编译器找不到AbstractClass.getDataToExport()方法。只有​​有方法而不是其父。

有两种方法来解决这个问题:

添加一个抽象方法getDataToExportAbstractClass像这样:

public abstract class AbstractClass { 
    public abstract int getDataToExport(); 
} 

OR,类型转换您的变量及其衍生(混凝土)类有getDataToExport()方法,如下所示:

if (array[0] instanceof SubClass) { 
    System.out.println(((SubClass)array[0]).getDataToExport()); 
} 

instanceof运算符只是声明属性是X类的(其中X是​​)。