Java 开发相关知识点回顾 (二)

java 中抽象类和接口的区别

在Java中,抽象类和接口是两种不同的概念,它们具有一些区别和用途。

  1. 定义方式:抽象类使用abstract关键字定义,并可以包含抽象方法和具体方法;接口使用interface关键字定义,并只能包含抽象方法和常量。

  2. 实现方式:一个类可以继承(extends)一个抽象类,并且可以实现(implements)多个接口。

  3. 构造函数:抽象类可以拥有构造函数,而接口不能有构造函数。

  4. 方法实现:抽象类中的方法可以有方法体(具体实现),也可以没有方法体,即抽象方法;接口中的方法只能是抽象方法,没有方法体。

  5. 多继承限制:Java中一个类只能继承一个父类,但可以实现多个接口。因此,接口更灵活,可以使类具有多态性。

  6. 字段:接口中的字段默认是public static final类型的常量,而抽象类没有这样的约束。

  7. 设计目的:抽象类用于表示一类对象的公共性质和行为,主要是为了代码重用;接口用于定义一组相关方法的规范,主要是为了实现多态。

总之,抽象类主要用于代码重用和继承关系,而接口主要用于实现类之间的多态性和规范定义。选择使用哪种方式取决于具体的需求和设计目标。
当我们使用抽象类和接口时,可以通过以下示例来说明它们的异同。

例子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(),并包含一个具体字段 nameDog 类继承了 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 接口,并提供了各自的计算面积和周长的实现。

总结:

  • 抽象类可以包含构造函数、具体方法和抽象方法,而接口只能包含抽象方法和常量。
  • 类可以继承一个抽象类,但可以实现多个接口。
  • 抽象类的字段可以直接访问和修改,而接口中的字段是常量,不可修改。
  • 抽象类用于表示一类对象的公共性质和行为,接口用于定义一组相关方法的规范和实现类之间的多态性。

为者常成,行者常至