在java中调用子类的方法

时间:2013-02-26 12:28:46

标签: java inheritance

如何在下面的场景中调用所有类的print *()意味着在main()方法中调用A的printA(),B的printB()和C的printC()。

class A
{
  public void printA(){System.out.println("A.printA()");}
}

class B extends A
{
    public void printB(){System.out.println("B.printB()");}
}

class C extends A
{
    public void printC(){System.out.println("C.printC()");}
}
class DemoInheritence
{
    public static void main(String[] str){
        printIt(new A());
        printIt(new B());
        printIt(new C());
    }
    public static void printIt(A a) {
        //Here I wants to call A's printA(), B's printB() and C's printC()
        //So how can I do this
    }
}

3 个答案:

答案 0 :(得分:11)

通常,你做这样的事情,它被称为覆盖:

class A
{
  public void print(){System.out.println("A.printA()");}
}

class B extends A
{
    public void print(){System.out.println("B.printB()");}
}

class C extends A
{
    public void print(){System.out.println("C.printC()");}
}
class DemoInheritence
{
    public static void main(String[] str){
        printIt(new A());
        printIt(new B());
        printIt(new C());
    }
    public static void printIt(A a) {
        a.print();
    }
}

答案 1 :(得分:4)

对于您的代码,您可以使用以下内容:

public static void printIt(A a) {
    if(a instanceof B) {
    ((B)a).printB();
    } else if(a instanceof C) {
       ((C)a).printC();
    } else {
      a.printA(); 
    }

}

但是这有点不对,你应该在A的子类中重写该方法,或者更好地创建一个所有类实现的接口并在代码中使用该接口。

答案 2 :(得分:0)

您可以使用反射API,但是您可能会做出一些假设。至少有两种可能性:

解决方案1.如果打印方法被称为“print [Class name]”,则按名称获取方法:

public static void printIt(Object o) {
    Class objectClass = o.getClass();
    try {
        Method printMethod = objectClass.getMethod("print" + objectClass.getName());
        printMethod.invoke(o);
    } catch (NoSuchMethodException e) {
        throw new IllegalStateException("Method print"+objectClass.getName()+"() doesn't exist", e);
    } catch (InvocationTargetException e) {
        throw new IllegalStateException("Problem calling method print"+objectClass.getName()+"()", e);
    } catch (IllegalAccessException e) {
        throw new IllegalStateException("Method print"+objectClass.getName()+"() is not accessible", e);
    }
}

解决方案2.如果每个类总是声明一个方法,则采用传递对象类的getDeclaredMethod返回的第一个方法:

public static void printIt(Object o) {
    Class objectClass = o.getClass();
    try {
        Method printMethod = objectClass.getDeclaredMethods()[0];
        printMethod.invoke(o);
    } catch (InvocationTargetException e) {
        throw new IllegalStateException("Problem calling method print"+objectClass.getName()+"()", e);
    } catch (IllegalAccessException e) {
        throw new IllegalStateException("Method print"+objectClass.getName()+"() is not accessible", e);
    }
}