abstract class Fruit{ //水果类
void eat(); //--------吃水果
}
abstract class Food{ //--------食物类
void consumer(); //------消费食物
}
class Apple extends Fruit{ //---苹果类继承水果类
public void eat(){
System.out.println("苹果被我吃了"); }
public Food getFood(){ // -----采用匿名内部类获取食物;
return new Food(){
public void consumer(){
System.out.println("食物被我吃了"); }
};
}
}
public class Person{
static void take(Fruit ft){ ft.eat(); }
static void take(Food fb){ fb.consumer(); }
public static void main(String[] args){
take(new Apple());
take(new Apple().getFood());
}
}
为什么编译时会在抽象类那个地方报错?谢谢你的解答。
看来你对java语法不太熟悉,
abstract class Fruit{ //水果类
void eat(); //--------吃水果
}
abstract class Food{ //--------食物类
void consumer(); //------消费食物
}
这样定义抽象类里面的方法是错误的,java里对类的修饰符只有默认为包访问权限,
你虽然在类前面加了abstract 以声明为抽象类,但你没有给方法加abstract以声明这是一个抽象方法,应该由子类实现,那么java是不会自动把抽象类中的方法解析为抽象方法,就以为是一个普通的方法,
有两种方式来解决这个问题
1.给方法加上abstract修饰符
abstract class Fruit{ //水果类
abstract void eat(); //--------吃水果
}
abstract class Food{ //--------食物类
abstract void consumer(); //------消费食物
}
2.给方法加上空方法体
abstract class Fruit{ //水果类
void eat(){} //--------吃水果
}
abstract class Food{ //--------食物类
void consumer(){} //------消费食物
}
在你的抽象类中的方法前面加上abstract即可。
因为抽象类并不一定就是说里面的方法也是抽象的,如果方法没有实现,应该在方法前面明确加上abstract关键字,这个也是抽象类和接口的区别之一。
[quote]return new Food(){
public void consumer(){
System.out.println("食物被我吃了"); }
};
} [/quote]
Food 是抽象类,貌似不能new 吧
[size=medium]如果是接口,就不需要加abstract关键字了,因为接口中的方法都是抽象方法,在编译的时候,默认就加上了。
但是抽象类就不同了,抽象类中可以没有抽象方法,但是如果有抽象方法,那么这个类的前面也一定要加上abstract关键字,否则就是出现编译错误。所以对于抽象类,如果里面的方法没有方法体,也就是没有实现,那么一定要在方法声明的前面加上abstract关键字。[/size]