2

我有4节课。一个是驱动类,一个是接口类和两个子类。这是接口类:

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

这些是两个子类:

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

另请注意,您的驱动程序类实际上不需要实现“扬声器”接口,以下语句中的前两个实际上什么也没做:

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 回答