// 抽象类
abstract class Animal {
String name;
// 构造函数
public Animal(String name) {
this.name = name;
}
// 普通方法
public void eat() {
System.out.println(name + " is eating.");
}
// 抽象方法
public abstract void move();
}
// 继承抽象类
class Dog extends Animal {
// 构造函数
public Dog(String name) {
super(name);
}
// 实现抽象方法
@Override
public void move() {
System.out.println(name + " is running.");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Buddy");
dog.eat(); // 输出:"Buddy is eating."
dog.move(); // 输出:"Buddy is running."
// 抽象类不能实例化,会报错
// Animal a = new Animal();
}
}
在这个例子中,我们定义了一个抽象类Animal。
我们还定义了一个Dog类,它继承自Animal。
Dog类必须实现Animal类中定义的抽象方法move,并提供具体的实现代码(打印出name + " is running.")。
在Main类中,我们创建了一个Dog对象,并调用它的eat和move方法。eat方法使用了抽象类中的默认实现,而move方法使用了Dog类中的具体实现。
这个例子包含了抽象类的所有特性:抽象方法、默认实现、必须实现、继承等。
它展示了如何使用抽象类来定义一个通用的类,并由子类提供具体的实现。
总之,Java中的抽象类是一种不能被实例化的类,它定义了其他类的通用接口和行为。使用抽象类可以提供代码的规范性和灵活性,强制子类实现抽象方法,从而提高代码的可靠性和可维护性。在使用抽象类时,需要注意抽象类不能被实例化、子类必须实现所有抽象方法等事项。
选择抽象类还是接口,取决于具体的需求。如果需要定义一些通用的行为和属性,并且希望提供默认的实现,可以使用抽象类。如果需要定义一组完全抽象的行为,并且希望不同的类以不同的方式来实现这些行为,可以使用接口。通常情况下,接口更适合用于实现多态性和松耦合的设计。