-1

編集:間違ったコードを貼り付けて更新しました

3 つの具体的なクラスを作成しました。最初の 2 つが完了し、正常に動作します。3 つ目は、他の 2 つのクラスの新しいオブジェクトのプライベート メンバーを持つ必要があります。プライベート メンバー用にこのコードを記述するにはどうすればよいですか? 既存のクラスは NameAddress と PhoneNumber で、新しいクラスは ContactDetails という名前で、既に作成されている 2 つのクラスは NameAddress と PhoneNumber です (プライベート メンバーには最初の 1 つと後者の 2 つが必要です)。

私が試してみました:

public class ContactDetails{
  private Object contactName = new NameAddress();
  private Object mobile = new PhoneNumber();
  private Object home = new PhoneNumber();
}

しかし、これはコンパイラでは機能せず、エラーが発生します。助けていただければ幸いです。正しい構文が見つからないようです。

4

3 に答える 3

1

}クラスを閉じるための欠落を除けば、明らかな構文エラーは見られません。

public class ContactDetails {
    private Object contactName = new NameAddress();
} // ← here

しかし、おそらく、フィールドを?contactNameよりも少し便利なものとして宣言したいと思うでしょう。Object

public class ContactDetails {
    private NameAddress contactName = new NameAddress();
}

それでも問題が解決しない場合は、コンパイラ エラー メッセージの内容を正確にお知らせください。

于 2012-08-15T04:11:03.553 に答える
0

あなたのクラスには引数なしのコンストラクターがないと思われます。引数を取るコンストラクタを定義した場合は、これをNameAddressクラスに追加します。

public NameAddress() {
}

そして `PhoneNumber` についても同じことを行います

これにより、コンパイラ エラーが解消されます (ただし、アプリケーションが動作しない場合があります) 。

于 2012-08-15T04:31:03.283 に答える
0

ただの勘ですが、仕様を読み違えている可能性があると思います。

あなたが言う時:

3 番目の [クラス] には、他の 2 つのクラスの新しいオブジェクトのプライベート メンバーが必要です。

...これは、クラスで 2 つの異なるオブジェクト型を宣言し、後でインスタンス化することを意味します。アクセサーを介してそれらにアクセスする必要がある場合は、返す型を明示する必要があります。ミューテーターを介してそれらを変更する場合は、変更するオブジェクトを明確にする必要があります。この特定Objectのオブジェクトが表すものと完全に一致しない限り、オブジェクトの状態情報が失われ、プログラムで異常な動作が発生するリスクがあります。 .

これが例です。setS()このコードは、文字列が渡されている限り問題なく機能します。

public class Test {
    private Object s = new String("Testing");

    public Object getS() {
        return (String) s;
    }

    public void setS(Object theS) {
        s = theS;
    }
}

...しかし、 Object のサブクラス (つまり、 でインスタンス化されたものnew) を渡すと、ClassCastException.

これを軽減する適切な方法は、具体的にインスタンス化/戻り/文字列を渡すことです。

public class Test {
    private String s = new String("Testing");

    public String getS() {
        return s;
    }

    public void setS(String theS) {
        s = theS;
    }
}
于 2012-08-15T05:01:45.443 に答える