接口和抽象类的区别(不讲废话,干货满满,JDK1.8最新整理)
接口和抽象类的区别(不讲废话,干货满满,JDK1.8最新整理)
1、抽象类
以下说辞可能不太准确,但是会让你醍醐灌顶
抽象类是把一些具有共同属性(包括行为)的东西抽象出来,比如:
- 小狗有身高,体重,颜色,会叫,会跑
- 小猫有身高,体重,颜色,会叫,会跑
这个时候我们发现小猫和小狗都有共同的属性(包括行为:会叫,会跑),所以我们抽象一个动物类出来:
public abstract class Animal {
float weight;
float height;
String color;
abstract void run();
abstract void bark();
void scratch() {
System.out.println("animal can scratch");
}
}
从这里我们可以得出结论1,抽象类中可以有抽象方法和普通方法。
我们再定义一个 Cat 类:

编译器报错,说我们要么把 Cat 声明为抽象类,要么就实现 Animal 中的抽象方法
这里我们可以得出结论2:如果子类继承了抽象类,就必须实现抽象类中的抽象方法
有同学发现,既然抽象类不能实例化,那抽象类中的普通的方法有什么意义?
意义就在于提高代码的可用性!什么是可用性,比如我上面的例子,动物会 scratch(挠人),我默认了所有的动物都是这样挠人的,就不需要子类再去挨个实现挠人的动作。
2、接口
抽象类很强大,它可以把属性和行为都抽象出来,但是存在一个很大的问题:耦合度过高
举个栗子:我现在有个小鸟类,有个飞机类,如果需要我们抽象出来,我们应该怎么去抽?
假设我们抽象出一个飞行类,里面只有一个抽象方法:abstract void fly()
这时候小鸟能继承飞行类吗,继承了飞行类还能继承动物类吗?显然不能,这就体现出了抽象类的局限性。
这时候,接口就出现了,接口就是为了抽象出行为,在 Java 中,只有单继承,但是有多实现。
我们可以抽象出一个会飞的的接口:
public interface Flyable {
void fly();
}
如果是会游泳的动物,那我们再抽象出一个游泳的接口:
public interface Swimmable {
void swim();
}
现在小鸟可以继承动物类和实现会飞的接口,飞机也可以实现会飞的接口
青蛙可以继承动物类和实现会游泳的接口,某运动员也可以实现会游泳的接口
这里我们可以得出结论3:抽象类是对具有共同属性和行为的事物进行抽象,接口只是对行为进行抽象。
3、接口中的方法
接口中默认的方法都是抽象的,我们先写一个小鸟类:

