是我们教材上的一个试验题目,题目如下,希望高手些给写下,如果可以能给我写点有助于理解的注释就更好了,谢谢! [1],创建接口Eatable. 
public interface Eatable{ 
    public void howToEat(); 

[2],创建下列两组类,每种可以吃的对象必须要能够实现Eatable接口. 
 创建Anmimal类及其子类Tiger,Chicken和Elephant,其中Chicken类必须实现Eatable接口. 
 创建Fruit类及其子类Apple和Orange,因为水果可以吃,所以类Fruit要实现Eatable接口.在Fruit类中,给出了howToEat方法的通用实现,在Apple类和Orange类中,给出howToEat方法的特殊实现. 
[3]在每个类中重写toString方法,以返回类名.(这个我没有理解,重点就是这个.谢谢) 
[4]创建测试程序,包含main方法和showObject方法.在main方法声明和创建Object类型的四个实例,分别为老虎,小鸡,苹果和桔子.然后调用showObject方法小时对象.(这里我的输出就不对了,看不明白是什么东西-- 'task.Orange@1b67f74 ',麻烦解释下,再次表示感谢!)下面是给出的showObject方法. public static void showObject(Object ob){ 
    System.out.println(ob); 
    if(ob instanceof Eatable){ 
        ((Eatable)ob).howToEat(); 
    } 
} 那个知道的朋友给我个比较完善的答案好吗?谢谢,对接口的理解我还不是很深入,希望能给我点帮助. 

解决方案 »

  1.   

    'task.Orange@1b67f74  是在内存的地址
      

  2.   

    [3],意思是在每个类中重写
    public String toString() {
      return this.getClass().getName();//或者是getSimpleName();
    }'task.Orange@1b67f74  
    @前面是类全名,后面是hashCode值,可以认为它与内存地址相关。
      

  3.   

    [3]在每个类中重写toString方法,以返回类名.(这个我没有理解,重点就是这个.谢谢)  
      默认是object 类的toString方法。重写toString方法,以返回类名是对于新建的类 重写toString方法,以返回类名比如Orange类 返回Orange
    而不是Orange@1b67f74  
      

  4.   

    类 ObjecttoString() 
              返回该对象的字符串表示。
      

  5.   

    类 Object toString()
    public String toString()返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂。建议所有子类都重写此方法。 
    Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于: getClass().getName() + '@' + Integer.toHexString(hashCode())
     
