接口(非完整版,代更)

接口是啥?

接口是公共标准的行为规范。
比如:电脑中的USB接口,可以插鼠标,键盘,U盘等等满足USB协议的东西。
那在Java中接口是多个类的公共规范。

首先,接口不是类。但它又和类有诸多相似之处,所以这里注重说明其与类的差异。
接口是一种引用数据类型。
接口作为一个强大的高级技术,接着完善你的工具箱,在实践中体会其奥妙吧。

接口的知识点阐述

以下内容

  1. 根据实际遇到的困难进行复习达到通透的目的.也可初步学习
    一些总结,熟练应用才是王道
  1. 接口允许存在成员变量,但这个变量默认为 public static final .
    没错连着三个关键字修饰。
public interface Example {int a=0;//等价于public static final a=0;public static int b=0;//这样写可,但是Java代码规范中建议像上面写,那样更简洁。
}
  • 这里的变量a由于被final修饰,说明它是常量,更严格来说,接口不能接受实例字段只能接受常量。
  1. 成员方法默认为public abstract.接口中的每一个方法都是公共抽象的,当然会说明特例。但是请记住贸然添加private及其它修饰符会报错。
public interface Example{void method1();//默认为public abstract,抽象方法不需要具体实现。public abstract void method2();//由于代码规范,多余关键字可以不用写出。
}

接口中的方法默认为抽象方法,不能由自己实现,而是由实现该接口的类来重写这个方法。
下面来说明两个特例:
在接口中,static 关键字修饰的方法可以具体实现。
java8中明确指出可以在接口中加入静态方法,虽然违背其作为接口的初衷(只作为部分类的公共规范)。

public interface Example{static void method3(){System.out.println("我是一个静态方法,我可以在接口中实现");}
}

另一个特例:
默认方法,用default修饰符标记一个方法就可以具体实现。

public interface Example { default void method4(){System.out.println("我是一个default修饰的方法,我可以在接口中具体实现");}
}

目前以我的学习,我还并没有用上这个默认方法。

  1. 接口被实现后,类中对应重写接口的方法必须用public修饰,因为子类重写方法,权限必须大于等于父类(接口),接口中的方法被public修饰(这里指一般情况),所以子类方法必须加上public。

  2. 接口不是类,不能实例化对象。

public class Main {Example example = new Example() ;//报错,不能new来实现一个接口“对象”。
}
  1. 类与另一个类是继承关系,类与接口是实现关系。

类可以extends来继承一个类(字段,方法);
类可以implements来实现接口中的方法。

  1. 接口引用变量可以引用子类(implements 该接口)的对象。
public class Main implements Example{@Overridepublic void method1(){System.out.println("我要重写父类接口的方法");}@Overridepublic void method2(){System.out.println("我要重写完接口的抽象方法!!!");}Main mian = new Main();Example pmian = mian;//接口的引用变量引用了子类的对象!!!}
  1. 每个接口和类一样都对应各自一个字节码文件(.class)

  2. 接口与接口之间允许继承,即接口与接口之间可以通过extends关键字扩展。

接口语法(Comparable接口介绍)

我们以Comparable接口为例来介绍一下其语法。

public interface Comparable{int comparaTo(Object other);
}
  • 这个接口只提供了一种方法,comparaTo.前面总结过,它是一个public abstract的方法,意味着所有implements Comparable的类都要具体实现该方法。
  • comparaTo方法里的参数Object类型,它接受所有类的对象为参数,并返回一个整型。
    定义一个接口要用interface关键字,接口名的命名规范和类一致,采用大驼峰命名

接口命名最好还需遵守:

  1. 从阅读角度,接口名以I开头方便区分这是一个接口而不是类。
  2. 接口名最好是“形容词”。
  3. 根据阿里编程规范,不要在接口内常量方法加入多余关键字修饰。

Comparable接口使用

