百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

详解Java 抽象类和接口,分析其区别和应用场景

cac55 2024-09-20 12:42 34 浏览 0 评论

现在面试老是会被问八股文,偶尔就会有面试官问抽象类和接口的区别,今天来详细说说这两个玩意

一、抽象类

1.1 抽象类的定义

抽象类是面向对象编程中的一个概念,它是一个不能被实例化的类,只能被用作其他类的基类或父类。抽象类用于定义一组相关的方法,但这些方法没有具体的实现,而是由其子类来实现。

抽象类通常包含抽象方法(也称为纯虚方法),这些方法没有具体的实现代码,只是定义了方法的名称、参数列表和返回类型。子类必须实现这些抽象方法,否则子类也必须声明为抽象类。抽象方法的存在使得抽象类本身无法被实例化,因为它包含了未实现的方法。

抽象类可以包含非抽象的方法和属性,这些方法和属性可以有具体的实现代码。子类可以继承这些非抽象方法和属性,并且可以根据需要进行覆盖或扩展。

抽象类的主要目的是为了提供一种通用的基类,定义了一组共享的方法和属性,但具体的实现由子类来完成。通过使用抽象类,可以实现某种程度的代码重用和统一的接口定义。

在Java中,抽象类是通过使用关键字abstract来声明和定义的。下面是Java中定义抽象类的语法:

abstract class AbstractClassName {
    // 可包含抽象方法和非抽象方法、属性等成员
    // 抽象方法的声明
    // 非抽象方法的实现
    // 属性的定义
}


1.2 抽象类的特点




  • 抽象类不能被实例化:抽象类只能被用作其他类的基类或父类,不能直接创建对象。
  • 抽象类可以包含抽象方法:抽象方法没有具体的实现代码,只有方法的声明,需要在子类中进行实现。
  • 子类必须实现抽象方法:如果一个类继承了抽象类,那么它必须实现抽象类中所有的抽象方法,除非该子类也声明为抽象类。
  • 抽象类可以包含非抽象方法和属性:抽象类可以定义具体的方法和属性,供子类直接继承和使用。
  • 抽象类可以拥有构造方法:抽象类可以有构造方法,用于初始化抽象类的成员。
  • 子类继承抽象类:子类可以通过使用关键字extends来继承抽象类,并实现抽象类中的抽象方法。

1.3 抽象类的案例

  • 首先定义一个Animal是一个抽象类,包含了一个抽象方法makeSound()和一个非抽象方法getName()
/**
 * 抽象类:动物
 *
 * @author bamboo panda
 * @version 1.0
 * @date 2023/10/20 11:53
 */
public abstract class Animal {

    /**
     * 变量
     */
    private String name;

    /**
     * 构造函数
     *
     * @param name 名称
     */
    public Animal(String name) {
        this.name = name;
    }

    /**
     * 抽象方法:发出声音
     */
    public abstract void makeSound();

    /**
     * 获得名称
     *
     * @return 名称
     */
    public String getName() {
        return name;
    }

}


  • 定义Dog类是Animal的子类,它实现了makeSound()方法并调用了父类的getName()方法
/**
 * 实现类:狗
 *
 * @author bamboo panda
 * @version 1.0
 * @date 2023/10/20 11:58
 */
public class Dog extends Animal {

    /**
     * 构造函数
     *
     * @param name
     */
    public Dog(String name) {
        super(name);
    }

    /**
     * 实现方法
     */
    @Override
    public void makeSound() {
        System.out.println(getName() + " 汪汪叫");
    }

}
  • 写一个测试类
/**
 * 测试类
 *
 * @author bamboo panda
 * @version 1.0
 * @date 2023/10/20 12:01
 */
public class Test {

    public static void main(String[] args) {
        // 使用多态的方式来创建阿黄
        Animal animal = new Dog("阿黄");
        // 调用发出声音方法
        animal.makeSound();
    }

}

我们分析一下这个测试方法

Animal animal = new Dog("阿黄");:创建了一个Dog对象,并将其赋值给类型为Animal的变量animal。这是多态的一种表现形式,即将子类对象赋给父类类型的变量。

new Dog("阿黄"):创建了一个Dog对象,使用了Dog类的构造方法,并传入参数"阿黄"来初始化Dog对象的名称。

Animal animal =:将Dog对象赋值给类型为Animal的变量animal。这是由于子类对象可以赋值给父类类型的变量,这样做的好处是可以通过父类类型的变量来访问子类对象的方法和属性。

animal.makeSound();:调用animal变量所引用对象的makeSound()方法。由于animal的类型是Animal,而Animal类声明了makeSound()方法为抽象方法,因此实际上会调用Dog类中实现的makeSound()方法。

  • 输出结果
阿黄 汪汪叫

二、接口

2.1 接口的定义

接口是一种在面向对象编程中定义契约的方式,它定义了一组方法(包括抽象方法和默认方法)的规范,但没有具体的实现。接口提供了一种约定,用于描述类应该具有哪些方法,以及这些方法应该如何被调用。

