Java 开发相关知识点回顾 (二)
java 中抽象类和接口的区别
在Java中,抽象类和接口是两种不同的概念,它们具有一些区别和用途。
-
定义方式:抽象类使用
abstract
关键字定义,并可以包含抽象方法和具体方法;接口使用interface
关键字定义,并只能包含抽象方法和常量。 -
实现方式:一个类可以继承(
extends
)一个抽象类,并且可以实现(implements
)多个接口。 -
构造函数:抽象类可以拥有构造函数,而接口不能有构造函数。
-
方法实现:抽象类中的方法可以有方法体(具体实现),也可以没有方法体,即抽象方法;接口中的方法只能是抽象方法,没有方法体。
-
多继承限制:Java中一个类只能继承一个父类,但可以实现多个接口。因此,接口更灵活,可以使类具有多态性。
-
字段:接口中的字段默认是
public static final
类型的常量,而抽象类没有这样的约束。 -
设计目的:抽象类用于表示一类对象的公共性质和行为,主要是为了代码重用;接口用于定义一组相关方法的规范,主要是为了实现多态。
总之,抽象类主要用于代码重用和继承关系,而接口主要用于实现类之间的多态性和规范定义。选择使用哪种方式取决于具体的需求和设计目标。
当我们使用抽象类和接口时,可以通过以下示例来说明它们的异同。
例子1:动物类
// 抽象类 Animal
abstract class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
public abstract void sound();
}
// 接口 Jumpable
interface Jumpable {
void jump();
}
// 实现类 Dog
class Dog extends Animal implements Jumpable {
public Dog(String name) {
super(name);
}
@Override
public void sound() {
System.out.println(name + " is barking.");
}
@Override
public void jump() {
System.out.println(name + " is jumping.");
}
}
// 实现类 Cat
class Cat extends Animal {
public Cat(String name) {
super(name);
}
@Override
public void sound() {
System.out.println(name + " is meowing.");
}
}
在上述示例中,Animal
是一个抽象类,它定义了一个抽象方法 sound()
,并包含一个具体字段 name
。Dog
类继承了 Animal
抽象类,并同时实现了 Jumpable
接口,实现了 sound()
和 jump()
方法。Cat
类仅继承了 Animal
抽象类,并实现了 sound()
方法。
通过这个例子,我们可以看到抽象类可以包含构造函数、具体方法和抽象方法,而接口只能包含抽象方法。类可以继承一个抽象类,并实现多个接口。这允许我们在 Dog
类中同时继承抽象类和实现接口。另外,抽象类的字段是可以直接访问和修改的,而接口中的字段是常量,是不可修改的。
例子2:图形计算
// 接口 Shape
interface Shape {
double getArea();
double getPerimeter();
}
// 实现类 Circle
class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
@Override
public double getPerimeter() {
return 2 * Math.PI * radius;
}
}
// 实现类 Rectangle
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 getArea() {
return length * width;
}
@Override
public double getPerimeter() {
return 2 * (length + width);
}
}
在这个例子中,Shape
是一个接口,它定义了两个抽象方法 getArea()
和 getPerimeter()
。Circle
类和 Rectangle
类分别实现了 Shape
接口,并提供了具体的方法实现。
通过这个例子,我们可以看到接口可以用于规范一组相关方法的定义,而这些方法可以由不同的类进行实现。Circle
类和 Rectangle
类都实现了 Shape
接口,并提供了各自的计算面积和周长的实现。
总结:
- 抽象类可以包含构造函数、具体方法和抽象方法,而接口只能包含抽象方法和常量。
- 类可以继承一个抽象类,但可以实现多个接口。
- 抽象类的字段可以直接访问和修改,而接口中的字段是常量,不可修改。
- 抽象类用于表示一类对象的公共性质和行为,接口用于定义一组相关方法的规范和实现类之间的多态性。
为者常成,行者常至
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)