2013-10-28 108 views
0

該代碼的最後兩行示出了該問題:當我使用參考對象編譯器的工作原理,但不是當我分配參照的數組元素。其餘代碼位於單獨文件的相同包中。 BioStudent和ChemStudent是獨立的班級,以及學生。多態行爲沒有得到執行

package pkgPoly; 

public class Poly { 
    public static void main(String[] arg) { 

     Student[] stud = new Student[3]; 

     // create a biology student 
     BioStudent s1 = new BioStudent("Tom"); 

     // create a chemistry student 
     ChemStudent s2 = new ChemStudent("Dick"); 

     // fill the student body with studs 
     stud[0] = s1; 
     stud[1] = s2; 


     // compiler complains that it can't find symbol getMajor on next line 
     System.out.println("major: " + stud[0].getMajor()); // doesn't compile; 

     System.out.println("major: " + s0.getMajor()); // works: compiles and runs correctly 
    } 
} 
+0

你能發佈錯誤信息嗎?可能還有'Student'的代碼。 – iamnotmaynard

+0

編譯器抱怨說在下一行找不到符號getMajor - 他在註釋 – Raffaele

+0

中寫道錯誤消息是「source \ pkgPoly \ Poly.java:50:錯誤:找不到符號符號:method getMajor()location:class學生 –

回答

1

有很多缺失的信息,比如什麼是S0,或者如果BioStudent和ChemStudent延長學生,但是我只是假設這一切是真實的,S0或者是BioStudent或ChemStudent的。

如果是這樣,我不完全確定正確的術語,但是當您使用父類型的引用變量並將其指向一個Child對象時,如果這些方法覆蓋父方法,則只能訪問子方法。

換句話說,你需要在你的父類的學生,那麼在你的子類BioStudent和/或ChemStudent重寫定義的getMajor()方法。

+0

我錯過了Student類中的getMajor()方法 - 謝謝克里斯託瓦爾! –

+0

我喜歡這個網站! –

1

根根類學生的對象。

我假設一些東西 -

  • BioStudent和ChemStudent擴展Student類。
  • BioStudent有一個方法getMajor()
  • 學生類沒有!

這就是stud [0] .getMajor()給你一個編譯時錯誤的原因。

你必須把它強制轉換爲學生的子類。

System.out.println("major: " + ((BioStudent) stud[0]).getMajor()); 
+0

儘管最好在'Student'中定義'getMajor()',而不是在每次調用方法時必須轉換爲子類 - 哪個子類應該向哪個子類轉換? – iamnotmaynard

+0

我錯過了Student類中的getMajor()方法 - 謝謝ajc –

+0

如果在子類中重寫方法,則不需要轉換。我只是在玩這個東西,因爲它對我來說都是新的 - 再次感謝 –

1

根據給出的信息我假設了幾件事情。

  • 學生是一個超類
  • BioStudent和ChemStudent延伸學生
  • 螺柱[0] = S1
  • 螺柱[1] = S2

您得到的錯誤是因爲學生類沒有getMajor(),但生物學員和化學學生有這種方法。

您已經創建了一個學生數組。對於編譯器stud[0]是學生類,而不是生物學員或ChemStudent。只有在運行時,jre纔會知道stud [0]具有BioStudent並且stud [1]具有ChemStudent。這就是爲什麼你得到編譯錯誤。

  • 解決方案1:

    要麼添加getMajor()方法Student類和其他2類重寫它。

OR

  • 解決方案2:

    加給你的打印語句(BioStudent stud[0]).getMajor()類型轉換 - 這明確地表明這是BioStudent對象,編譯器會知道BioStudent有getMajor()