抽象类和接口是Java中两种不同的机制,它们都可以用来实现多态性和封装性,但在用法和特性上有一些不同。
1. 抽象类(Abstract Class):
- 抽象类可以包含抽象方法和非抽象方法。
- 抽象类可以有构造方法和成员变量。
- 一个类只能继承一个抽象类。
- 抽象类用于描述一种“is-a”的关系。
下面是一个抽象类的示例代码:
abstract class Animal {
String name;
public Animal(String name) {
this.name = name;
}
abstract void makeSound();
void eat() {
System.out.println(name + " is eating");
}
}
class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
void makeSound() {
System.out.println(name + " is barking");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog("Buddy");
dog.makeSound();
dog.eat();
}
}
2. 接口(Interface):
- 接口只能包含抽象方法和常量。
- 接口不能有构造方法和成员变量。
- 一个类可以实现多个接口。
- 接口用于描述一种“has-a”的关系。
下面是一个接口的示例代码:
interface Shape {
double calculateArea();
double calculatePerimeter();
}
class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
@Override
public double calculatePerimeter() {
return 2 * Math.PI * radius;
}
}
class Rectangle implements Shape {
private double length;
private double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
public double calculateArea() {
return length * width;
}
@Override
public double calculatePerimeter() {
return 2 * (length + width);
}
}
public class Main {
public static void main(String[] args) {
Shape circle = new Circle(5);
System.out.println("Circle area: " + circle.calculateArea());
System.out.println("Circle perimeter: " + circle.calculatePerimeter());
Shape rectangle = new Rectangle(4, 6);
System.out.println("Rectangle area: " + rectangle.calculateArea());
System.out.println("Rectangle perimeter: " + rectangle.calculatePerimeter());
}
}
在上面的示例中,抽象类Animal和接口Shape分别展示了抽象类和接口的特性和用法。通过这些示例代码,可以更清楚地理解抽象类和接口的区别。