编译器报错,告诉我们必须实现接口中的方法
这里我们可以得出结论4:接口中的方法默认都是抽象的,子类必须实现所有的抽象方法。
jdk1.8 新增了 default 方法和 static 方法,我们来看一下:
default 方法:
public interface Flyable {
void fly();
default void test() {
System.out.println("测试 default 方法");
}
}
写完后,编译器没有报错,说明子类不需要强制实现这个方法,但是接口也不能实例化,default方法存在的意义在哪儿呢?这个问题是不是似曾相识?
对,是不是就是和抽象类中的普通方法一样,提高代码的可用性。
这里可以得出结论5:接口中的default方法不需要子类实现
static方法:
public interface Flyable {
void fly();
default void test() {
System.out.println("测试 default 方法");
}
static void test2() {
System.out.println("测试 static 方法");
}
}
子类没有报错,静态方法通过接口名直接调用:Flyable.test2()
这里可以得出结论6:接口中的static方法也不需要子类实现,且通过接口名直接调用
接口中还允许静态的字段,默认是public static final的,子类只能使用,不能修改
总结
结合结论1~6,我们可以得出接口和抽象类的区别:
- 抽象类是对具有共同属性和行为的事物进行抽象,接口只是对行为进行抽象。
- 抽象类中可以有抽象方法和普通方法。
- 如果子类继承了抽象类,就必须实现抽象类中的抽象方法。
- 接口中的方法默认都是抽象的,子类必须实现所有的抽象方法。
- 接口中的 default 方法和 static 不需要子类实现。
以上表述可能不太准确,且是基于JDK1.8做的demo,希望同学自己实现一下,加深印象,加深理解。
接口和抽象类的区别(不讲废话,干货满满,JDK1.8最新整理)的更多相关文章
- android中接口和抽象类的区别
最近发现很多基础有点生疏了,特地写一点博客来巩固一下.今天主要来谈谈接口和抽象类的区别,我们在项目的很多地方都会用到接口或者抽象类,但是它们之间的一些区别和相同点不知道大家有没有注意到,还有就是,什么 ...
- Java接口和抽象类的区别
今天看到项目中,写了一个抽象类,里面有很多方法继承了这类,当调用这个接口时,采用的是这个抽象类去调方法的,当时一想,这个不就是我们说的Java的多态的特征: 继承:存在继承关系的子类和父类 重写:子类 ...
- java 接口和抽象类的区别
java 接口和抽象类的区别抽象类:1.含有抽象方法的类一定为抽象类,反过来抽象类,不一定含有抽象方法:2.抽象类必须用abstract来进行定义,抽象方法也必须用abstract来进行定义:3.抽象 ...
- java接口和抽象类的区别和作用(功能、用途、好处)
Java接口: 总结了4点关于JAVA中接口存在的意义: 1.重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋 ...
- 【Java知识点专项练习】之 接口和抽象类的区别
接口和抽象类的区别 接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的.接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为publi ...
- C#中接口与抽象类的区别
接口与抽象类是面试中经常会考到的点,容易混淆.首先了解下两者的概念: 一.抽象类: 抽象类是特殊的类,只是不能被实例化:除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法,这是普通类 ...
- java中的接口和抽象类的区别
1.接口从用户的角度(使用实现的代码)看问题. 2.接口由编译器强制的一个模块间协作的合约. 3.无成员变量. 4.成员函数只能声明不能实现,(jdk1.8中的default 方法可以有方法体). 接 ...
- 《Java基础知识》Java接口和抽象类的区别
抽象类 抽象类必须用 abstract 修饰,子类必须实现抽象类中的抽象方法,如果有未实现的,那么子类也必须用 abstract 修饰.抽象类默认的权限修饰符为 public,可以定义为 public ...
- Java中接口和抽象类的区别?
抽象类 抽象类必须用 abstract 修饰,子类必须实现抽象类中的抽象方法,如果有未实现的,那么子类也必须用 abstract 修饰.抽象类默认的权限修饰符为 public,可以定义为 public ...
随机推荐
- 微信小程序码生成及canvas绘制
吐槽:某厂的开发文档写的跟屎一样 1.后台返回accessToken,小程序请求获取小程序码 uni.request({ url: 'https://api.weixin.qq.com/wxa/get ...
- 编写Python代码的注意事项
1.标识符 标识符是定义的名称,包括类名.变量名等等 标识符的大小写是敏感的,且第一个字符必须是字母表中的字母或"_" 在python3中,中文可被用作变量名 不能使用Python ...
- tensorflow源码剖析之framework-kernel
目录 什么是kernel kernel_def op_kernel kernel的注册 op_segment 关系图 涉及的文件 迭代记录 1. 什么是kernel 如果说op相当于操作的声明,那么k ...
- 移动端开发为什么使用@2x@3x图片
物理.逻辑与位图像素的概念 关于设备物理像素和逻辑像素,这两个像素一个是实体的,一个是抽象的单位.除此之外还有一个不可忽视的像素,就是位图像素. 物理像素(设备像素):指的是设备屏幕实际拥有的像素点. ...
- Spring系列25:Spring AOP 切点详解
本文内容 Spring 10种切点表达式详解 切点的组合使用 公共切点的定义 声明切点@Poincut @Poincut 的使用格式如下: @Poincut("PCD") // 切 ...
- LGP3346题解
广义 SAM 比较简单的题/fad 题意:树上所有路径一共能够组成多少个本质不同子串? 并且数据保证最多只有20个叶子节点. 我们先来考虑一下一种特殊情况: 对于路径 \([u,v]\),\(u\) ...
- 通信原理:基于MATLAB的AM调幅分析
目的: 通过matlab仿真AM调制,通过图像分析来更好的了解AM调制的过程 1.为什么基带信号要加上一个直流分量. 2.所加直流分量为什么要大于基带信号的最大值. 3.时域中调制信号与载波和基带信号 ...
- IBM QRadar Advisor 安全限制绕过漏洞
受影响系统:IBM QRadar Advisor 1.0.0 -2.4.0描述:CVE(CAN) ID: CVE-2019-4556 IBM QRadar Advisor是一套安全威胁分析解决方案. ...
- MATLAB奔溃仅左上角显示关闭界面X
一 问题描述 今天在MATLAB调试图像增强程序时,忽然间点了MATLAB向下还原,奇怪的一幕发生了,电脑左上角仅显示关闭图标X.我就搜了MATLAB中文论坛(https://www.ilovema ...
- 论文写作中快速更新Word里面交叉引用的编号,巧用MathType
点击插入编号>>更新,即可快速更新交叉引用的编号,不用一个一个更新域!