java接口概述

【0】README

0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java 接口概念 ;
0.2)接口技术: 这种技术主要用来描述类具有什么功能, 并不给出每个功能的具体实现; 一个类可以实现多个接口, 但只允许单继承;
0.3) 最后简单阐述了 接口和抽象类 的 区别;


【1】 接口

1.1)接口中的所有方法自动属于public: 故,在接口中声明方法时,不必提供关键字public;
1.2)接口可以包含多个方法: 在接口中还可以定义常量;然而,更重要的是 要知道接口不能提供哪些功能;接口不能提供实例域, 也不能在接口中实现方法, 提供实例域和方法实现的任务应该由实现接口的那个类来完成;因此,可以将接口看做是没有实例域的抽象类,但接口和抽象类还是有区别的, 稍后给出解释
1.3)为了让类实现一个接口, 需要以下两个steps:

  • step1)将类声明为实现给定的接口;
  • step2)对接口中的所有方法进行定义;
  • Warning)因为 接口中的所有方法自动属于public, 故,在接口中声明方法时,不必提供关键字public;但是 ,类在实现接口时,必须把方法声明为 public, 否则,编译器将认为这个方法的 访问属性是包可见性, 即类的默认访问属性;

1.4)排序访问必须让它实现 compareTo 方法:我们已经看到, 要让一个类使用排序访问必须让它实现 compareTo 方法,这是理所当然的,因为要向 sort方法提供对象的比较方式;
1.5)但是 , 为什么不能在 Employee类直接提供一个 compareTo 方法, 而必须实现 Comparable 接口呢? 主要原因在于 java 是一种强类型的语言;在调用方法的时候, 编译器将会检查这个方法是否存在, 如,

if(a[ i ].compareTo(a[ j ]) > 0)
{
............
}

编译器必须确认 a[i] 一定有 compareTo 方法,如果a 是一个 Comparable 对象 的数组, 就可以确保拥有 compareTo 方法,因为每个实现 Comparable 接口的类都必须提供这个方法的定义;
1.6)看个荔枝:

[API] java.lang.Comparable<T> 1.0
int compareTo(T other) :用这个对象域 与 other 进行比较;
[API] java.util.Arrays 1.2
static void sort(Object[] a) : 使用mergesort 对数组a中的元素进行排序; 要求数组中的元素必须实现了 Comparable 接口的类, 并且元素间必须是可
比较的;
[API] java.lang.Integer 7
static int compare(int x, int y) : 如果x<y 返回一个负数, 相等返回0, 否则返回一个正数;

Annotation)

  • A1)语言标准规定: 对于任意的x 和 y, 实现必须能够保证 sgn(x.compareTo(y)) = -sgn(y.compareTo(x)); 这也就是说, 如果y.compareTo(x) 抛出 一个异常,那么 x.compareTo(y) 也应该抛出一个异常;
  • A2)这里的sgn 是一个数值的符号: 如果n为负值, sgn(n) 等于 -1, 如果n是0, sgn(n) 等于0;如果n是正数, sgn(n) 等于1;
  • A3)简单讲, 如果调换compareTo 的参数,结果的符号也应该调换(而不是实际值);

出现的问题)因为 Manager 扩展了 Employee, 而 Employee实现的是Comparable , 而不是 Comparable, 如果 Manager覆盖了 compareTo, 就必须要有经理 与 雇员进行比较的心理准备, 决不能仅仅将 雇员转换为 经理;

class Manager extends Employee
{public int compareTo(Employee other){Manager otherManger = (Manager)other; //NO......}
}
  • P1)这不符合 “反对称”的规定:如果x是一个 Employee对象, y 是一个 Manager对象, 调用 x.compareTo(y) 不会抛出异常, 它只是将 x 和 y 都作为雇员进行比较。 但是反过来, y.compareTo(x) 将会抛出一个 ClassCastExcaption;

解决办法(Solutions):

  • S1)如果子类之间的比较含义不一样, 那就属于不同类对象 的非法比较, 每个 compareTo 方法都应该在开始时 进行下列检测:
    if(getClass != other.getClass()) throw new ClassCastException();
  • S2)如果存在这样一种通用算法, 它能够对两个不同的子类对象进行比较,则应该在超类中提供一个 compareTo方法, 并将这个方法法声明为final;
  • S3)假如 不管薪水的多少,都想让 manager 大于 雇员, 即如果要按照职务排列 的话, 那就应该在 Employee类中 提供一个 rank方法, 每个子类覆盖rank, 并实现一个 比较 rank值的 compareTo 方法;

【2】 接口的特性

2.1)可以声明接口变量, 且接口变量必须引用实现了接口的类对象:

Comparable x ; 这是OK 的;
x = new Employee();

2.2)可以使用 instanceof 检查一个对象是否实现了某个特定的接口:

