技术标签: java
什么时候用接口:当抽象类中的方法都是抽象方法的时候,该抽象类可以用另外一种形式来定义和表示,那就是接口interface。
接口概述:接口和数组、类、抽象类是同一个层次的概念。
为什么要有接口:接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面地专业地实现了:规范和具体实现的分离。
定义接口的关键字:interface
【示例】接口的定义
interface 接口名 [extends 父接口1, 父接口2, …] { // 常量定义 // 方法定义 } |
定义接口所在的仍为.java 文件(虽然声明时使用的为interface 关键字的编译后仍然会产生.class 文件)。
接口可以看做是一种只包含了功能声明的特殊类。
注意:使用extends可实现接口的多继承!接口不能实例化!
接口的组成:
接口中定义的属性:都属于全局静态常量,默认由public static final 来修饰。
接口中定义的方法:在JDK1.8以前,都属于抽象方法,默认由public abstract来修饰, 在JDK1.8以后,接口中还可以包含普通的静态方法和default修饰的成员方法。
【示例】接口的组成
public interface Flyable { // 属性:默认为全局静态属性 /public static final/ double MAX_HEIGHT = 8000; // 方法:JDK1.8以前默认为抽象方法 /public abstract/ void fly(); // JDK1.8之后还可以包含静态方法和default修饰的成员方法 public static void showInfo1() {} default void showInfo2() {} } |
注意:接口中不能有构造方法,因为接口中没有需要初始化的成员变量。
类与类的继承:extends。类与接口的继承:implements。
接口实现格式:
class 实现类 [extends 父类] implements 接口 { // 重写接口中的方法 } |
在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑。
【示例】接口的实现
// 接口 interface Flyable { // 建议不要省略,以提高阅读性 /public abstract/ void fly(); } // 实现类 class Bird implements Flyable{ public void fly() { System.out.println("鸟儿在天空自由的飞翔"); } } // 测试类 public class Test { public static void main(String[] args) { Bird bird = new Bird(); bird.fly(); } } |
注意事项:
1)如果子类实现了接口的所有抽象方法,那么该子类可以实例化
2)如果子类只实现了接口的部分抽象方法,那么子类就是一个抽象类,不能被实例化!
了解了接口的特点后,那么想想为什么要定义接口,使用抽象类描述也没有问题,接口到底有啥用呢?接口完全支持多实现,和类的继承类似,实现类可以实现多个接口,将会获得接口中所定义的一切。
在java中,一个类只能继承一个类,但同时可以实现多个接口,既可以实现多重继承的效果和功能,也避免的多重继承的危险性。
【示例】接口多实现案例
// 父类 class Person { String name; public void eat() {} } // 接口 interface Runner { public abstract void run(); } interface Flyer { public abstract void fly(); } // Student类,既继承Person类,又实现Runner和Flyer接口 class Student extends Person implements Runner, Flyer { @Override public void fly() { System.out.println("Student fly方法"); } @Override public void run() { System.out.println("Student run方法"); } } |
接口是对动作的抽象,抽象类是对根源的抽象。
抽象级别(从高到低):接口 > 抽象类 > 普通类。
接口:人可以吃东西,狗也可以吃东西,我们可以把“吃东西”定义成一个接口,然后让这些类去实现它。
抽象类:人有姓名和年龄属性,也有吃饭的行为,狗也有姓名和年龄属性,也有吃饭行为,我们可以把“相同的属性和行为”定义在一个抽象类中,然后让这些类去继承这个抽象类。
相同点:
不同点:
1)抽象类需要被继承extends,而且只能单继承;
接口需要被实现implements,而且可以多实现。
2)抽象类中可以定义成员变量也可以定义静态变量;
接口中定义的变量,默认为全局静态常量(public static final来修饰)。
3)抽象类中可以定义构造方法,方便子类调用并给抽象类中的成员变量赋值;
接口中不能定义构造方法,因为接口中没有成员变量需要初始化!
4)抽象类中可以定义普通方法,也可定义抽象方法(abstrct);
接口JDK1.8之前,只能定义抽象方法(public abstrct),JDK1.8之后还可以定义静态方法。
5)抽象类的继承,描述的“is a”关系,用于定义该体系的基本共性内容;
接口的实现,描述的“is like a”关系,用于定义体系之外的额外行为。
文章浏览阅读2.6k次。ONVIF鉴权实现代码生成gSOAP框架代码,这个网上有很多教程,需要加入很多文件,并且需要openssl库。加入需要鉴权的文件和openssl库以后,只需要加每个接口中加入鉴权操作的代码,调用的时候就能实现鉴权。ONVIF的鉴权分两种: HTTP Digest 和 WS-Username Token在ONVIF Device Test Tool上可以对两种鉴权分别进行测试。authenticate.h#ifndef __AUTHENTICATE_H__#define __AUTHENTICAT_digest&ws-username token
文章浏览阅读1.2k次。该篇文章主要来介绍如何减少APK体积,以帮助用户更快地下载App,并加速安装/更新过程。_android apk 大小优化
文章浏览阅读1.3k次。 --/*-----存储过程 分页处理 孙伟 2005-03-28创建 -------*/--/*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 -------*/--/*-----存储过程 分页处理 孙伟 2005-04-21修改 添加Distinct查询功能-------*/--/*-----存储过程 分页处理 孙伟 2005-05-18修改 多字段排序规则问题-_top 搭配not in 性能
文章浏览阅读1.5w次,点赞3次,收藏10次。VueUse官方链接一、什么是VueUseVueUse不是Vue.use !!!它是一个基于 Composition API 的实用函数集合,下面是具体的一些用法二、如何引入import { 具体方法 } from ‘@vueuse/core’三、下面来看看一些具体的用法1、useMouse:监听当前鼠标坐标的一个方法,他会实时的获取鼠标的当前的位置2、usePreferredDark:判断用户是否喜欢深色的方法,他会实时的判断用户是否喜欢深色的主题3、useLocalStorage:数据_vueuse/core
文章浏览阅读736次。转自:爱数据LoveD大家好,我是小z,也可以叫我阿粥~今天给大家分享一波统计学重要概念,顺便前排提示文末送书~从高的角度来看,统计学是一种利用数学理论来进行数据分析的技术。象柱状图这种基本的可视化形式,会给你更加全面的信息。但是,通过统计学我们可以以更富有信息驱动力和针对性的方式对数据进行操作。所涉及的数学理论帮助我们形成数据的具体结论,而不仅仅是猜测。利用统计学,我们可以更深入、更细致地观察数..._统计学五大基本原理
文章浏览阅读2.4k次,点赞3次,收藏9次。一、synchronized使用1.1 synchronized介绍在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。synchronized可以修饰普通方法,静态方法和代码块。当synchronize..._synchronized常见使用场景 threadsyntest.new myrunnable3
文章浏览阅读2k次。common_handle_option (continue) 909 case OPT_fcall_used_:910 fix_register (arg, 0, 1);911 break;912 913 case OPT_fcall_saved_:914 fix_register (arg, 0, 0)_-feliminate-unused-debug-types
文章浏览阅读2.7k次。商品参数作者:杨云著出版社:清华大学出版社出版时间:2013-8-1版次:1印次:1印刷时间:2013-8-1页数:434开本:16开装帧:平装ISBN:9787302318286版权提供:清华大学出版社编辑推荐《软件开发训练营·ASP.NET开发一站式学习:难点·案例·练习》特色:1.《软件开发训练营·ASP.NET开发一站式学习:难点·案例·练习》所讲内容既避开艰涩难懂的理论知识,又覆盖了编程..._python语言程序设计实践教程陈东课后习题答案解析
文章浏览阅读2k次。构建:从debug换成release:就可以正常运行了_qt安装后构建可以,运行就一直提示程序异常
文章浏览阅读601次。什么是机器学习?简单来说就是让机器帮我们找一个函数,即一个映射。如声音—>文字的语音识别函数自变量可以是向量,矩阵(图像识别),序列输出是数值、图片等课程讲什么?一、监督学习,给定图片人工的告诉机器其类型,训练模型,让机器拥有 f(图片)—>类型 这一函数二、训练模型之前进行Pre-train,让机器学习如何辨别图片这一基本功,因为人工输入图片类型过于繁琐。只需传入大量图片资料即可自动训练。如把图片翻转、变色,询问机器是不是可以..._李宏毅2021机器学习笔记 百度
文章浏览阅读1.7k次。两个map合并成一个map,用insert()函数就可以了,看代码:#include <map>#include <iostream>int main(){ std::map<int, int> v1 = {{1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}}; std::map<int, int> v2 = { {3, 2}, {4, 2}, {5, 2}, {6, 2}, {7_c++ map合并
文章浏览阅读1.3w次,点赞12次,收藏85次。步骤1、2、3、我喜欢一个文件夹下存放多个项目,所以删掉生成的CMakeList.txt、main.c和cmake-build-debug文件。新建一个List目录,并在该目录下新建CMakeList.txt4、创建一个C文件进行测试5、创建好后,提示在List文件夹下的CMakeList.txt添加:include_directories(.)add_executable(List-List01 List01.c) //List是文件夹名称,List01.c是具体文件名称_clion创建c语言项目