java接口跟抽象类的区别:

本文介绍了Java中接口和抽象类在实现解耦、代码复用和继承方面的差异。接口用于定义行为契约,支持多继承,而抽象类提供基础实现。通过Shape和Animal类的例子展示了两者在实际编程中的应用。
摘要由CSDN通过智能技术生成

区别简介:

Java中的接口和抽象类都可以用于实现类之间的解耦和代码复用,但它们有一些重要的区别。

  1. 实现方式:接口是一种完全抽象的类,它只能定义方法和常量,不能包含字段和方法实现。抽象类是一个可以包含抽象方法和具体方法实现的类,它可以拥有字段和构造器。

  2. 继承关系:类只能继承一个抽象类,但可以实现多个接口。这意味着一个类可以通过实现多个接口获得更多的灵活性。

  3. 使用场景:接口主要用于定义类的契约,规定了类应该实现的方法。它们通常用于实现多继承和实现类之间的解耦。抽象类则更适用于提供类的基本实现和提供通用的方法。

  4. 方法实现:接口中的方法默认是公共的抽象方法,需要实现类实现并提供具体的实现。抽象类中的方法可以是抽象的或具体的,子类可以选择性地覆盖抽象方法。

总的来说,接口更适用于定义类之间的契约和实现多继承,而抽象类更适用于提供具体实现和提供通用方法。选择使用哪种方式取决于你的需求和设计目标。

代码示例:

当我们需要定义一个形状(Shape)的接口,其中包含计算面积(getArea)和计算周长(getPerimeter)的方法:

public interface Shape {
    double getArea();
    double getPerimeter();
}

我们可以定义圆(Circle)类和矩形(Rectangle)类来实现这个接口:

public 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;
    }
}

public class Rectangle implements Shape {
    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double getArea() {
        return width * height;
    }

    @Override
    public double getPerimeter() {
        return 2 * (width + height);
    }
}

另一方面,当我们需要定义一个动物(Animal)的抽象类,其中包含发出声音的抽象方法(makeSound)和一个普通方法(move):

public abstract class Animal {
    public abstract void makeSound();
    
    public void move() {
        System.out.println("Animal is moving");
    }
}

我们可以定义狗(Dog)类和猫(Cat)类来继承这个抽象类:

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Dog is barking");
    }
}

public class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Cat is meowing");
    }
}

通过这些例子,可以看到接口通过实现多继承的方式来让类具有某些行为,而抽象类提供了一种基本的实现和通用方法,子类可以选择性地进行扩展或覆盖。

PS:抽象方法必须被实现类重写,否则这个实现类也必须声明为抽象类

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值