是我们教材上的一个试验题目,题目如下,希望高手些给写下,如果可以能给我写点有助于理解的注释就更好了,谢谢! [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();
}
} 那个知道的朋友给我个比较完善的答案好吗?谢谢,对接口的理解我还不是很深入,希望能给我点帮助.
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();
}
} 那个知道的朋友给我个比较完善的答案好吗?谢谢,对接口的理解我还不是很深入,希望能给我点帮助.
public String toString() {
return this.getClass().getName();//或者是getSimpleName();
}'task.Orange@1b67f74
@前面是类全名,后面是hashCode值,可以认为它与内存地址相关。
默认是object 类的toString方法。重写toString方法,以返回类名是对于新建的类 重写toString方法,以返回类名比如Orange类 返回Orange
而不是Orange@1b67f74
返回该对象的字符串表示。
public String toString()返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂。建议所有子类都重写此方法。
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于: getClass().getName() + '@' + Integer.toHexString(hashCode())
返回:
该对象的字符串表示形式。
重写toString方法,以返回类名
public String toString() {
return this.getClass().getName();
}
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楼写的很详细!
下面是我写的代码,但是总是有问题的,不晓得怎么的
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楼的朋友 谢谢!
[color={0}]toString()[/color]每个类中有STRING,不需要参数。在说System.out.println(ob.toString());里怎么没参数的?
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);
} 仅供参考