以下是一个使用抽象类和接口的简单例子,以便对它们进行对比:
// 抽象类
abstract class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
// 抽象方法
public abstract void makeSound();
// 非抽象方法
public void sleep() {
System.out.println(name + " is sleeping.");
}
}
// 接口
interface Flyable {
void fly();
}
// 实现抽象类和接口
class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println(name + " says woof!");
}
}
class Bird extends Animal implements Flyable {
public Bird(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println(name + " chirps!");
}
@Override
public void fly() {
System.out.println(name + " is flying.");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Buddy");
Bird bird = new Bird("Sparrow");
dog.makeSound(); // 输出: Buddy says woof!
dog.sleep(); // 输出: Buddy is sleeping.
bird.makeSound(); // 输出: Sparrow chirps!
bird.sleep(); // 输出: Sparrow is sleeping.
bird.fly(); // 输出: Sparrow is flying.
}
}
在上面的例子中,抽象类Animal
定义了一个抽象方法makeSound()
和一个非抽象方法sleep()
。Dog
类继承了Animal
类并实现了makeSound()
方法,而Bird
类既继承了Animal
类又实现了Flyable
接口,因此需要提供makeSound()
和fly()
的具体实现。
抽象类Animal
提供了一个基本的动物行为,而接口Flyable
定义了飞行行为。通过继承抽象类和实现接口,子类可以根据需要选择性地扩展功能。
请注意,这只是一个简单的示例,用于演示抽象类和接口的基本用法和对比。在实际的开发中,抽象类和接口通常用于更复杂的情况下,以实现更高级的设计和代码重用。