接口和抽象类的区别(不讲废话,干货满满,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. 11 Java的方法 递归

    6.递归 A方法调用B方法,我们很容易理解! 递归就是:A方法调用A方法!就是自己调用自己 利用递归可以用简单的程序来解决一些复杂的问题. 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较 ...

  2. ElasticSearch7.3 学习之倒排索引揭秘及初识分词器(Analyzer)

    一.倒排索引 1. 构建倒排索引 例如说有下面两个句子doc1,doc2 doc1:I really liked my small dogs, and I think my mom also like ...

  3. e值计算来了

    e值该如何计算呢? 若关于ex幂级数展开 ex=1+x+x2/2!+x3/3!+•••+xn/n! 取x=1,有e=1+1/2+1/6+••• 接下来就是十分简单的编程 这里选用了python语言(当 ...

  4. MATLAB绘制三角网及三维网线

    今天博主给大家介绍一些比较常见的可视化操作,绘制三角网及三维网线. 三角网是由一系列连续三角形构成的网状的平面控制图形,是三角测量中布设连续三角形的两种主要扩展形式,同时向各方向扩展而构成网状,优点为 ...

  5. 使用Docker 部署MongoDB

    使用 Docker 部署 MongoDB 查看官网安装教程后感觉直接使用包管理器安装mongo比较复杂,本文主要介绍使用docker安装部署mongo的方法,并对基本配置项进行自定义.保姆式全程指导. ...

  6. Apache BeanUtils与Spring BeanUtils性能比较

    在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进行属性 ...

  7. 加速度传感器(MPA1064A)实测---LOTO虚拟示波器

    加速度传感器(MPA1064A)实测---LOTO虚拟示波器 客户提供了一个加速度传感器,型号是MPA1064A,我们帮助客户测试下是否能测到传感器的输出,验证下测试方案.传感器很小巧,带了一根很长的 ...

  8. Redis+Caffeine两级缓存,让访问速度纵享丝滑

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 在高性能的服务架构设计中,缓存是一个不可或缺的环节.在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中, ...

  9. 半吊子菜鸟学Web开发2 --JavaScript学习1

    JavaScript是一种类C的语言,对于我来说学起来还是蛮轻松的 1 输出 console.log(**); 相当于print console.assert(*);弹窗 2 变量 JS是动态变量 类 ...

  10. [源码解析] TensorFlow 分布式环境(6) --- Master 动态逻辑

    [源码解析] TensorFlow 分布式环境(6) --- Master 动态逻辑 目录 [源码解析] TensorFlow 分布式环境(6) --- Master 动态逻辑 1. GrpcSess ...