零基础Java学习之接口
介绍
接口的介绍我们从三个方面来说:
- 从使用上来说是继承的一种扩展,因为java不支持多继承,而有了接口就能够实现多继承的效果。
- 有时候需要必须从几个类中抽取出一些共同的行为特征,而它们之间又没有继承的关系,仅仅是具有相同的行为特征而已,比如人和动物都会跑,但是他们不是属于一类的,而且跑的行为的表现形式不一样,他们仅仅都具有跑这个行为而已。
- 接口可以看出是一种规范,标准,它用来定义了一组规则。如果你需要用到了该接口(再次强调不是继承的关系),那你必须要遵守这个规范。
定义
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。(官方定义)
换句话说就是:接口,是Java语言中一种引用类型,是方法的集合,接口的内部只是声明了方法,并没有实现(也不能实现)。
注:引用数据类型:数组,类,接口
接口声明格式
【修饰符】 interface 接口名 [extends 其他的接口名]{//接口的成员列表:// 静态常量// 抽象方法// 默认方法// 静态方法// 私有方法
}
接口声明需要注意:
- 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
- 接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
- 接口中的方法都是公有的。
JDK 1.8之前
- 接口中所有的成员变量,默认都是共有的静态常量(其中public static final可以省略)
- 接口中的所有成员方法,默认都是共有的抽象方法(其中public abstract可以省略)
- 接口不能实例化对象的,也没有构造器
- 没有初始化块
在JDK 1.8时
- 接口中允许声明默认方法(public 可以省略,建议保留)
default void 方法名(){ 方法体 }
使用方法: 对象名.方法名;
可以被实现类重写- 接口中允许声明静态方法(public 可以省略,建议保留)
static void 方法名(){ 方法体 }
使用方法:接口名.方法名(); 一般使用在工具方法上
实现
当接口被定义后,一个或者多个类都可以实现该接口(前面说的几个类中抽取出一些共同的行为特征),也可以一个类实现多个接口。接口的实现需要在相应的类的定义中包含 implements关键字。
语法格式
【修饰符】 class 实现类 implements 接口1【,接口2, ...】{ //一个类可以同时实现多个接口// 重写接口中抽象方法【必须】,当然如果实现类是抽象类,那么可以不重写// 重写接口中默认方法【可选】
}
接口实现需要注意:
- 必须重写接口中所有抽象方法。
- 继承了接口的默认方法,即可以直接调用,也可以重写。
重写时,default单词就不要再写了,它只用于在接口中表示默认方法,到类中就没有默认方法的概念了- 不能重写静态方法
- 如果多个接口中有抽象方法有重名的,只需要重写一次
代码示例
public interface Attack {void attack();
}public interface Fly extends Aa,Ba{int id = 1; // 默认共有的静态常量void method(); //默认共有的抽象方法}public class Aircraft implements Fly,Attack {//所有的抽象方法都得实现@Overridepublic void attack() {System.out.println("攻击");}@Overridepublic void method() {}}
接口中方法的调用
说明
对于接口的抽象方法、默认方法,通过实现类对象就可以调用;
但是对于接口的静态方法,必须使用接口名才能调用
代码实例
public interface Fly {public void fly(); //抽象方法//静态方法(默认共有的)static void staticMethod(){System.out.println("Fly中的静态方法");}//默认方法default void defauleMethod(){System.out.println("Fly中的默认方法");}
}public class Aircraft implements Fly {@Overridepublic void fly() {System.out.println("飞机会飞");}@Overridepublic void defauleMethod() {System.out.println("飞机重写的默认方法");}}public class Demo1 {public static void main(String[] args) {Fly.staticMethod();//接口的静态方法可以通过接口名调用Aircraft aircraft = new Aircraft();// aircraft.staticMethod(); 静态方法不能通过对象调用// Fly.defaultMethod(); 默认方法不能通过接口调用调用aircraft.defauleMethod();//默认方法通过对象调用}
}
接口的继承
说明
一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。在Java中,类的多继承是不合法,但接口允许多继承(类的扩展的体现)。在接口的多继承中extends关键字只需要使用一次,在其后跟着其他需要继承接口。
语法格式
public interface 接口名1 extends 接口名2 【, 接口名2,...】{ }
子接口继承父接口的方法;如果实现了某一个接口,其父类的抽象方法也必须实现
子接口重写默认方法时,default关键字可以保留。
代码示例
interface A {void a();public default void methodA(){System.out.println("接口A的方法");}
}interface B {void b();public default void methodB(){System.out.println("接口B的方法");}
}interface C extends A,B{@Overridepublic default void methodB() {System.out.println("接口C的方法");}
}class D implements C{@Overridepublic void a() {System.out.println("xxxxx");}@Overridepublic void b() {System.out.println("yyyyy");}}
标记接口
介绍
最常用的继承接口是没有包含任何方法的接口,称为标记接口。
标记接口是没有任何方法和属性的接口。它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。
标记接口作用
简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。
建立一个公共的父接口:
你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。向一个类添加数据类型:
这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。
举例
java.awt.event 包中的 MouseListener 接口继承的 java.util.EventListener 接口定义如下:
package java.util;
public interface EventListener{ }
经典接口介绍
java.lang.Comparable
基本数据类型的数据(除boolean类型外)需要比较大小的话,直接使用比较运算符即可,但是引用数据类型是不能直接使用比较运算符来比较大小的,而这个又是比较常用的。那么,如何解决这个问题呢?
Java给所有引用数据类型的大小比较方式,即指定了一个标准接口,就是java.lang.Comparable接口:
package java.lang;public interface Comparable{int compareTo(Object obj);
}
如果想要比较某个类的对象的大小时候时,按照如下步骤执行:
第一步:哪个类的对象要比较大小,哪个类就实现java.lang.Comparable接口,并重写方法
- 方法体就是你要如何比较当前对象和指定的另一个对象的大小
第二步:对象比较大小时,通过对象调用compareTo方法,根据方法的返回值决定谁大谁小。
- this对象(调用compareTo方法的对象)大于指定对象(传入compareTo()的参数对象)返回正整数
- this对象(调用compareTo方法的对象)小于指定对象(传入compareTo()的参数对象)返回负整数
- this对象(调用compareTo方法的对象)等于指定对象(传入compareTo()的参数对象)返回零
代码示例
package com.atguigu.bean;public class Person implements Comparable{private int id;private String name;private int age;public Person() {}public Person(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}/*根据年龄排序*/@Overridepublic int compareTo(Object o) {//多态参数 Object o=new Person()if (this == o)return 0; //地址一样,则相同if (o instanceof Person){Person per = (Person)o;return this.age - per.age;}return -1; //类型不一致,直接小于}
}import com.atguigu.bean.Person;import java.util.Arrays;public class Demo2 {public static void main(String[] args) {Person[] persons=new Person[5];persons[0]=new Person(1,"翠花",18);persons[1]=new Person(2,"小芬",28);persons[2]=new Person(3,"lily",16);persons[3]=new Person(4,"狗蛋",38);persons[4]=new Person(5,"石破天",19);Arrays.sort(persons);for (int i = 0; i < persons.length ; i++) {System.out.println(persons[i].toString());}}}
java.util.Comparator
如果一个类,实现了Comparable接口,也指定了两个对象的比较大小的规则(也可能没有实现),但是此时此刻如果不想按照它预定义的方法比较大小,该怎么办?(不能随意修改,因为会影响其他地方的使用)
JDK在设计类库之初,也考虑到这种情况了,所以又增加了一个java.util.Comparator接口。
package java.util;public interface Comparator{int compare(Object o1,Object o2);
}
如果想要比较某个类的对象的大小时候时,按照如下步骤执行:
第一步:编写一个类,我们称之为比较器类型,实现java.util.Comparator接口,并重写方法
- 方法体就是你要如何指定的两个对象的大小
第二步:比较大小时,通过比较器类型的对象调用compare()方法,将要比较大小的两个对象作为compare方法的实参传入,根据方法的返回值决定谁大谁小。
- o1对象大于o2返回正整数
- o1对象小于o2返回负整数
- o1对象等于o2返回零
代码示例
import com.atguigu.bean.Employee;import java.util.Arrays;
import java.util.Comparator;public class Demo3 {public static void main(String[] args) {Employee[] employees = new Employee[5];employees[0] = new Employee(1,"jack1",2000.6);employees[1] = new Employee(2,"jack2",1001);employees[2] = new Employee(3,"jack3",5000);employees[3] = new Employee(4,"jack4",2000.3);employees[4] = new Employee(5,"jack5",3000);Arrays.sort(employees,new Myclass());for (int i = 0; i < employees.length; i++) {System.out.println(employees[i]);}}
}class Myclass implements Comparator {/*按照薪资进行排序*/@Overridepublic int compare(Object o1, Object o2) {if (o1 == o2)return 1;if (o1 instanceof Employee && o2 instanceof Employee){Employee employee1 = (Employee) o1;Employee employee2 = (Employee) o2;return (int) (employee1.getSalary() - employee2.getSalary());}return -1;}
}
零基础Java学习之接口相关推荐
- java学习笔记:零基础java学习路线+配套资料+书籍推荐
公众号菜鸟名企梦2018年,精品文章汇总: 01 我的秋招 我的秋招offer 我的offer选择 秋招全面总结-必读宝典 求职必读 02 零基础学习路线 零基础-java学习路线(上) 零基础-ja ...
- 授人予鱼不如授人予渔:零基础java学习路线分享
一切不以求职找工作为目标的学习路线分享都是耍流氓. 博主是19年7月毕业的应届生:985.A+学科硕士.2018年的秋招收获了:百度.腾讯.头条.美团.猿辅导.度小满.猫眼.流利说等offer.off ...
- 零基础——java学习路线(下)
学习路线分上中下三篇,前两篇已经发布了,本文是学习路线系列的最后一篇.有没有提到的点或学习疑问欢迎评论区留言~ 公众号后台回复"资料"即可获取学习资料大礼包,你想找的基本都有,外加 ...
- 零基础Java学习之多态
介绍 多态是Java的三大特性之一,另外两个分别是:继承和封装(前面博客已经说了继承和封装了,可以看一下).这两个可以说在一定程度了为多态打下了基础. 通过多态,可以实现一个行为具有多种形态,这里的形 ...
- 零基础Java学习之继承
继承 继承的概述 继承的理解 继承的好处 继承的格式 继承的特点一:成员变量 私有化(private) 成员变量不重名 成员变量重名 继承的特点二:成员方法 成员方法不重名 成员方法重名--重写(Ov ...
- 零基础Java学习之包(Package)
包的作用 1.可以避免类重名 有了包之后,类的全名称就变为:包.类名 2.分类组织管理众多的类 例如: java.lang----包含一些Java语言的核心类,如String.Math.Integer ...
- 零基础Java学习之成员变量
成员变量 成员变量的分类 实例变量:也叫对象属性,属于某个对象的,通过对象来使用 类变量:属于整个类的,不是属于某个实例,后面static部分讲解. 如何声明实例变量? [修饰符] class 类名{ ...
- 零基础Java学习之抽象类
抽象类 介绍 抽象:即不具体.或无法具体 例如:当我们声明一个几个图形类:圆.矩形.三角形类等,发现这些类都有共同特征:求面积.求周长.获取图形详细信息.那么这些共同特征应该抽取到一个公共父类中.但是 ...
- 零基础Java学习之初级项目实践(客户信息管理软件-附源码)
项目涉及知识点 基础的面向对象编程项目. 类和对象(属性.方法及构造器) 类的封装 引用数组 数组的插入.删除和替换 对象的聚集处理 多对象协同工作 需求说明 总体说明 模拟实现基于文本界面的< ...
最新文章
- 【Qt】QTest:编译Qt单元测试程序
- React学习(1)——JSX语法与React组件
- linux ruby 安装路径,Linux(CentOS 7)安装ruby
- Github上都没有的“网约车”项目,终于有人给写出来了!
- 《学习CSS布局》学习笔记
- 笨办法学 Python · 续 练习 32:扫描器
- Google 与微软的浏览器之争
- p语言是python吗-为什么说Python是一门动态语言--Python的魅力
- rpcbind相关漏洞验证
- blender导出html,神器,C4D互导插件,可与Maya和Blender模型快速复制粘贴导出脚本Quick CopyPaste (Blender, Maya, C4D)...
- 鸿蒙无锡有什么特产,无锡太湖鼋头渚十大特产
- 仿百度糯米TP5项目笔记
- 《Effective Java》读书笔记五(枚举和注解)
- 【leetcode】2248. 多个数组求交集(js实现)
- 陕西延安一男子看钓鱼忘拉手刹,爱车溜进鱼塘:自己都惊呆了
- 如何使计算机每隔X秒按一次键
- 【leetcode 993】【二叉树的堂兄弟节点】
- 网站引用阿里云oss里面的远程字体图标不显示解决方案
- 7-8 金银铜牌 (15 分)
- latex的图的排列方法_latex多幅图片排列 2*2示例
热门文章
- 信道编码之编码理论依据
- 平安技术开放日质量保证技术专场第一期 [附部分 ppt]
- 【log】12/11 checking project:(Laravel)snsTest
- Android中使用running services查看service进程内存
- 亚马逊AWS在线系列讲座——基于AWS云平台的高可用应用设计
- c#初学-索引器get和set的使用(泛型类)
- 创建与SharePoint 2010风格一致的下拉菜单 (续) 整合Feature Custom Action框架
- WF流程设计器升级说明
- 王者荣耀s22服务器未响应是什么意思,王者荣耀s22资源包升级失败 s22解析包出现问题解决方法...
- 频谱中负频率的物理意义(二)