日期:2014-05-20  浏览次数:20772 次

J2SE中关于接口的问题
是我们教材上的一个试验题目,题目如下,希望高手些给写下,如果可以能给我写点有助于理解的注释就更好了,谢谢! 

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


那个知道的朋友给我个比较完善的答案好吗?谢谢,对接口的理解我还不是很深入,希望能给我点帮助. 


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

getClass().getName() + '@' + Integer.toHexString(hashCode())
 
返回:
该对象的字符串表示形式。


重写toString方法,以返回类名
public String toString() { 
return this.getClass().getName();


------解决方案--------------------
[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);
}
}
------解决方案--------------------
LZ的代码太冗余
1 没必要在每个类都写toString方法,只需要在相应的父类写就可以了
public String toString() {
return this.getClass().getName(); 
}
子类继承父类,子类也拥有这个toString方法的

2 水果类定义了共通吃法,因该在相应的子类调用一下super.howToEat(),然后再追加特殊的吃法。