首页常见问题正文

abstractclass和interface语法上有什么区别?

更新时间:2023-05-16 来源:黑马程序员 浏览量:

IT培训班

  在Java中,abstract class和interface都是用来定义抽象类型的关键字,但它们在语法上有几个重要的区别:

  1.实现方式

  abstract class是一种类,可以定义构造函数、成员变量和非抽象方法,也可以包含抽象方法,而interface只能定义常量和抽象方法,不能包含任何具体的实现。

  2.继承方式

  一个类可以继承多个接口,但只能继承一个抽象类。此外,抽象类可以作为其他类的基类,而接口不能。

  3.抽象方法

  在抽象类中可以定义抽象方法,它们必须在非抽象子类中实现。在接口中定义的所有方法都是抽象的,实现接口的类必须提供方法的实现。

1684200086931_abstractclass和interface语法上有什么区别.jpg

  4.默认实现

  从Java 8开始,接口可以定义默认方法,这些方法具有默认实现,可以被实现接口的类直接继承或覆盖。抽象类也可以定义具有默认实现的方法,但是默认实现必须是非抽象的。

  5.成员变量

  在抽象类中可以定义非常量成员变量,而在接口中只能定义常量(static final)变量。

  接下来,笔者用一段Java代码来详细演示下abstract class和interface之间的语法区别:

// 抽象类
abstract class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

    // 抽象方法,必须在非抽象子类中实现
    abstract void makeSound();

    // 非抽象方法,可以在抽象类中直接实现
    public void sleep() {
        System.out.println(name + " is sleeping.");
    }
}

// 接口
interface Swimable {
    // 常量
    int MAX_SPEED = 10;

    // 抽象方法
    void swim();
}

// 实现接口的类
class Fish implements Swimable {
    // 必须实现接口中定义的所有方法
    public void swim() {
        System.out.println("Fish is swimming.");
    }
}

// 继承抽象类的子类
class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    // 必须实现父类中定义的抽象方法
    void makeSound() {
        System.out.println(name + " is barking.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog("Puppy");
        animal.makeSound();
        animal.sleep();

        Swimable swimable = new Fish();
        swimable.swim();
        System.out.println("Max speed: " + Swimable.MAX_SPEED);
    }
}

  在这个例子中,Animal是一个抽象类,它有一个非抽象方法sleep和一个抽象方法makeSoundSwimable是一个接口,它定义了一个常量MAX_SPEED和一个抽象方法swimFish实现了Swimable接口,并提供了swim方法的具体实现。DogAnimal的子类,它实现了makeSound方法,并继承了sleep方法。在Main类中,我们创建了一个Dog对象和一个Fish对象,并调用了它们的方法。注意到在Swimable.MAX_SPEED这一行,我们直接通过接口名访问了接口中定义的常量。

分享到:
在线咨询 我要报名
和我们在线交谈!