Java对象继承问题列表

时间:2016-03-10 21:04:55

标签: java

我有一个名为Interpreter的课程。它由几个类继承,包括一个名为LoadStep的类。

我创建了一个对象列表:

public static List<Interpreter> fileActions = new ArrayList<Interpreter>();

以这种方式添加对象:

if (actionName.equals("LOAD")) {
    LoadStep loadAction = new LoadStep();
    fileActions.add(loadAction);
}

当尝试访问我的对象并调用他们的方法时,我无法访问子类方法。我期待,因为当我尝试使用getClass()来查看对象类时,我得到了子类名。

    for (int i = lineNumber; i < Test.fileActions.size(); i++) {

        System.out.println(Test.fileActions.get(i).getClass());
        if (Test.fileActions.get(i) instanceof LoadStep) {
            LoadStep newAction = Test.fileActions.get(i);
            myMemoryAddress = Test.fileActions.get(i).getMemoryAddress(); //This line gives me Cannot Find Symbol, as getMemoryAddress is LoadStep's method, and not Interpreter
        } 
    }

print语句给了我:

class test.LoadStep

3 个答案:

答案 0 :(得分:5)

您需要对您的LoadStep实例进行类型转换,例如

Interpreter step = ...;
if (step instanceof LoadStep) {
  LoadStep sub = (LoadStep) step;
  sub.invokeSubclassMethod(...)
}

答案 1 :(得分:3)

这是多态性的本质,当您将子对象分配给父对象时,您可以通过父对象只访问父方法和属性。

Child child = new Child ();
Parent parent = child;

要向上转换Child对象,您需要做的就是将对象分配给Parent类型的引用变量。父引用变量无法访问仅在Child中可用的成员。

因为父引用了Child类型的对象,所以可以将其强制转换为Child。它被称为向下转换,因为您正在将对象转换为继承层次结构中的类。向下转换要求您将子类型写入括号中。例如:

Child child2 = (Child) parent;

答案 2 :(得分:1)

Java是一种强类型语言和早期绑定。这意味着编译器根据其声明的方式设置变量的可见性。

示例:

public class MyClass {
    public void myMethod(){}
    public void myMethod2(){}
}
public class MyClass2 extends MyClass{
    public void myMethod3(){}
}
public class MyTestClass {

    public void doSomeThing(){

        MyClass myClass= MyClass2();
        myClass.myMethod(); // valid
        myClass.myMethod2(); // valid
        myClass.myMethod3(); // invalid
    }
}

您无法在变量上调用方法myMethod3(),因为它已键入其父/祖先。这是你遇到的问题。如果要访问该方法,则必须将其类型化为实际类,如下所示:

((MyClass2)myClass).myMethod3(); // valid

它要求您知道要将其类型化的类型,并且基本上会破坏任何多态性。避免任意使用继承。通过继承来支持接口。