接口和抽象类的区别(不讲废话,干货满满,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,我们可以得出接口和抽象类的区别:

  1. 抽象类是对具有共同属性行为的事物进行抽象,接口只是对行为进行抽象。
  2. 抽象类中可以有抽象方法和普通方法。
  3. 如果子类继承了抽象类,就必须实现抽象类中的抽象方法
  4. 接口中的方法默认都是抽象的,子类必须实现所有的抽象方法
  5. 接口中的 default 方法和 static 不需要子类实现。

以上表述可能不太准确,且是基于JDK1.8做的demo,希望同学自己实现一下,加深印象,加深理解。

接口和抽象类的区别(不讲废话,干货满满,JDK1.8最新整理)的更多相关文章

  1. android中接口和抽象类的区别

    最近发现很多基础有点生疏了,特地写一点博客来巩固一下.今天主要来谈谈接口和抽象类的区别,我们在项目的很多地方都会用到接口或者抽象类,但是它们之间的一些区别和相同点不知道大家有没有注意到,还有就是,什么 ...

  2. Java接口和抽象类的区别

    今天看到项目中,写了一个抽象类,里面有很多方法继承了这类,当调用这个接口时,采用的是这个抽象类去调方法的,当时一想,这个不就是我们说的Java的多态的特征: 继承:存在继承关系的子类和父类 重写:子类 ...

  3. java 接口和抽象类的区别

    java 接口和抽象类的区别抽象类:1.含有抽象方法的类一定为抽象类,反过来抽象类,不一定含有抽象方法:2.抽象类必须用abstract来进行定义,抽象方法也必须用abstract来进行定义:3.抽象 ...

  4. java接口和抽象类的区别和作用(功能、用途、好处)

    Java接口: 总结了4点关于JAVA中接口存在的意义: 1.重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋 ...

  5. 【Java知识点专项练习】之 接口和抽象类的区别

    接口和抽象类的区别 接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的.接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为publi ...

  6. C#中接口与抽象类的区别

    接口与抽象类是面试中经常会考到的点,容易混淆.首先了解下两者的概念: 一.抽象类:      抽象类是特殊的类,只是不能被实例化:除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法,这是普通类 ...

  7. java中的接口和抽象类的区别

    1.接口从用户的角度(使用实现的代码)看问题. 2.接口由编译器强制的一个模块间协作的合约. 3.无成员变量. 4.成员函数只能声明不能实现,(jdk1.8中的default 方法可以有方法体). 接 ...

  8. 《Java基础知识》Java接口和抽象类的区别

    抽象类 抽象类必须用 abstract 修饰,子类必须实现抽象类中的抽象方法,如果有未实现的,那么子类也必须用 abstract 修饰.抽象类默认的权限修饰符为 public,可以定义为 public ...

  9. Java中接口和抽象类的区别?

    抽象类 抽象类必须用 abstract 修饰,子类必须实现抽象类中的抽象方法,如果有未实现的,那么子类也必须用 abstract 修饰.抽象类默认的权限修饰符为 public,可以定义为 public ...

随机推荐

  1. htm5基本学习

    HTML学习 1.HTML概念 1.1.HTML是什么 Hyper Text Markup Language (超文本标记语言)包括:文字.图片.音频.视频.动画等. 1.2.HTML优势 所有浏览器 ...

  2. 34 异常机制 异常体系结构 Java把异常当做对象来处理 并定义一个基类java.lang.Throwable作为所有异常的超类 Error Exception

    异常体系结构 概念 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类. 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Erro ...

  3. LGP5544题解

    题目大意 题意这么明显就不说了qwq 首先最值,而且也想不到啥解法,果断 \(\rm SA\). 然后是初始位置.初始位置就是 \(((\sum_{i=1}^m x)/m,(\sum_{i=1}^m ...

  4. 使用socat反向Shell多台机器

    原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 场景 很多时候,我们需要批量操作多台机器,业界一般使用Ansible来实现,但使用Ansible来操作多台机器的前提是需 ...

  5. python关于openpyxl的二次开发

    from openpyxl import load_workbook class Excel_util: def __init__(self,path): self.path=path # 加载输入路 ...

  6. 闲聊系列之 5-why root cause分析法

    本篇参考: https://max.book118.com/html/2017/1126/141669829.shtm https://baike.baidu.com/item/5why%E5%88% ...

  7. 040_Eureka 服务注册与发现

    目录 什么是Eureka 原理讲解 Eureka的基本架构 三大角色 盘点目前工程状况 创建Eureka服务端子模块 springcloud-eureka-7001 导入依赖 pom.xml 配置文件 ...

  8. ActiveMQ 笔记—01

  9. Apache HTTPD 未知后缀解析漏洞

    环境搭建 https://blog.csdn.net/qq_36374896/article/details/84102101 该环境版本: PHP 7.x 最新版 Apache HTTPD 2.4. ...

  10. 关于使用charles进行mock步骤

    1.应用场景: 1.1 测试环境中,可能存在部分依赖外部系统的http接口,因为外部系统未部署或服务不可用等其他原因,导致接口无法正常响应(特别是qa1环境): 而平时的测试主要还是以界面上的功能测试 ...