在Java中,接口是通过使用关键字interface来声明和定义的。下面是Java中定义接口的语法:

interface InterfaceName {
    // 可包含抽象方法、默认方法、静态方法和常量等成员
    // 抽象方法的声明
    // 默认方法的实现
    // 静态方法的实现
    // 常量的定义
}

在接口的定义中,可以包含抽象方法、默认方法、静态方法和常量等成员。其中,抽象方法没有具体的实现代码,只有方法的声明;默认方法有默认的实现代码,可以在接口中直接提供默认的方法实现;

静态方法是接口的类方法,可以直接通过接口名调用;

常量是接口中的常量值,通常使用public static final修饰。

2.2 接口的特点



2.3 接口的案例

  • Animal是一个接口,定义了一个抽象方法makeSound()和一个默认方法sleep()
/**
 * 接口:动物
 *
 * @author bamboo panda
 * @version 1.0
 * @date 2023/10/20 11:53
 */
public interface Animal {

    /**
     * 抽象方法:发出声音
     */
    void makeSound();

    /**
     * 默认方法
     */
    default void sleep() {
        System.out.println("动物睡觉了");
    }

}
  • Dog类实现了Animal接口,并实现了makeSound()方法。
/**
 * 实现类:狗
 *
 * @author bamboo panda
 * @version 1.0
 * @date 2023/10/20 11:58
 */
public class Dog implements Animal {

    /**
     * 实现方法
     */
    @Override
    public void makeSound() {
        System.out.println("小狗汪汪叫");
    }

}
  • Test类中,我们创建了一个Dog对象,并调用了其方法。
/**
 * 测试类
 *
 * @author bamboo panda
 * @version 1.0
 * @date 2023/10/20 12:01
 */
public class Test {

    public static void main(String[] args) {
        // 使用多态的方式来创建阿黄
        Animal animal = new Dog();
        // 调用发出声音方法
        animal.makeSound();
    }

}
  • 输出结果
小狗汪汪叫

三、 抽象类和接口的区别

实际看了上面的内容,大致都分清楚了抽象类和接口的区别,下面我整体总结一下

特征

抽象类

接口

继承关系

可以被子类继承

可以被子类实现

构造方法

可以有构造方法

不能有构造方法

成员变量

可以有普通成员变量

只能有公共常量

继承和实现

一个类只能继承一个抽象类,但可以实现多个接口

一个类可以实现多个接口,但只能继承一个父类(包括抽象类)

方法声明与实现

可以包含方法声明和方法实现

只能包含方法声明,没有方法的具体实现

抽象级别

接口>抽象类>实现类


用途

主要用来抽象类别,表示具有共同特征的类的概念

主要用来抽象方法功能,表示具有共同行为的类的契约

关键字

使用关键字 abstract 定义

使用关键字 interface 定义

总结一下:

  • 抽象类用于表示具有共同特征的类的概念,可以包含方法的声明和实现,可以有构造方法和普通成员变量,一个类只能继承一个抽象类。
  • 接口用于表示具有共同行为的类的契约,只包含方法的声明,不能有构造方法和普通成员变量,一个类可以实现多个接口,但只能继承一个父类(包括抽象类)。
  • 抽象类的抽象级别低于接口,抽象类可以提供更多的实现细节,而接口提供了更大的灵活性和代码的松耦合性。
  • 抽象类使用关键字 abstract 定义,而接口使用关键字 interface 定义。

四、抽象类和接口的应用场景



抽象类的应用场景

  1. 定义类的层次结构:抽象类通常用于定义类的层次结构,将共享的属性和方法放在抽象类中,子类通过继承抽象类来获得这些共享的特性。
  2. 提供默认实现:抽象类可以包含抽象方法和具体方法。具体方法可以提供默认的实现,子类可以直接继承并使用这些具体方法,减少了代码的重复性。
  3. 增加扩展性:抽象类可以定义抽象方法,子类必须实现这些抽象方法,从而强制子类具备某种行为。这样可以增加代码的可扩展性和灵活性。

接口的应用场景

  1. 定义规范和契约:接口用于定义一组相关的操作,描述了类应该具备的能力和行为。通过实现接口,类承诺满足接口中定义的规范和契约,从而实现了代码的解耦和模块化。
  2. 实现多继承:由于Java的单继承限制,接口提供了一种实现类之间多态性的机制。一个类可以实现多个接口,从而具备多个接口定义的能力和行为,实现了类的多继承。
  3. 提供标准化的功能:接口常用于定义标准化的功能和服务,例如Java中的Comparable接口用于定义比较对象的标准,Runnable接口用于定义可执行的任务。

五、总结

抽象类和接口在面向对象编程中发挥着不同的作用,根据需求和设计目标的不同,可以选择使用其中之一或两者结合来实现代码的抽象和封装。

