2012-11-02 62 views
0

我不明白以下程序。我提到了我在代碼中遇到的兩個錯誤。但我不能明白其中的道理在Java中繼承障礙

import java.io.*; 
class sdata 
{ 
    float per; 
    int m,tm=0,i,n; 

    sdata(int n)throws Exception 
    { 
     DataInputStream dis2=new DataInputStream(System.in); 
     for(i=1;i<=n;i++) 
     { 
     System.out.print("enter marks of subject"+i); 
     int m=Integer.parseInt(dis2.readLine()); 
     tm=tm+m; 
     } 
     per=tm/n; 
    } 
} 

class disdata extends sdata 
{ 
    //below line gives an error "constructor sdata in class xyz.sdata cannot be applied to given types required:int found:no arguments" 

    disdata() throws Exception{    
     System.out.println("TOTAL MARKS OF SUBJECTS:"+tm); 
     System.out.println("PERCENTAGE OF STUDENT:"+per); 
    } 

} 
class sresult 
{ 
    public static void main(String args[])throws Exception 
    { 
     DataInputStream dis=new DataInputStream(System.in); 
     int n=Integer.parseInt(dis.readLine()); 

     disdata objj=new disdata(); 
     //the below line creates an error saying "cannot find symbol" 
     objj.sdata(n); 
    } 
} 
+0

此外,閱讀[Java命名約定](http://www.oracle.com/technetwork/java/codeconv-138413.html)可能會很有用。堅持這些將允許兩個人在stackoverflow和任何人需要使用/更改您的代碼,以快速瞭解你在做什麼;) – akaIDIOT

+0

哦,好吧..我一定會從下一次。 –

回答

0

sdata是超一流的disdata,當你創建disdata的對象不帶參數,並在disdata構造你沒有默認調用sdata int構造所以它會嘗試找到任何參數sdata構造,這是不可用,所以它會給出錯誤。

你可以做的事情調用sdata int構造函數從disdata構造函數或在sdata中創建無參數構造函數。

class sdata { 
    float per; 
    int m, tm = 0, i, n; 
    sdata(int n) throws Exception {...} 
    //No argument constructor 
    sdata(){} 
} 
+0

非常感謝。我感謝您的幫助。 –

2

如果您super classoverloaded argument constructor你的子類有撥打電話explicitly

disdata() throws Exception{    
    super(some int vale youwanna pass); 
      System.out.println("TOTAL MARKS OF SUBJECTS:"+tm); 
     System.out.println("PERCENTAGE OF STUDENT:"+per); 
    } 

記得super()應在disdata() constructorfirst line

disdata objj=new disdata(); 
    //the below line creates an error saying "cannot find symbol" 
     objj.sdata(n); 

constructor不是方法。你正嘗試用objj調用構造函數sdata(n),這是錯誤的。使用新的操作符來調用它。 喜歡:

disdata objj=new disdata(n); 
+0

如果寫在我的代碼中// disdata objj = new disdata(n);那麼我將不得不重寫disdata的構造函數,如 disdata(int j){ super(j); System.out.println(「主題標題:」+ tm); System.out.println(「學生的百分比:」+每個); } –

0

您不能調用構造函數作爲一個正常的方法,該方法嘗試與objj.sdata(n);做。 構造函數不是方法。

+0

非常感謝。我感謝您的幫助。 –

1

Java強制構造函數的適當鏈接。構造函數體中的第一條語句必須是this(...)(對同一類的另一個構造函數的調用)或super(...)(對超類構造函數的調用),並且如果不包含顯式調用,則Java將插入一個隱式在構造函數體的其餘部分之前調用super()。由於您的sdata沒有無參數構造函數,因此無法編譯。

你需要或者

  1. 添加一個無參數的構造函數sdata
  2. 將一個super(0)召喚爲第一件事就是disdata構造函數來調用現有的單參數的超類構造函數。
+0

非常感謝。我感謝您的幫助。 –