JAVA:如何调用Object的子类中的方法?

时间:2012-05-13 03:20:50

标签: java inheritance polymorphism

我正在尝试解决这个问题,但实际上我并不理解语法。 请考虑以下代码:

class Parent {
   private String productCode1;      // Format X9999
   private String productCode2;

    public Parent(String productCode1, String productCode2)
    {
        this.productCode1= productCode1;
        this.productCode2= productCode2;

    } 

}

然后我有一个包含我想要调用的方法的子类

public Child extends Parent{
    private String[] serialNumbers;

    public Child(String productCode1, String productCode2, String... args){
        super(productCode1,  productCode2,);
        int i = 0;

        for(String serialN: args){
            serialNumbers = new String[10]; 
            serialNumbers[i]= serialN;
            i++;
        }

        public String[] getSerialNumbers(){     //This is the method i want to call
            return this.serialNumbers;
        }
}

这是库存类

public class Inventory{

public ArrayList<Parent> products;

public Inventory(){

    products = new ArrayList<Parent>();  //Some hard coded items
    products.add(new Parent("A0001", "abcdefg"));
    products.add(new Parent("B0010", "abcdefg"));
    products.add(new Parent("C0100", "abcdefg"));
    products.add(new Child("D1000",  "abcdefg", "firstSN", "secondSN", "thirdSN"));
}

public static ProductLine getProduct(ArrayList<Parent> products, String productCode){

    for(int i = 0; i < products.size(); i++){
         ProductLine product = products.get(i);
         if(product.getProductCode().equals(productCode)){
             return product;  
         }
    }

    return null;

}

现在在主类中,我需要执行一个检查,如果对象是父对象或子对象,那我正在尝试获取一个序列号,如果我得到一个它意味着是一个孩子否则是父母。

我试图使用子类中的getserialNumbers()的唯一问题

public Application{
    String inputProductCode = keyboard.nextLine(); //Input product code from user
    Inventory inventory = new Inventory();

    ProductLine pFound = inventory.getProduct(inventory.products, inputProductCode);  //check if is Child item

    String[] serNumb = pFound.getSerialNumbers(); //Here is where i get Error cannot find symbol/method getSerialNumbers
    if(serNumb[0] == null){
          // code continue... 
}

我试图像:

String[] serNumb = ((ItemisedProductLine)pFound).getSerialNumbers();

它编译但是他(在预期中)在运行时拖曳“父母不能被施放给孩子”。

我希望我解释得很好 抱歉这个问题很长......

5 个答案:

答案 0 :(得分:2)

右。您无法进行投射,因为Parent根本不是Child

你可以使用instanceof来检查你拥有的对象类型,然后只有你拥有Child实例的演员和电话,但你通常想避免做那样的事情。这不是一个好的OOP。

您可以做的一件事是将getSerialNumbers()方法放在Parent中,并始终返回一个空数组,然后在Child中覆盖它以实际返回Child' s序列号。

当然,这里也可能值得重新考虑整个班级层次结构。从Parent继承的所有类都有序列号是否有意义?如果是这样,您应该考虑将所有序列号处理移至Parent。是否会有更多Parent的子类而不是Child?如果没有,或许应该消除Child

答案 1 :(得分:1)

这是OOP编程模型中的简单问题:

  • 任何Child实例也是Parent个实例。
  • 任何Parent实例也可能是Child个实例。

如果您将Inventory类构造函数更改为以下内容,则您的程序可以正常工作:

public Inventory()
{
    products = new ArrayList<Parent>();  //Some hard coded items
    products.add(new Child("A0001", "abcdefg"));
    products.add(new Child("B0010", "abcdefg"));
    products.add(new Child("C0100", "abcdefg"));
    products.add(new Child("D1000",  "abcdefg", "firstSN", "secondSN", "thirdSN"));
}
在将instanceof实例投射到Parent之前,

或更好的方法是Child个关键字检查。

答案 2 :(得分:0)

为什么Parent类没有getSerialNumbers方法?我认为你有两个选择:在Parent类中实现,或者在逻辑中不考虑Parent(使用instanceof测试)。

答案 3 :(得分:0)

除非并且直到它是父类中定义的抽象方法,否则不能调用子类的方法。因为JVM不理解子类中的方法。为此,您可以在Inventory类中执行以下操作。

public class Inventory{

public ArrayList<Parent> products;

public Inventory(){

    products = new ArrayList<Parent>();  //Some hard coded items
    products.add(new Child("A0001", "abcdefg"));
    products.add(new Child("B0010", "abcdefg"));
    products.add(new Child("C0100", "abcdefg"));
    products.add(new Child("D1000",  "abcdefg", "firstSN", "secondSN", "thirdSN"));
}

public static ProductLine getProduct(ArrayList<Parent> products, String productCode){

    for(int i = 0; i < products.size(); i++){
         ProductLine product = products.get(i);
         if(product.getProductCode().equals(productCode)){
             return product;  
         }
    }

    return null;

}

答案 4 :(得分:0)

如果您的目标是确定您的对象是父类型还是子类型,则可以使用instanceof关键字来执行此操作:

if(pFound instanceof Child) {
     //...
}

如果要区分使用序列号的类型,Parent类也必须实现getSerialNumber方法。