-2

私はあなたがコード全体を読むことを期待していません。コピーしてIDEに貼り付けると、問題が見つかるはずです。私はJavaを初めて使用しますが、このコンストラクターの問題のために、このコードは時間を浪費しています。全体として、コードは正常に機能しますが、オブジェクトの文字列表現を返しません

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

}

}

パブリッククラスContactは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はPhone{を拡張します

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

}

4

2 に答える 2

1

あなたのバグは実際にここにあります:

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

gegevensオブジェクトを新しいContactGegevensとして設定し、オブジェクトのゲッターを呼び出します。これにより、フィールドが設定されていないため、すべてのnullが返されます。次のように適応します。

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

さらに、あなたは同じクラスを拡張して構成しているので、いくつかのオブジェクト指向の本を見てください...あなたはすべきです

a。ContactGegevensクラスを拡張し、super(...)コンストラクターを呼び出して、フィールドにしないでください。b。それを拡張せず、ContactGegevensを現在のようにフィールドにして、ContactとContactGegevensを作成します。

于 2012-12-05T13:37:42.063 に答える
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。ただしPhone、すでに行っているように、2つのオブジェクトをインスタンス化します。

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を削除できます。に似ています。gsmtelefoonContact

さらに、ContactGegevens()コンテンツなしでデフォルトのコンストラクターも含めます。クラスにインスタンス化されていない/初期化されていないフィールドがあるため、これによりアプリケーションが破損する可能性があります。したがって、それらを削除するか、フィールドにデフォルト値を指定する必要があります。

于 2012-12-05T13:33:29.513 に答える