• 接口和抽象类的区别详解


    下面是用表格形式体现接口和抽象类的区别:

    接口(Interface)抽象类(Abstract Class)
    定义用关键字 interface 定义用关键字 abstract class 定义
    继承关系接口只能继承其他接口抽象类可以继承其他类或抽象类
    构造函数接口不能有构造函数抽象类可以有构造函数
    字段接口不能包含字段抽象类可以包含字段
    方法接口只能定义公共抽象方法,没有具体实现抽象类可以定义公共抽象方法和具体方法
    实现类通过 implements 关键字实现接口类通过 extends 关键字继承抽象类
    多重继承类可以实现多个接口类只能继承一个抽象类
    使用场景用于描述对象具有的能力或行为用于作为多个类的公共基类,提供共享的字段和方法
    灵活性接口提供更大的灵活性,类可以实现多个接口抽象类提供较高的灵活性,可以包含具体方法的实现和共享的字段,但类只能继承一个抽象类
    设计理念强调“做什么”强调“是什么”,更加关注对象的内部实现和共享行为的细节

    当用代码表示接口和抽象类的区别时,可以通过示例来说明:

    1. 接口(Interface)的示例代码:
    interface Animal {
        void eat();
        void sleep();
    }
    
    class Dog implements Animal {
        @Override
        public void eat() {
            System.out.println("Dog is eating.");
        }
        
        @Override
        public void sleep() {
            System.out.println("Dog is sleeping.");
        }
    }
    
    class Cat implements Animal {
        @Override
        public void eat() {
            System.out.println("Cat is eating.");
        }
        
        @Override
        public void sleep() {
            System.out.println("Cat is sleeping.");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Animal dog = new Dog();
            dog.eat();
            dog.sleep();
            
            Animal cat = new Cat();
            cat.eat();
            cat.sleep();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在上面的示例中,接口Animal定义了eat()sleep()两个方法的签名,而DogCat类实现了Animal接口,并提供了相应的具体实现。通过实现接口,DogCat类都必须实现eat()sleep()方法。

    1. 抽象类(Abstract Class)的示例代码:
    abstract class Shape {
        protected String name;
        
        public Shape(String name) {
            this.name = name;
        }
        
        public abstract double getArea();
        
        public void printName() {
            System.out.println("Shape: " + name);
        }
    }
    
    class Rectangle extends Shape {
        private double width;
        private double height;
        
        public Rectangle(String name, double width, double height) {
            super(name);
            this.width = width;
            this.height = height;
        }
        
        @Override
        public double getArea() {
            return width * height;
        }
    }
    
    class Circle extends Shape {
        private double radius;
        
        public Circle(String name, double radius) {
            super(name);
            this.radius = radius;
        }
        
        @Override
        public double getArea() {
            return Math.PI * Math.pow(radius, 2);
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Shape rectangle = new Rectangle("Rectangle", 3, 4);
            rectangle.printName();
            System.out.println("Area: " + rectangle.getArea());
            
            Shape circle = new Circle("Circle", 5);
            circle.printName();
            System.out.println("Area: " + circle.getArea());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    在上面的示例中,抽象类Shape定义了一个抽象方法getArea()和一个具体方法printName(),通过继承抽象类,RectangleCircle类都必须实现getArea()方法,并可以选择覆盖printName()方法。抽象类Shape也可以有字段和构造函数等。

    这两个示例代码展示了接口和抽象类的使用方式和区别。接口强调行为的约定和规范,类实现接口需遵循接口定义的方法;抽象类则可以包含具体的方法实现和共享的字段,子类可以选择性地实现抽象方法。

    总的来说,接口(Interface)和抽象类(Abstract Class)是面向对象编程中的两种常见的实现抽象的方式,它们之间有一些区别。

    1. 定义方式:接口是一种纯抽象的类,只定义了一组方法的签名,没有任何实现代码。抽象类是一个可以包含具体方法实现和抽象方法的类,可以有字段、属性、构造函数等。

    2. 多继承:一个类可以实现(implement)多个接口,但只能继承(extend)一个抽象类。接口的多继承使得类可以具备多个不同特性,促进了代码的灵活性。

    3. 实现方式:接口的方法都是公开的,没有实现代码,实现接口的类必须实现接口中定义的所有方法。抽象类可以包含具体的方法实现,子类可以选择性地覆盖抽象方法。

    4. 使用场景:接口用于描述一组相关的操作,强调类的行为约定,常用于定义插件、服务、组件的规范。抽象类用于对一组具有相同特性的类进行抽象,强调类的共性,常用于代码的复用和扩展。

    接口是一种更为纯粹的抽象形式,用于定义行为约定,而抽象类则是一种更为灵活的方式,在一定程度上融合了抽象和具体实现。

  • 相关阅读:
    Windows 10 无法访问某文件夹无法访问(如C:\Documents and Settings)。拒绝访问。解决方法
    IDEA运行项目报错:Command line is too long的解决办法
    “Awk”shell脚本三剑客
    基础算法之递归
    new、express new、operator new、placement new 之间的千丝万缕
    第4篇 熊猫烧香逆向分析(中)
    基于Part Affinity Fields的姿态估计后处理笔记
    远程桌面软件是否支持远程访问远程网络监控系统
    【CTF Web】CTFShow 数据库恶意下载 Writeup(目录扫描+mdb文件泄露+Access脱库)
    Spring框架(一)
  • 原文地址:https://blog.csdn.net/drhnb/article/details/133929237