Java 计数器子类的实例数

Java 计数器子类的实例数,java,Java,当我试图为构造函数调用的多个实例实现计数器时,Eclipse会不断通知错误。我一直在研究这个问题,但解决方案正是eclipse不允许的。 问题出在子类中的Student(){count++;} 未定义隐式超级构造函数dosje()。必须显式调用另一个构造函数 主文件 import java.util.Scanner; public class TestDosije { public static void main(String[] args) { Scanner in = new

当我试图为构造函数调用的多个实例实现计数器时,Eclipse会不断通知错误。我一直在研究这个问题,但解决方案正是eclipse不允许的。 问题出在子类中的
Student(){count++;}

未定义隐式超级构造函数dosje()。必须显式调用另一个构造函数

主文件

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;
}

}
您的
Student()
构造函数没有通过编译,因为超类没有无参数构造函数,所以对
super()的隐式调用未通过编译

您可以添加
public Dosije(){}
构造函数来防止编译错误


但是,您可能也希望在另一个
Student
构造函数中增加
count
,以便计算创建的实例总数,而不管使用了哪个构造函数。

请原谅,这听起来可能有些生疏,但我的无参数构造函数在超类中的位置在哪里?两个构造函数都有参数。@monolith937这就是重点。超类中缺少无参数构造函数,这就是学生类中的无参数构造函数无法通过编译的原因。@monolith937在学生类中有一个无参数构造函数:
public Student(){count++}
。由于它是一个子类,编译器会自动尝试将其编译成以下内容:
public Student(){super();count++;}
。但是,由于您的Dosije类没有无参数构造函数,因此会显示错误。@monolith937我错误地写了“有”而不是“没有”。现在修正:)哦,这澄清了问题。谢谢,它起作用了,它为我对继承的理解提供了一些启示:)
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);
}

}