详解Java 抽象类和接口,分析其区别和应用场景
cac55 2024-09-20 12:42 30 浏览 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 定义。
四、抽象类和接口的应用场景
抽象类的应用场景:
- 定义类的层次结构:抽象类通常用于定义类的层次结构,将共享的属性和方法放在抽象类中,子类通过继承抽象类来获得这些共享的特性。
- 提供默认实现:抽象类可以包含抽象方法和具体方法。具体方法可以提供默认的实现,子类可以直接继承并使用这些具体方法,减少了代码的重复性。
- 增加扩展性:抽象类可以定义抽象方法,子类必须实现这些抽象方法,从而强制子类具备某种行为。这样可以增加代码的可扩展性和灵活性。
接口的应用场景:
- 定义规范和契约:接口用于定义一组相关的操作,描述了类应该具备的能力和行为。通过实现接口,类承诺满足接口中定义的规范和契约,从而实现了代码的解耦和模块化。
- 实现多继承:由于Java的单继承限制,接口提供了一种实现类之间多态性的机制。一个类可以实现多个接口,从而具备多个接口定义的能力和行为,实现了类的多继承。
- 提供标准化的功能:接口常用于定义标准化的功能和服务,例如Java中的Comparable接口用于定义比较对象的标准,Runnable接口用于定义可执行的任务。
五、总结
抽象类和接口在面向对象编程中发挥着不同的作用,根据需求和设计目标的不同,可以选择使用其中之一或两者结合来实现代码的抽象和封装。
特别是在设计模式里面,对于接口和抽象类有大量的应用方法,可以去好好学习。
作者:竹子爱揍功夫熊猫
链接:https://juejin.cn/post/7291846601650815017
相关推荐
- 电工电路图中二极管、三极管的符号标识
-
1、二极管二极管是一种常用的具有一个PN结的半导体器件,它具有单向导电性,通过二极管的电流只能沿一个方向流动。二极管只有在所加的正向电压达到一定值后才能导通。在电工电路图中,二极管以专用的图形符号和电...
- 开关部件在电工电路中的符号标识
-
1、在电工电路中还常常绘制有具有专门含义的图形符号,认识这些符号对于快速和准确理解电路图十分必要。在识读电工电路的过程中,还常常会遇到各种各样的功能部件的图形符号,用于标识其所代表的物理部件,例如各种...
- 走过路过 别错过!整理最全电工电路各种元器件及辅料字母符号解析
-
走过路过别错过!整理最全电工电路各种元器件及辅料字母符号解析建议收藏备用起来以备不时之需!每天学习一点点就会有收获!...
- 熬夜吐血整理的电工电路的字母符号!及各种元器件实物图解符号!
-
熬夜吐血整理的电工电路的字母符号!及各种元器件实物图解符号!...
- 电气人士接好了!史上最全的电气符号介绍
-
有没有人像小编一样看到这样的图纸就犯晕啊?像这样的图纸对于电气人士来说应该不陌生吧,可是对于一些刚入行的,或者在电气行业却不是技术岗位的人来说,那与天书没什么区别。今天小编狠狠心,为大家搜集了一些关于...
- 新手工程师,这些电路图符号你都了解吗?
-
以下电路图符号大全,千万别弄错了噢~~更多行业信息可查阅快点PCB平台订阅号:eqpcb_cp。...
- 电工学习通(一):电路图符号知识大全(安科瑞任心怡、许玉龙)
-
电路图符号知识我们常说的电路图呢是一种以物理电学标准符号来绘制各MOS管电子元器件组成和关系的电路原理布局图,听不懂也没关系,我们只要记住以下几点就可以了:电路图符号数量众多,大致可以分为四个类别:传...
- 常用电子元器件电路符号及实物外形图,你值得拥有
-
作为一名电工初学者,认识并了解常用的电子元器件是一项必备的基本技能,这包括电子元器件的电路符号、实物、用途等。本文电工学习网小编和大家分享一些电子元器件的电路符号及实物外形图,希望对大家的学习有所帮助...
- 电工常用的符号及单位
-
常用的符号及单位①欧姆定律I=U/R(适用于电阻电路,如白炽灯)②电能计算W=P·t(W为我们常说的电度,P为功率多少瓦或千瓦,t为时间小时计量)例如一个220V,60W的白炽灯,在220V电压工...
- 电路图常用的字母符号及释义(详细版!)
-
你是不是在查看电路图时常遇到一些看不懂的字母或字符,不明白它们表示什么含义?今天小编整理了一些电路图常用的字母符号及其释义,供大家查阅,赶快收藏吧!在之前的文章,小编大致整理了绘制电路图常涉及的电路符...
- 最全电工电路的字母符号大全!电工必备知识技能!建议收藏备用
-
最全电工电路的字母符号大全!电工必备知识技能!建议收藏备用!每天学习一点点就会有收获!学海无涯!...
- 电路符号大全,赶快收藏
-
认识电路符号是绘制电路图的前提。绘制电路图需要涉及的电路符号罗列出来有很多,大致可以分为五个类别:基本电路符号、传输路径符号、开关和继电器符号、集成电路组件以及限定符号。基本电路符号绘制基础电路图可能...
- 电气电路的图形符号,不怕看不懂电路图啦
-
一、电压、电流、电池的图形符号//二、信号灯、信号器件、按钮、旋钮开关和测量仪表的图形符号//三、负载开关的图形符号//四、熔断器的图形符号//五、继电器、接触器、接触器触点和操作器件的图形符号//六...
- 图解普通电阻器电路符号的含义,初学者必看
-
电子元器件的电路符号中含有许多有用的、对电路分析有益的识图信息,掌握了电子元器件电路符号的识图,电路分析就会简单一些。电阻器电路符号图1-1所示是普通电阻器电路符号图解示意图。在电路分析中,为了表述方...
- 电路图符号大全(电容、电阻、二极管、三极官、集成电路)
-
基础知识薄弱,不懂工作原理,不会看图、识图,这里更多电路图(原理图)符号大全、电路图形符号(指用一种书画图形代表一种电子元件)(比如:电容、电阻、二极管、三极官、集成电路等等)的符号为初学...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 如何绘制折线图 (52)
- javaabstract (48)
- 新浪微博头像 (53)
- grub4dos (66)
- s扫描器 (51)
- httpfile dll (48)
- ps实例教程 (55)
- taskmgr (51)
- s spline (61)
- vnc远程控制 (47)
- 数据丢失 (47)
- wbem (57)
- flac文件 (72)
- 网页制作基础教程 (53)
- 镜像文件刻录 (61)
- ug5 0软件免费下载 (78)
- debian下载 (53)
- ubuntu10 04 (60)
- web qq登录 (59)
- 笔记本变成无线路由 (52)
- flash player 11 4 (50)
- 右键菜单清理 (78)
- cuteftp 注册码 (57)
- ospf协议 (53)
- ms17 010 下载 (60)