当前位置: 首页 > news >正文

java基础系列(九) 接口和抽象类

一. 接口

简单的说,接口就是一种被规范的标准,只要符合这个标准都可以通用,接口的表现

在于对行为的抽象. 

1.1 创建接口的格式

格式1:  public interface 接口名

格式2:  interface 接口名

1.2  在JDK1.8之后, 在接口中可以定义实现的方法体是java8的一大特性,可以定义多个静态或者默认的方法, 下面的代码注释中说明了使用方法.

接口代码如下:

public interface Action {// 接口中都是抽象方法和常量,不可能有非抽象方法,常量必须被赋值。//接口中的方法默认是 public abstractpublic abstract void eat();//常量默认是 public static finalpublic static final int age = 20;//Java8中接口中引入默认方法和静态方法,以此来减少抽象类和接口之间的差异//静态方法public static void method() {/*** 1、定义一个静态的带有方法体的方法* 2、接口不能创建对象,调用静态方法不需要对象* 3、接口名直接调用:  Action.method();*/System.out.println("接口中静态方法");}//默认方法用default来修饰/*不同于静态方法,默认方法是一个非静态方法对于非静态方法,只能通过对象进行调用接口是不能直接new, 因此我们需要子类来实现接口** */default void methodDefault(){System.out.println("default method in interface");}}

验证方法:

public class TestInterface implements Action{@Overridepublic void eat() {System.out.println("实现接口中的eat方法");}public static void main(String[] args) {Action action = new TestInterface();//调用接口中defaut方法action.methodDefault();//调用接口中的static方法 直接用 接口.方法();Action.method();}
}

打印如下:


default method in interface接口中静态方法

1.3 接口有什么特点?

接口中声明全是public static final修饰的常量
接口中所有方法都是抽象方法
接口是没有构造方法的
接口也不能直接实例化
接口可以多继承

二. 抽象类和接口对比

抽象类是用来捕捉子类的通用特性的。接口是抽象方法的集合。
从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

相同点:
接口和抽象类都不能实例化
都位于继承的顶端,用于被其他实现或继承
都包含抽象方法,其子类都必须覆写这些抽象方法

不同点:


抽象类接口

抽象类使用abstract关键字声明接口使用interface关键字声明

子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现子类使用implements关键字来实现接口。它需要提供接口中所有声明的方法的实现


抽象类可以有构造器接口不能有构造器
访



抽象类中的方法可以是任意访问修饰符

接口方法默认修饰符是public. 并且

不允许定义为 private 或者protected

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

抽象类的字段声明可以是任意的接口的字段默认都是 static 和 final

备注:Java8中接口中引入默认方法和静态方法,以此来减少抽象类和接口之间 的差异。
现在,我们可以为接口提供默认实现的方法了,并且不用强制子类来实现它。

接口和抽象类各有优缺点,在接口和抽象类的选择上,必须遵守这样一个原则:


1 . 行为模型应该总是通过接口而不是抽象类定义,所以通常是优先选用接口,尽量 少用抽象类。
2.   选择抽象类的时候通常是如下情况:需要定义子类的行为,又要为子类提供通用 的功能。

http://www.lryc.cn/news/34940.html

相关文章:

  • Docker启动问题docker is starting…
  • Django/Vue实现在线考试系统-03-开发环境搭建-MySQL安装
  • python实现波士顿房价预测
  • Pinia不酸,保甜
  • uniapp生命周期
  • 经典卷积模型回顾11—Xception实现图像分类(matlab)
  • 移动App性能测试包含哪些内容?App性能测试工具有哪些?
  • AI测试的迷思
  • [ 红队知识库 ] 一些常用bat文件集合
  • Qt广告机服务器(上位机)
  • SOA架构的理解
  • 如何选择一款数据库?
  • week2
  • JavaScript的学习
  • 用gin写简单的crud后端API接口
  • CF大陆斗C战士(三)
  • TTS | 语音合成论文概述
  • HTML第5天 HTML新标签与特性
  • java ee 之进程
  • Linux学习记录——십사 进程控制(1)
  • 使用 create-react-app 脚手架搭建React项目
  • inquirerjs
  • [数据库]内置函数
  • shell基本知识
  • Http长连接和短连接
  • [SQL Statements] 基本的SQL知识 之DDL针对表结构和表空间的基本操作
  • Git版本控制工具(详解)
  • 408考研计算机之计算机组成与设计——知识点及其做题经验篇目2:指令系统
  • Java语法中的方法引用::是个什么鬼?
  • 【使用vue init和vue create的区别以及搭建vue项目的教程】