特别是在设计模式里面,对于接口和抽象类有大量的应用方法,可以去好好学习。


作者:竹子爱揍功夫熊猫
链接:https://juejin.cn/post/7291846601650815017

相关推荐

14款健身APP蹿红 看看下载最多的是哪款?

Zombies,Run!($3.99,安卓,iOS)如果你的运动理念是:除非有人追,否则绝不跑起来,那么这款APP应该适合你。Zombies,Run!这款程序把单调的跑步过程变身为躲避僵尸的游戏...

微软官方彩蛋庆祝《回到未来》纪念日

2015年10月21日,是MartyMcFly和Brown博士回到未来的时间。现在,这一天真的到了,那么当时影片中展示的一些科技产品究竟有多少实现了呢?作为一家走在技术前沿的公司,日前,微软就在M...

时尚圈最潮同志情侣 帅到没朋友(同志情侣微信头像)

来源:MSN时尚综合|2015-03-0419:45:15男演员ZacharyQuinto(中)与男模MilesMcMillan(右)于纽约街头公开热吻。情人节这个拥有不同起源传说,最早可以...

IE浏览器阻止过期ActiveX控件或将影响网银的使用

IE浏览器网银IE浏览器网银如果经常使用IE浏览器浏览网页的用户,可能都有遇到过浏览器窗口提示安装ActiveX控件的情况,一般情况下用户也是会选择直接安装。ActiveX控件广义上是指微软公司的整...

如何使Microsoft Band连接到WP设备

如果你幸运地购买到了MicrosoftBand,那么恭喜你。现在我们(winbeta)推出了“帮助系列”,那些尚未买到MicrosoftBand的朋友可以了解设备的一些新功能,以及设备的其他关键特...

毕业生不得不看的五大骗局全揭秘(毕业生防骗)

目前,距离高校大学生毕业已不足100天,大部分毕业生都十分忙碌。论文定稿、答辩,参加招聘、面试等成了应届毕业生的头等大事。但随着毕业季的临近,不法分子专门针对毕业生的诈骗高发期也随之来临。360手机安...

菠萝觅生活是O2O应用流量入口最大的供应商

现在主流的传统O2O生活服务,他们其实都有一个共通点,那就是各行其道。打车有快的,滴滴,外卖有饿了么,买机票有去哪儿网…每个APP都有着自己的核心竞争力。而用户呢?既想拥有海量有趣应用,又担心占用过多...

WP8.1版MSN健康应用,现已支持锁屏计步

IT之家(www.ithome.com):WP8.1版MSN健康应用,现已支持锁屏计步@WP之家报道,微软今天已将必应系列应用品牌归为MSN,除此之外,WP8.1版MSN健康和天气应用也获得一些新的...

短信就能传播手机病毒?看完推理惊呆了!

很多人都收到过一种带网址的陌生短信,有的人会点击网址看看,有的还会在好奇心驱使下回复短信。近日《北京新发现》栏目报道了一起离奇的电信诈骗案,事主耿先生的银行卡从未离身,但是在收到一条带网址的陌生短信,...

微软OneClip:我承包了你的剪贴板(微软onedrive云空间)

不久前,Twitter用户WalkingCat曝光了微软一款名为OneClip的应用。这是一款剪贴板应用,根据描述这款应用将覆盖Windows10(包括桌面和移动)、iOS和Android平台,可以...

Windows 10手机应该是什么样?微博用户给出了概念图

随着Windows10发布的不断临近,WindowsPhone的用户对Windows10的旗舰手机的期望也越来越高,我们WP中文网也在微博上发出了同样的问题,搜集用户对Windows10的硬...

云管家出席武汉2015年支付宝O2O生态峰会

2月4日,蚂蚁金服O2O生态峰会在武汉启幕。此次峰会展现了2015年蚂蚁金服在O2O领域的开放思路和策略,以及合作伙伴对O2O的创新观念及思路分享,吸引了武汉近3000名企业大佬、众多创业者、第三方服...

微软将于下周开启Windows开发中心帐号迁移工作

自下周开始微软将启动Windows开发中心的帐号迁移工作。根据WindowsBuildingApps博客透露Windows开发中心帐号迁移工作将会分为几个阶段。首个阶段从下周开始持续到今年7月份...

如何解绑已经合并的MSN账户和Skype账户?

如果您绑定的账户已经充值,建议您把产品消耗完毕后,再进行解绑。当您需要解绑合并的账户时,可登入Skype点卡账户自助操作。输入Skype或MSN账号、密码登录账户:登录后,可在页面左下角选择语言"中文...

微博账号已显示所属MCN机构,成为目前第二个上线该功能的平台

7月25日,多位网友发现,部分微博大V的个人主页已经显示其所属的MCN机构名称,微博也成为目前第二个上线该功能的平台。【来源:中新经纬】声明:此文版权归原作者所有,若有来源错误或者侵犯您的合法权益,您...

取消回复欢迎 发表评论: