2016-04-04 81 views
1

當我嘗試爲構造函數調用的許多實例實現計數器時,Eclipse會一直通知錯誤。我一直在尋找這個問題,但解決方案是eclipse不會放過的東西。 問題在於子類中的Student() { count++; }實例計數器子類的個數

Implicit super constructor Dosije() is undefined. Must explicitly invoke another constructor

主文件

import java.util.Scanner; 

public class TestDosije { 

public static void main(String[] args) { 

    Scanner in = new Scanner(System.in); 
    String jmbg=null; 

    System.out.println("ime osobe: "); 
    String ime= in.next(); 

    System.out.println("prezime osobe: "); 
    String prezime= in.next(); 
    System.out.println("jmbg: "); 

    while(!(Dosije.jesteJMBG(jmbg =in.next()))) { 


    } 
    String ime_prezime= ime + " " + prezime; 

    Dosije dosije = new Dosije(ime_prezime, jmbg); 
    System.out.println(dosije.toString()); 

    System.out.println("broj indeksa: "); 
    int index= in.nextInt(); 

    System.out.println("godina upisa: "); 
    int upis= in.nextInt(); 

    System.out.println("studije: "); 
    int studije= in.nextInt(); 

    Student student = new Student(dosije, index, upis, studije); 

    System.out.println(student.toString()); 
    System.out.println(student.getCount()); 


} 

} 

的我想這情況下的超

public class Dosije { 

private String ime_prezime; 
private String jmbg; 

public Dosije(String ime_prezime, String jmbg) { 
    this.ime_prezime=ime_prezime; 
    this.jmbg=jmbg; 
} 

public Dosije(final Dosije d) { 
    ime_prezime=d.ime_prezime; 
    jmbg=d.jmbg; 
} 

public String getImePrezime() { return ime_prezime; } 
public void setImePrezime(String ime_prezime) { this.ime_prezime= ime_prezime;} 

public String getJMBG() { return jmbg; } 
public void setJMBG(String jmbg) { this.jmbg= jmbg;} 

public String toString() { 
    return ime_prezime + "\njmbg: " + jmbg; 
} 

public static boolean jesteJMBG(String jmbg) { 


    if(jmbg.length() != 13) { 
     System.err.println("jmbg ima 13 cifara"); 
     return false; 
    } 


    for(int i=0;i < jmbg.length(); i++) { 
     if(!(Character.isDigit(jmbg.charAt(i)))) { 
      System.err.println("jmbg nije broj!"); 
      return false; 
     } 
    } 

    return true; 
} 

} 

子類來算

public class Student extends Dosije{ 

private int br_index; 
private int god_upis; 
private int profil_studija; 

private static int count=0; 

Student() {  
    count++;  //the devil himself 
} 

public Student(final Dosije d, int index, int upis, int studije){ 
    super(d); 
    br_index=index; 
    god_upis=upis; 
    profil_studija=studije; 

} 

public Student(final Student s) { 
    super(s); 
    br_index=s.br_index; 
    god_upis=s.god_upis; 
    profil_studija=s.profil_studija; 

} 

public void setProfil(int n) {profil_studija=n;} 

public int getCount() { return count; } 

public String Studije(int i) { 
    if(i == 0) 
     return "Osnovne"; 
    else if(i == 1) 
     return "MSc"; 
    else 
     return "PhD"; 

} 


public String toString() { 
    return super.toString() + "\n" + "broj indeksa: " + br_index + "/" + (god_upis % 100) + "\n" 
      + "studije: " + Studije(profil_studija); 
} 

} 

回答

2

Student()構造函數沒有通過編譯,因爲超類沒有無參數構造函數,所以編譯器添加的​​的隱式調用不能通過編譯。

您可以添加一個public Dosije() {}構造函數來防止編譯錯誤。

但是,無論使用哪個構造函數,您可能還想在其他Student構造函數中增加count,以便計算創建的實例的總數。

+0

對不起,我可能聽起來很新鮮,但我的超類的無參數構造函數在哪裏?兩個構造函數都有參數。 – monolith937

+0

@ monolith937就是這一點。您在超類中缺少無參數構造函數,這是Student類中無參數構造函數未通過編譯的原因。 – Eran

+0

@ monolith937在你的Student類中你有一個無參數構造函數:'public Student(){count ++}'。由於它是一個子類,編譯器會自動嘗試將其編譯爲:public Student(){super();計數++; }'。但是,由於您的Dosije類沒有無參數構造函數,因此會顯示錯誤。 –