我的构造函数有问题 - ToString一直返回null

时间:2012-12-05 13:28:50

标签: java constructor tostring

我不指望你阅读整个代码。如果您将其复制并粘贴到IDE中,您应该会发现问题。 我是Java的新手,由于这个构造函数问题,这段代码耗费了我的时间。 总而言之,代码工作正常,但不会返回对象的字符串reprsentation

public class TestContact {

public static void main(String[] args) {

    // Juiste invoer begins with 0 and 9 digits
    Phone vasteTel1 = new Phone("027261747", "FIX");
    // wrong fix phone
    Phone vasteTel2 = new Phone("27261447", "FIX");

    // Juiste invoer begins with 0 and 10 digits
    Phone mobieleTel1 = new Phone("0495556080", "MOBIELE");
    // // wrong mobile phone
    Phone mobieleTel2 = new Phone("10495557841", "MOBIELE");

    Contact contact1 = new Contact("Joske Ergens", "mobiele",
            "jos.ergens@where.com", "0495558041");
    Contact contact2 = new Contact("Joseline Peremans", "mobiele",
            "joseline.peremans@where.com", "024596247");

    System.out.println("NUMMER " + vasteTel1.getNummer() + "\nSOORT: "
            + vasteTel1.getSoort() + "\nGELDIG NUMMER ?: "
            + vasteTel1.isGeldigNummer() + "\n");
    System.out.println("NUMMER " + vasteTel2.getNummer() + "\nSOORT: "
            + vasteTel2.getSoort() + "\nGELDIG NUMMER ?:"
            + vasteTel2.isGeldigNummer() + "\n");
    System.out.println("NUMMER " + mobieleTel1.getNummer() + "\nSOORT: "
            + mobieleTel1.getSoort() + "\nGELDIG NUMMER ?: "
            + mobieleTel1.isGeldigNummer() + "\n");
    System.out.println("NUMMER " + mobieleTel2.getNummer() + "\nSOORT: "
            + mobieleTel2.getSoort() + "\nGELDIG NUMMER ?: "
            + mobieleTel2.isGeldigNummer() + "\n");

    System.out.println(contact2);

}

}

public class Contact extends ContactGegevens {

ContactGegevens gegevens;
String naam;

public Contact() {

}

public Contact(String naam, String soort, String mail, String nummer) {
    this.naam = naam;
    gegevens = new ContactGegevens(getNummer(), getSoort(), getEmail());

}

public void toonInfo() {

}

public String toString() {
    return "NAAM: " + naam + "|\n" + gegevens.getNummer();
}

}

公共类ContactGegevens扩展电话{

private String eMail;
private Phone gsm;
private Phone telefoon;

public ContactGegevens() {

}

public ContactGegevens(String nummer, String soort, String email) {
    super(nummer, soort);
    this.eMail = email;
    gsm = new Phone(getNummer(), getSoort());
    telefoon = new Phone(getNummer(), getSoort());

}

public String getEmail() {
    return eMail;

}

public Phone getGsm() {
    return gsm;

}

public Phone getTelefoon() {
    return telefoon;
}

public String toString() {
    // return email adress vast foon, gsm
    return "" + eMail + "  " + gsm;
}

}

公共类电话{

private static final int LENGTE_MOBIEL = 10;
private static final int LENGTEVAST = 9;

private String nummer;
private String soort;

public Phone() {

}

public Phone(String nummer, String soort) {
    this.nummer = nummer;
    this.soort = soort;
}

public String getNummer() {

    return nummer;
}

public String getSoort() {

    return soort;
}

public boolean isGeldigNummer() {
    if ((nummer.startsWith(nummer, 0) && nummer.length() == LENGTE_MOBIEL))
        return true;
    else if ((nummer.startsWith(nummer, 0) && nummer.length() == LENGTEVAST))
        return true;

    else
        return false;
}

}

2 个答案:

答案 0 :(得分:1)

如果扩展类,则不创建该类的实例。相反,您需要致电super()。例如:

public class Contact extends ContactGegevens {  
    public Contact(String naam, String soort, String mail, String nummer) {
      super(nummer, soort, email);
      this.naam = naam;
    }
}

ContactGegevens中,您扩展了Phone课程。这很好,但您似乎想要存储2个不同的电话号码。 因此,在这种情况下,您不需要/要求扩展Phone。但是实例化2 Phone个对象,正如您已经在做的那样:

public class ContactGegevens {
    public ContactGegevens(String nummer, String soort, String email) {
        super(nummer, soort);
        this.eMail = email;
        gsm = new Phone(getNummer(), getSoort());
        telefoon = new Phone(getNummer(), getSoort());
    }
}

如果您只需要1个电话号码,则可以保留extend Phone部分并删除gsmtelefoon字段(以及实例化)。与Contact类似。

此外,您还包含默认构造函数ContactGegevens(),没有任何内容。这可能会破坏您的应用程序,因为您的类中有未实例化/未初始化的字段。因此,您需要将它们移除或为您的字段提供默认值。

答案 1 :(得分:1)

你的错误实际上就在这里:

public Contact(String naam, String soort, String mail, String nummer) {
    this.naam = naam;
    gegevens = new ContactGegevens(getNummer(), getSoort(), getEmail());
}

您将gegevens对象设置为新的ContactGegevens,并调用对象的getter,它将返回所有空值,因为它的字段尚未设置。调整如下:

public Contact(String naam, String soort, String mail, String nummer) {
    this.naam = naam;
    gegevens = new ContactGegevens(nummer, soort, mail);
}

此外,您正在扩展和编写相同的类,请查看一些面向对象的书......您应该

一个。扩展ContactGegevens类,并调用super(...)构造函数而不是使其成为字段。 湾要么通过使ContactGegevens成为你现在正在做的字段来扩展它并组成Contact和ContactGegevens。