    返回:
    该对象的字符串表示形式。
    重写toString方法,以返回类名
    public String toString() { 
      return this.getClass().getName();

      

  6.   

    [1]
    public interface Eatable{  
        public void howToEat();  
    }
    [2] ,[3]
    public class Anmimal {
    public String toString(){
    return "Anmimal";
    }
    }public class Tiger extends Anmimal{
    public String toString(){
    return "Tiger";
    }
    }public class Chicken extends Anmimal implements Eatable {
    public String toString(){
    return "Chicken";
    }
    public void howToEat(){
    System.out.println("肯德基");
    }
    }public class Elephant extends Anmimal{
    public String toString(){
    return "Elephant";
    }
    }public class Fruit implements Eatable {
       public void howToEat(){
    System.out.println("水果可以生吃");
    }
    public String toString(){
    return "Furit";
    }
    }public class Apple extends Furit {
    public void hotToEat(){
    System.out.println("大口咬着吃");
    }
    public String toString(){
    return "Apple";
    }
    }public class Orange extends Furit {
    public void hotToEat(){
    System.out.println("剥掉皮吃");
    }
    public String toString(){
    return "Orange";
    }
    }[3]每个JAVA类默认都是继承Object类的,Object类有个toString方法,这里让你重写toString方法,返回类名。
       我再上边的实现中已经重写了该方法。 
    [4]"task.Orange@1b67f74"代表了类的名称和类的地址。下面是测试程序代码:
    class Test {
    public static void showObject(Object ob){  
         System.out.println(ob);  
         if(ob instanceof Eatable){  
              ((Eatable)ob).howToEat();  
         }  
    } public static void main(String[] args){
    Object tiger=new Tiger();
    Object chicken=new Chicken();
    Object apple=new Apple();
    Object orange=new Orange();
    showObject(tiger);  
    showObject(chicken); 
    showObject(apple); 
    showObject(orange);
    }
      

  7.   

    刚学JAVA 学习ing
    7楼写的很详细!
      

  8.   

    不好意思,这几天太忙了,没有来看帖子,谢谢上面的朋友给的详细的答案!还有8楼的朋友说的是,我会记住你说的话,谢谢!
    下面是我写的代码,但是总是有问题的,不晓得怎么的
    package task;public interface Eatable {
    public void howToEat();
    }class Animal implements Eatable{
    boolean eatable;
    String howToEat = "";
    public void howToEat(){
    }

    String toString(Object ob){
    return "Animal";
    }
    }class Fruit implements Eatable{
    boolean eatable;
    String howToEat = "";
    public void howToEat(){
    eatable = true;
    howToEat = "";
    }

    String toString(Object ob){
    return "Fruit";
    }
    }class Tiger extends Animal{
    public void howToEat(){
    eatable = false;
    howToEat =  "不能吃";
    }

    String toString(Object ob){
    return "Tiger";
    }
    }class Chicken extends Animal{
    public void howToEat(){
    eatable = true;
    howToEat =  "煮来吃";
    }

    String toString(Object ob){
    return "Chicken";
    }
    }class Elephant extends Animal{
    public void howToEat(){
    eatable = false;
    howToEat =  "不能吃";
    }

    String toString(Object ob){
    return "Elphant";
    }
    }class Apple extends Fruit{
    public void howToEat(){
    eatable = true;
    howToEat = "削皮吃";
    }

    String toString(Object ob){
    return "Apple";
    }
    }class Orange extends Fruit{
    public void howToEat(){
    eatable = true;
    howToEat = "剥皮吃";
    }

    String toString(Object ob){
    return "Orange";
    }
    }测试代码如下public class Test{
    public static void main(String args[]){
    Tiger aTig = new Tiger();
    Chicken aChi = new Chicken();
    Elephant aEle = new Elephant();
    Apple aApp = new Apple();
    Orange aOra = new Orange();
    Test.showObject(aOra);
    Test.showObject(aEle);
    Test.showObject(aChi);
    Test.showObject(aApp);
    Test.showObject(aTig);
    }

    public static void showObject(Object ob){
    System.out.println(ob.toString());
    if(ob instanceof Eatable){
     ((Eatable)ob).howToEat();
    }
    }
    }非常感谢7,8楼的朋友 谢谢!
      

  9.   


    [color={0}]toString()[/color]每个类中有STRING,不需要参数。在说System.out.println(ob.toString());里怎么没参数的?
      

  10.   

    LZ的代码太冗余
    1 没必要在每个类都写toString方法,只需要在相应的父类写就可以了
    public String toString() {  
      return this.getClass().getName(); 
    }  
    子类继承父类,子类也拥有这个toString方法的2 水果类定义了共通吃法,因该在相应的子类调用一下super.howToEat(),然后再追加特殊的吃法。3 eatable作为一个属性,没必要在howToEat里每次设定,应该在构造函数里设定,然后可以追加一个isEatable的方法用于判断是否能吃4 LZ的howToEat属性和howToEat方法同名,这样没法区分是调用属性还是调用方法了。5 LZ之所以没有测试成功,是因为LZ写的toString方法并没有覆盖Object的toString方法,把你的toString方法的参数去掉。class Fruit implements Eatable{ 
    boolean eatable; 
    String eatMethod; 
    public Fruit() {
        eatable = true;
        eatMathod = "生吃"; //属性不要跟方法同名
    }
    public void howToEat(){ 
        System.out.println("共同吃法:"+eatMathod); 
    } String toString(){ //这里不要参数
        return this.getClass.getName(); //这样子类就可以不用写这个方法了
    } boolean isEatable() {
        return eatale;
    }
    } class Apple extends Fruit{
    String eatMethod; //这个区分于父类的属性 
    public Apple() {
        super();
        eatMethod = "削皮吃"; 
    }
    public void howToEat(){ 
        super().howToEat();
        System.out.println("特殊吃法:" + eatMethod);
    } 仅供参考