2016-03-10 103 views
0

我有一個名爲Interpreter的類。它由幾個類繼承,包括一個名爲LoadStep的類。Java對象繼承問題列表

我創建的對象的列表:以這種方式加入

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 
+0

我想輸入一個最佳答案來接受。 – user25976

+1

3個upvotes怎麼樣?記住,儘管你只能接受一個答案,但你仍然可以得到所有幫助你的答案! –

回答

5

你需要強制轉換的LoadStep情況下,像

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

這是多態的性質,當你指定一個子對象到父對象,您可以通過父對象訪問父方法和屬性。

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

要上傳一個Child對象,您只需將對象分配給Parent類型的引用變量即可。父引用變量不能訪問僅在Child中可用的成員。

因爲父級引用Child類型的對象,所以可以將其轉換回Child。它被稱爲向下轉換,因爲您正在向繼承層次結構中的類投射對象。向下轉換要求您將括號中的子類型寫入。例如:

Child child2 = (Child) parent; 
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 

,這就需要你知道你想讓它澆鑄成的類型,基本上摧毀任何多態性。避免任意使用繼承。贊同繼承的接口。