2

私は4つのクラスを持っています。1 つはドライバー クラス、1 つはインターフェイス、2 つは子クラスです。これはインターフェイス クラスです。

public interface Speaker {
    public void speak();
    public void announce(String announcement);
}

これはドライバークラスです:

public abstract class SpeakerDriver implements Speaker {
    public static void main (String [] args) {
        Speaker ref;
        Politician poli = new Politician("George Bush");
        Lecturer lect = new Lecturer("Professor Cross");
        Pastor past = new Pastor ("P.M. Smith");

        ref = poli;
        ref = lect;
        ref = past;

        System.out.println();
        System.out.println(lect);
        System.out.println(past);   
    }
}

これらは 2 つの子クラスです。

public class Pastor implements Speaker {
    protected String announcement;

    public Pastor (String name) {       
    }

    @Override
    public void speak() {   
    }

    @Override
    public void announce(String announc) {
        System.out.println("I am the pastor at CCBC."); 
    }
}

public class Lecturer implements Speaker {
    protected String announcement;

    public Lecturer(String name) {
    }

    @Override
    public void speak() {
    }

    @Override
    public void announce(String announcement) {     
        System.out.println("I am the lecturer at CCBC");    
    }
}

私の質問は、出力を次のように見せている私の実装の何が問題なのかということです:

講師@a90653
牧師@de6ced

println にあるテキストを含める必要がある場合。

4

3 に答える 3

5

次のステートメントでオブジェクトを印刷しています。

System.out.println(lect);

おそらく、オブジェクトで関数を呼び出すつもりでした:

lect.announce();

また、ドライバー クラスは実際には「Speaker」インターフェイスを実装する必要がないことに注意してください。次のステートメントのうち、最初の 2 つは事実上何も達成しません。

ref = poli;
ref = lect;
ref = past;
于 2012-11-25T04:34:21.930 に答える
2

各サブクラスに toString() メソッドを実装するだけです。

public String toString() {
    return this.name;
}

そんな感じ。print() は、このメソッドを呼び出して文字列を返します。

編集: 無視して、終了ビットを読みませんでした。

于 2012-11-25T04:34:15.580 に答える
0

これを修正するには、各クラスで toString() メソッドをオーバーライドする必要があります。この出力はオブジェクトのアドレスとタイプです。これは、Java がオブジェクトを文字列に変換する方法を認識していないためです。オブジェクトを印刷しようとするのではなく、 {object}.announce() を呼び出すつもりだったようです。

于 2012-11-25T04:36:22.370 に答える