程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

抽象类和接口的区别(java抽象类和接口的区别)

balukai 2025-04-05 16:57:21 文章精选 4 ℃

首先,从概念上来说,接口是对动作的抽象,只定义方法,不提供实现,它关注的是一个类能做什么。抽象类,即Abstract修饰的类,是对根源的抽象,既可以定义抽象方法,也可以提供方法的具体实现,它关注的是这个类是什么。抽象类是对象的抽象,接口是一种行为规范。

其次,从使用上来说,接口和抽象类都不能被实例化,抽象类用来被继承,接口用来被实现,Java中遵循单继承多实现,继承一个类实现多个接口。抽象类可以包含普通方法,也可以包含抽象方法,提供了更多的灵活性,但也带来了更高的定义代价,而接口只能定义方法的方法名,参数列表,返回类型,不关心具体细节,只是一个方法体,其中所有的方法都是抽象的。

此外,接口和抽象类在定义方法、属性、构造器和初始化块等方面也存在一些区别。接口中只能定义抽象方法和静态常量属性,声明方法必须用public来修饰(默认public),静态常量只能用public static final修饰,不能定义普通属性和方法。抽象类可以定义方法、属性和静态常量属性,还可以包含构造器和初始化块。抽象类中的成员变量可以被public private protected final等不同的修饰符来修饰。抽象类不能被实例化只能被继承,包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法,抽象类中的抽象方法只有方法体,没有具体实现。构造方法不能用于实例化,主要用途是被子类调用由于抽象类的构造函数在实例化派生类之前发生,可以在这个阶段初始化抽象类字段或执行其它与子类相关的代码。这些差异使得接口和抽象类在使用场景和功能上有所不同。

抽象类


// 定义一个抽象类
public abstract class Animal {

    // 抽象方法,没有具体实现
    public abstract void makeSound();

    // 普通方法,有具体实现
    public void eat() {
        System.out.println("Animal is eating.");
    }
}

// 定义一个类,继承自Animal抽象类,并实现makeSound方法
public class Dog extends Animal {

    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }

    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.makeSound(); // 输出:Woof!
        dog.eat(); // 输出:Animal is eating.
    }
}

接口

//接口
public interface Speakable {

    //抽象方法,默认public
    void speak();

    //默认方法
    defalut void defalutMethod(){
      System.out.println("this is a defalut method in the interface!");
      }

    //静态方法
    static void staticMethod(){
      System.out.println("this is a static method in the interface!");
    }
}

//实现类
public class Person implements Speakable {

    @Override
    public void speak() {
        System.out.println("Hello!");
    }

    //可以选择重写默认方法,也可以不重写使用接口中的默认实现
    @Override
    defalut void defalutMethod(){
      System.out.println("Overriding defalut method in the implementing class");
    }

    public static void main(String[] args) {
        Person person = new Person();
        person.speak(); //输出:Hello!
        //接口中的静态方法直接通过接口名来调用
        Speakable.staticMethod(); 
    }
}

从Java 8开始,接口也可以包含默认方法(default methods)和静态方法(static methods)。抽象类不能被实例化,而接口也不能被实例化,但可以通过匿名内部类或Lambda表达式来实现接口的实例。

最近发表
标签列表