if(anObject instanceof Comparable) {}

2.3)接口也可以继承, 这里允许存在多条从具有较高通用性接口到较高专用性接口的链:看个荔枝

public interface Moveable
{void move(double x, double y);
}
//然后用 Movable 扩展一个 Powered 的接口:
public interface Powered extends Moveable
{double milesPerGallon();
}
//虽然在接口中不能包含实例域或静态方法, 但可以包含常量:
public interface Powered extends Moveable
{double milesPerGallon();double SPEED_LIMIT = 95; // a public static final constant
}
  • Attention)与接口中的方法都自动被设置为 public, 接口中的 域都被自动设为 public static final
  • Annotation)有些接口只是定义了常量,而没有定义方法, 这样应用接口似乎有点偏离了接口概念的初衷,所以, 最好不要这样用它;

2.4)类是单继承,但是可以实现多个接口;看个荔枝:
java 中有一个 非常重要的 内置接口, Cloneable, 如果某个类实现了这个Cloneable 接口,Object类中的 clone 方法就可以创建类对象的一个copy, 如果希望自己设计的类拥有 克隆和比较的能力, 只要实现这两个接口就可以了(一个类可实现多个接口)

class Employee implements Cloneable, Comparable

【3】接口与抽象类

3.1)疑问?为什么java还要不辞辛苦引入接口概念? 为什么不将 Comparable直接设计成抽象类:

abstract class Comparable
{public abstract int compareTo(Object obj);
}
//然后, Employee再扩展这个抽象类, 并提供 compareTo方法的实现:
class Employee extends Comprable
{public int compareTo(Object other){ ... }
}

3.2)使用抽象类表示通用属性存在这样一个问题:每个类只能扩展一个类, 假设 Employee 类已经扩展了一个类, 比如Person, 它就不能再像下面这样扩展第二个类了; 但是每个类可以实现多个接口:

class Employee extends Person implements Comparble //OK

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

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

相关文章

通过aws部署推荐系统_通过AWS Elastic Beanstalk轻松进行Spring Boot部署

通过aws部署推荐系统朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 数分钟之内即可在任何应用程序中对用户进行身份验证&#xff0c;管理和保护。 几乎所有应用程序都依赖于身份验证。 开发人员以及雇用他们的公司都想确认…

图论算法基础

【0】README 0.1&#xff09;本文总结于 数据结构与算法分析&#xff0c; 旨在复习数据结构中图论算法的基础知识&#xff1b; 【1】图论若干相关定义 1.1&#xff09;图G定义&#xff1a;一个图G&#xff08;V&#xff0c;E&#xff09;由顶点及集V 和 边集E组成&#xff0c…

mysql 表丢失_Mysql数据库备份 部分数据表丢失 Mysql table doesn't exist 解决

问题&#xff1a;直接拷贝data下的数据库数据进行备份&#xff0c;重装升级了数据库&#xff0c;直接复制备份数据到新的数据库data目录下&#xff0c;发现部分数据表不见了。原因分析&#xff1a;以表“Table”为例:如类型是MyISAM, 数据文件则以”Table.frm”&#xff0c;”T…

aws 删除ec2实例_如何在AWS EC2实例上部署Spring Boot应用程序

aws 删除ec2实例你好朋友&#xff0c; 在本教程中&#xff0c;我们将看到如何在AWS EC2实例上部署Spring Boot应用程序。 这是我们将要执行的步骤。 1.使用Spring Boot Initialiser创建一个Spring Boot项目。 2.创建一个休息端点&#xff0c;部署后我们可以访问 3.启动EC2…

jdbc操作mysql数据库_JDBC操作MySQL数据库(一)

连接MySQL数据库连接数据源有两种方式&#xff1a;1)通过DriverManager类2)通过DataSource接口及JNDI资源获得连接DriverManager类的路径为java.sql.DriverManager&#xff0c;它主要完成驱动程序的装载和建立新的数据库连接。其常用方法如下&#xff1a;* getConnection (Stri…

只读事务上下文_我可以/应该在事务上下文中使用并行流吗?

只读事务上下文介绍 长话短说&#xff0c;您不应在并行流中使用事务。 这是因为并行流中的每个线程都有其自己的名称&#xff0c;因此它确实参与了事务。 Streams API旨在在某些准则下正常工作。 实际上&#xff0c;为了受益于并行性&#xff0c;不允许每个操作更改共享对象的…

mysql多表查询详解_MySQL多表查询详解上

时光在不经意间&#xff0c;总是过得出奇的快。小暑已过&#xff0c;进入中暑&#xff0c;太阳更加热烈的绽放着ta的光芒&#xff0c;...在外面被太阳照顾的人们啊&#xff0c;你们都是勤劳与可爱的人啊。在房子里已各种姿势看我这篇这章的你&#xff0c;既然点了进来&#xff…