  • 下面我们通过Student类来举例说明。
  • 我们试图创建一个Student类的数组,并通过Array类的sort,toString方法来排序打印一下.

下面是例子(试运行一下):

import java.util.Arrays;public class Student {private String name = null;private int score = 0;public Student(String name, int score) {this.name = name;this.score = score;}@Overridepublic String toString() {return "[" + name + ":" + score + "]";}public static void main(String[] args) {Student[] students = new Student[]{new Student("张三", 95),new Student("李四", 96),new Student("王五", 97),new Student("赵六", 92),};Arrays.sort(students);System.out.println(Arrays.toString(students));}
}
  • 非常遗憾报错了,对于一般的对象我们要自行实现comparaTo方法。
  • 言下之意,Students类必须要自己实现Comparable接口。
  • 这么一想,确实这个理。当前这个自定义类要根据那个规则进行比较呢?这个规则怎么定义?
import java.util.Arrays;public class Student implements Comparable{private String name = null;private int score = 0;public Student(String name, int score) {this.name = name;this.score = score;}@Overridepublic String toString() {return "[" + name + ":" + score + "]";}public static void main(String[] args) {Student[] students = new Student[]{new Student("张三", 95),new Student("李四", 96),new Student("王五", 97),new Student("赵六", 92),};Arrays.sort(students);System.out.println(Arrays.toString(students));}@Overridepublic int compareTo(Object o) {//这里根据分数比较。return this.score-((Student)o).score;}
}

Comparable泛型接口?

Java5以后,Comparable接口以及升级成一个泛型了。
那什么是泛型呢?我们这里简单说一下。否则要另起一篇文章巴拉巴拉谈接口了。

顾名思义,泛型(广泛的类型),意思是数据类型可以作为参数使用了。(~)C语言出身直接落泪。(类型终于可以当参数传来)
请看的Comparable船新定义。

public interface Comparable<T>
{int compareTo(T other);//从超类Object过渡具体的类了。
}
  • 有啥用?看看上面的compatrTo实现用了向下转型,可以不用类型转换了!!
public class Student implements Comparable<Student>//类的定义改成这一句。
 @Overridepublic int compareTo(Student o) {return this.score-o.score;//Object被替换成Student了}

单小结进行一个汇总One

  1. 提问One:Comparable与Comparable这两种接口写法那种正确?

答案肯定无疑都正确,泛型在Java5后引入为了兼容过去的版本,允许最初不带泛型的写法。不用泛型默认参数为Object需要使用强制类型转换来向下转型。

  1. 提问Two:Arrays.sort(参数),这个参数以前在排整型数组时我们没实现过啊?

java.util.Arrays中的sort方法static void sort(Object[] a),指出参数中数组元素对应的类必须实现Comparable接口。
而对于基本数据类型int的数组,java.util.Arrays中的sort方法重载,可以接受基本数据类型为元素的数组,它们在底层上实现了Comparator接口

  1. 提问Three:为什么我们不单独实现compareTo方法,而必须通过实现Comparable接口的方式来定义compareTo方法呢?

Java是一种强类型语言,它很严格,调用方法前,它要检查这个方法确实存在。而实现这个接口就意味对应的类必须提供这个方法的具体定义。

总结:对与一般类的数组,若调用Arrays类的sort方法,sort内部会调用这个类的compareTo方法,来确保这些个数组对象是可以比较的(按什么逻辑比较),所以这个类必须实现Comparable接口,而compareTo方法内部的比较逻辑取决于我们。

关于一些补充接口与类的差异

  1. 类有字段,接口也允许字段。只不过接口字段是public static final.
    这意味着接口字段(final)必须在定义时就初始化值。(static)意味着该字段在方法区的常量池中。编译期已被决定。
    字段访问方式:接口名. 或者实现接口的类,及其对象,引用,来访问。
  2. 接口允许三种方法public static 方法(不加任何关键字的写法);默认方法;静态方法;
  3. 类中允许有静态代码块,接口不允许。
  4. 类中有构造器(自己没写编译器会默认给一个),接口中没有构造器且自己不能实现一个构造器。

抽象类与接口

在Java中类只能继承一个类,任何一个类没明确继承啥父类都会默认继承Object类。
假如Children类继承Parents类,Parents继承Object类。每个类继承关系只能单继承。
Java不支持多继承,但可以实现多个接口。

public class Children extends Parents implements ComparableSwingConstants{//…………
}

//代更。个人笔记不定期更新—Java合集

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AD使用快捷键

1、如何实现元器件旋转45放置 在Preferences >> PCB Editor >> General中将Rotation Step&#xff08;旋转的步进值&#xff09;由90改为45&#xff0c;这样以后每次按空格键旋转器件时旋转角度为45。 2、显示网络、隐藏网络 N 3、对齐 2、设置DRC检查选项&#xf…

SAP-应付暂估核对

前言 本篇前面是应付暂估核对的核对逻辑&#xff0c;后面是核对过程中发现的问题&#xff0c;拿出来大家参考一下。 需求实现 一、采购订单收货暂估凭证 采购订单情况&#xff1a;采购订单号码5300000048 采购单价PBXX总价是含税单价&#xff0c;不含税单价是3,539.82 订单计…

数据可视化在智慧社区中的关键应用

数据可视化能够在智慧社区中发挥重要作用&#xff0c;通过直观和交互的方式将复杂的数据呈现出来&#xff0c;提升社区管理效率&#xff0c;优化居民生活体验&#xff0c;促进社区的可持续发展。在智慧社区中&#xff0c;数据可视化的应用涵盖了安全、环境、能源、交通和公共服…

在HTML中,如何正确使用语义化标签?

在HTML中&#xff0c;使用语义化标签可以使得网页结构更加清晰和易于理解。以下是一些正确使用语义化标签的方法&#xff1a; 使用合适的标题标签&#xff08;h1-h6&#xff09;来标识网页的标题&#xff0c;以及页面中的各个区块的标题。 <h1>网页标题</h1> <…

CFA官网资料说明

进入到资料后台你就会发现&#xff0c;分了三个板块&#xff0c;分别是Study, Prepare和The Exam。 Study板块 主要提供备考重要资料&#xff0c;包括教材下载、自学习系统 Prepare板块 主要帮助考生准备考试&#xff0c;提供了一些小工具、包括机考软件指南 The exam板块…

秋招突击——第六弹——Java的SSN框架快速入门——MyBatisPlus

文章目录 引言正文入门案例整和MybatisPlus的相关内容 概述标准数据层开发分页查询DQL编程控制条件查询——NULL值处理 查询投影查询条件设定等于操作范围查询模糊查询分组查询 字段映射和表名映射 DML编程控制——增删改查相关操作添加操作id生成策略控制 删除操作多数据删除逻…

MAC配置VScode中C++项目debug环境

文章目录 配置步骤问题解决Unable to start debugging. LLDB exited unexpectedly with exit code 137 (0x89). 配置步骤 在Mac上配置VS Code以进行C调试涉及几个步骤&#xff1a; 安装必要的工具: 确保您已经安装了Visual Studio Code和C插件。 检查是否安装了Clang&#xf…

小山菌_代码随想录算法训练营第二十八天| 491.递增子序列 、

491.递增子序列 文档讲解&#xff1a;代码随想录.递增子序列 视频讲解&#xff1a;回溯算法精讲&#xff0c;树层去重与树枝去重 | LeetCode&#xff1a;491.递增子序列 状态&#xff1a;已完成 代码实现 class Solution { private:vector<vector<int>> result;ve…

【物联网】物联网操作系统简介

目录 一、物联网操作系统概述 1.1内存占用 1.2 内存管理 二、物联网操作系统构成 三、物联网操作系统关键特性 3.1 调度方式 3.2 I/O操作方式 3.3 网络服务 3.3.1 TinyOS网络协议栈 3.3.2 LiteOS网络协议栈 一、物联网操作系统概述 物联网操作系统是支撑物联网大规模…

电商还存在错位竞争空间吗?

“上链接试了&#xff0c;十几分钟&#xff0c;成本5块的东西卖1块5了。”今年618前期&#xff0c;某个电商平台上线了自动跟价功能&#xff0c;有一个卖家尝试了一会儿之后赶紧关了。 又一个618&#xff0c;平台、商家、消费者们又迎来了一次狂欢。只是与往年不同的是&#x…

如何将 gz 文件通过 local data 导入 OceanBase?

在很多领域&#xff0c;数据的传输是基于 csv&#xff0c;并且&#xff0c;为了方便&#xff0c;属于同一张表的多个 csv 文件还是打包成 gz 文件进行传输。 当 gz 文件传输到下游时&#xff0c;需要将 gz 中的 csv 数据导入数据库&#xff0c;最直接的方法是&#xff1a; 在…

ADB获取当前正在显示的Activity和Fragment

获取当前显示的Activity adb shell "dumpsys window | grep mCurrentFocus" 获取添加到FragmentManager并且正在显示的Fragment adb shell "dumpsys activity top | grep #[0-9]: | tail -n 1" 原文链接https://blog.csdn.net/sunshine_guo/article/de…

如何快速解决屏幕适配问题

下面将利用postcss插件快速解决屏幕适配问题。仅用少量代码&#xff0c;新手均可快速使用。 Step1. 安装 npm install postcss-px-to-viewport-8-plugin --save-dev Step2. 新建 postcss.config.js 文件&#xff0c;做基础配置 module.exports {plugins: {postcss-px-to-v…

20240620每日后端---------Spring Boot中的 5 大设计模式最佳实践和示例 这些是我经常使用的设计模式并且非常喜欢

在本文中&#xff0c;我们将深入探讨五种基本设计模式&#xff0c;并探讨在 Spring Boot 项目中有效应用它们的最佳实践。每个模式都将附有一个实际示例来演示其实现。 单例模式 Singleton 模式确保一个类只有一个实例&#xff0c;并提供对它的全局访问点。这对于管理资源&am…

绝地求生PUBG联名补偿奖励来了 补偿奖励介绍详情解析

《绝地求生》(PUBG) 作为一款战术竞技型射击类沙盒游戏&#xff0c;从上线以来就深受玩家小伙伴们的喜爱&#xff0c;即便是没有玩过的小伙伴&#xff0c;对“吃 鸡”二字想必也是很耳熟的&#xff0c;这正是《绝地求生》(PUBG) 的别称。 在北京时间6月12日&#xff0c;由于绝…

通过注解@ConfigurationProperties和全局配置文件中配置数据绑定

1、创建创建出两个JavaBean&#xff1a;User和Address 2、在User类上加注解 Component // 标记为组件&#xff0c;放到spring的ioc容器里 ConfigurationProperties(prefix "user") // 和配置文件绑定&#xff0c;可以从配置文件中的注入数据 public class User {…

性能工具之 JMeter 常用组件介绍(七)

文章目录 一、后置处理器1、Regular Expression Extractor(正则表达式提取器)2、JSON Extractor(JSON表达式提取器)3、Regular Expression Extractor(正则表达式提取器) 二、小结 本文主要介绍JMeter主流后置处理器的功能 一、后置处理器 从上面可以看出后置处理可以插件挺多&a…

CASS界址点顺序重排

1、绘制一个宗地&#xff0c;如下&#xff1a; 2、注记界址点号&#xff0c;如下 3、【地籍】--【调整宗地内界址点顺序】&#xff0c;如下&#xff1a; 重排完成后&#xff0c;点击工具栏的【重】按钮&#xff0c;即可刷新标注。

C++的动态内存分配

使用new/delete操作符在堆中分配/释放内存//使用new操作符在堆中分配内存int* p1 = new int;*p1 = 2234;qDebug() << "数字是:" << *p1;//使用delete操作符在堆中释放内存delete p1;在分配内存的同时初始化//在分配内存的时初始化int* p2 = new int(100…

什么是CSRF攻击,SpringSecurity如何防御?

CSRF攻击概述 CSRF&#xff08;跨站请求伪造&#xff0c;Cross-Site Request Forgery&#xff09;是一种常见的网络攻击方式。在这种攻击中&#xff0c;攻击者诱导已经登录的用户在不知情的情况下发送请求到一个应用程序&#xff0c;从而在没有用户意识并且使用用户自身权限的…