无权最短路径

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff0c; 源代码均为原创&#xff0c; 旨在理解 无权最短路径 的思想并用源代码加以实现&#xff1b; 【1】无权最短路径相关概念&#xff08;边的权值赋值为1&#xff09; 1.1&#xff09;概述&#xff1a;下…

java 键入_在Java中键入Safe SQL

java 键入字符串&#xff0c;字符串&#xff0c;字符串 无论您使用的是JPA &#xff0c; MyBatis还是Spring Data JDBC之类的框架&#xff0c;总会最终将SQL语句声明为Java String。 这种方法的问题在于&#xff0c;您必须为每个语句编写测试&#xff0c;以确保它甚至是有效SQ…

filter过滤后重新添加_Spring Boot 2.X(十):自定义注册 Servlet、Filter、Listener

前言在 Spring Boot 中已经移除了 web.xml 文件&#xff0c;如果需要注册添加 Servlet、Filter、Listener 为 Spring Bean&#xff0c;在 Spring Boot 中有两种方式&#xff1a;使用 Servlet 3.0 API 的注解 WebServlet、WebFilter、Listener 用来配置。Spring Boot JavaConfig…

对象克隆+深浅拷贝

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 对象拷贝 的概念 &#xff0c; 特别是对 深拷贝和浅拷贝 的理解&#xff1b; 0.2&#xff09; 最后&#xff0c;我们还要看一个 clone 的荔枝&#xff1b; 【1】对象克隆相关 1…

read cache_通过READ-BEHIND CACHE控制您的慢速生产者

read cache在我们的互联世界中&#xff0c;我们经常使用我们不拥有或无权改善的API中的数据。 如果一切顺利&#xff0c;他们的表现就会很好&#xff0c;每个人都会高兴。 但是太多次&#xff0c;我们不得不使用延迟小于最佳延迟的 API。 当然&#xff0c;答案是缓存该数据 。…

azkaban mysql参数_azkaban参数详解

参数传递是调度字体工作流运行时非常重要的一部分&#xff0c;工作流的执行&#xff0c;单个作业的执行&#xff0c;多个工作流之间的依赖执行&#xff0c;历史任务重算&#xff0c;都涉及到参数传递和同步。1 参数类型综述azkaban的工作流中的参数可以分为如下几个类型&#x…

接口与回调

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 接口与回调 概念 &#xff1b; 【1】接口与回调相关 1.1&#xff09;回调定义&#xff1a; 回调是一种常见的程序设计模式&#xff0c; 在这种模式中&#xff0c; 可以指出某个…

spring react_使用Spring Cloud Gateway保护React式微服务

spring react朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 数分钟之内即可在任何应用程序中对用户进行身份验证&#xff0c;管理和保护。 所以你想完全React&#xff0c;是吗&#xff1f; 大&#xff01; React式编程是使…

mysql断电同步不起作用_mysql主从同步因断电产生的不能同步问题

偶尔因为断电导致mysql slave 出现复制错误“Could not parse relay log event entry”Could not parse relay log event entry. The possible reasons are: the masters binary log is corrupted (you can check this by running mysqlbinlog on the binary log), the slaves …

图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)

【0】README 0.1&#xff09;为什么有这篇文章&#xff1f;因为 Dijkstra算法的优先队列实现 涉及到了一种新的数据结构&#xff0c;即优先队列&#xff08;二叉堆&#xff09;的操作需要更改以适应这种新的数据结构&#xff0c;我们暂且吧它定义为Distance&#xff0c; 而不是…

cucumber测试_如何在Cucumber中进行后端测试

cucumber测试Cucumber是一种规范语言的执行框架。 它并不是要成为测试语言&#xff0c;而是用于创建测试自动化。 Cucumber最适合出现一些实际参与者互动并取得某种成果的情况。 当可以从用户的角度编写它时&#xff0c;它特别有用。 Given Sarah is a premium club member W…

linux mysql删除密码忘记了_linux下忘记mysql密码的几种找回方法(推荐)

今天我们主要是讲一下关于linux忘记mysql密码处理方法&#xff0c;下面提供了5种linux忘记mysql密码找回方法哦。方法一(先进入root权限)&#xff1a;# /etc/init.d/mysql stop# mysqld_safe --usermysql --skip-grant-tables --skip-networking &# mysql -u rootmysql>…

Dijkstra 算法——计算有权最短路径(边有权值)

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff0c; 源代码均为原创&#xff0c; 旨在理解 Dijkstra 的思想并用源代码加以实现&#xff1b; 0.2&#xff09;最短路径算法的基础知识&#xff0c;参见 http://blog.csdn.net/pacosonswjtu/article/detail…