有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。有了接口,就可以得到多重继承的效果。
接口(interface)是抽象方法和常量值的定义的集合。
从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
接口定义举例
public interface Runner
int id = 1
public void start()
public void run()
public void stop()
}
案例:
蝙蝠会飞,又会用牙齿咬
首先定义一个飞行的接口:
package cn.com.Classwork190124;
/*
如果一个类中,既有抽象方法,又有非抽象方法,那么该类只能定义为抽象类,不能定义为接口
如果一个类中,只有抽象方法,没有非抽象方法,那么该类可以定义为接口
一般就定义为接口
定义一个接口,使用interface关键字 接口,类,枚举,注解等都是java中的类型
接口中所有的方法,都是抽象方法
所以也可以说,接口就是一个特殊的抽象类
接口中除了定义方法外,还可以定义成员变量
特点;方法和属性默认都是public修饰,也可以使用protected,但不能用private
所有的属性都是静态的常量,默认省略了static和final修饰符,属性的值必须实例化(初始化)
*/
public interface Flyable {
public final int wingsNumber = 2;
public abstract void fly();
}
接着定义一个咬人的接口:
package cn.com.Classwork190124;
public interface Bitable {
public int teethNumber = 0;
public abstract void bite();
}
最后定义蝙蝠类去实现这两个接口:
package cn.com.Classwork190124;
/*
在JAVA中,一个类无法继承自多个类,但是可以实现多个接口,使用关键字implements
多个接口之间使用“,”隔开 多个接口之间,没有先后顺序
这个类叫做实现类,这个类必须实现所有接口的所有方法
*/
public class Bat implements Flyable,Bitable {
@Override
public void bite() {
System.out.println("吸血");
}
@Override
public void fly() {
System.out.println("用翅膀飞");
}
public static void main(String[] args) {
System.out.println(Flyable.wingsNumber);
}
}
用 interface 来定义。
接口中的所有成员变量都默认是由public static final修饰的。
接口中的所有方法都默认是由public abstract修饰的。
接口没有构造方法。构造方法用于创建对象
实现接口的类中必须提供接口中所有方法的具体实现内容。
多个无关的类可以实现同一个接口
一个类可以实现多个无关的接口
与继承关系类似,接口与实现类之间存在多态性
接口也可以继承另一个接口,使用extends关键字。
实现接口的类中必须提供接口中所有方法的具体实现内容。
多个无关的类可以实现同一个接口
一个类可以实现多个无关的接口
与继承关系类似,接口与实现类之间存在多态性
定义Java类的语法格式:
< modifier> class < name> [extends < superclass>]
[implements < interface> [,< interface>]* ] {
< declarations>*
}
此外,接口还常常被用来当做定义常量的集合:
package cn.com.Classwork190124;
/*
接口也经常用来被定义常量的集合 默认省略public static final
定义更简单,使用更方便
*/
public interface Power {
int vol = 220;
double hz = 50.0;
}
案例:
如果实现接口的类中没有实现接口中的全部方法,必须将此类定义为抽象类。
接口也可以继承另一个接口,使用extends关键字
interface MyInterface
{
String s=“MyInterface”;
public void absM1();
}
interface SubInterface extends MyInterface
{
public void absM2();
}
public class SubAdapter implements SubInterface
{
public void absM1(){System.out.println(“absM1”);}
public void absM2(){System.out.println(“absM2”);}
}
JDK8新增接口中抽象方法的默认实现 使用default关键字
package cn.com.Classwork190124;
public interface Bitable {
public int teethNumber = 0;
//public abstract void bite();
/*
java新增接口中抽象方法的默认实现 使用default关键字
加上default关键字后需要实现方法体
子类中成为覆盖该方法
*/
default void bite() {
System.out.println("用牙齿咬");
}
}
注意:如果实验发现明明用的是jdk8却报错为:Extension methods are not supported at language level '6’ 请进入idea file->project structure 在project选项卡下将图中被圈的部分改为8即可(language level不能比项目的jdk版本高)。
还可以附带static的默认实现方法
package cn.com.Classwork190124;
/*
接口也经常用来被定义常量的集合 默认省略public static final
定义更简单,使用更方便
*/
public interface Power {
int vol = 220;
double hz = 50.0;
/*
jdk8新增功能
*/
public static void lightOn(){
System.out.println("默认的点灯方法");
}
public static void main(String[] args) {
Power.lightOn();
}
}
定义一个接口用来实现两个对象的比较。
package cn.com.Classwork190124;
public interface CompareObject<object> {
public int compareto(object o);
//若返回值是 0 , 代表相等; 若为正数,代表当前对象大;负数代表当前对象小
}
定义一个Circle类。
package cn.com.Classwork190124;
public class Circle {
private double radius;
private final double PI=3.14;
public double findArea(){
return PI*radius*radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
}
定义一个ComparableCircle类,继承Circle类并且实现CompareObject接口。在ComparableCircle类中给出接口中方法compareTo的实现体,用来比较两个圆的半径大小。
package cn.com.Classwork190124;
public class ComparableCircle extends Circle implements CompareObject<Circle> {
@Override
public int compareto(Circle o) {
if(this.getRadius()==o.getRadius()){
return 0;
}else if(this.getRadius()<=o.getRadius()){
return -1;
}else {
return 1;
}
}
}
定义一个测试类TestInterface,创建两个ComaparableCircle对象,调用compareTo方法比较两个类的半径大小。
package cn.com.Classwork190124;
import java.util.Scanner;
public class TestInterface {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ComparableCircle c1 = new ComparableCircle();
ComparableCircle c2 = new ComparableCircle();
c1.setRadius(sc.nextDouble());
c2.setRadius(sc.nextDouble());
System.out.println(c1.compareto(c2));
}
}
思考:参照上述做法定义矩形类Rectangle和ComparableRectangle类,在ComparableRectangle类中给出compareTo方法的实现,比较两个矩形的面积大小。
emmmmm换汤不换药我这里就不赘述了(绝对不是因为太懒!)。
文章浏览阅读6.4k次。当解决复杂的逆向问题时,我们常使用radare2或IDA等成熟工具进行反汇编和调试。但有时也需要深入挖掘并了解它们是如何运作的。编写一些反汇编脚本对于自动化某些流程非常有用,并且可以形成自己的逆向工具链。至少,这是我现在正在尝试的事情。配置环境如标题所说的那样,你需要先安装Python 3。如果你无法确定是否安装了Python 3,可以运行如下命令:其中capstone是..._逆向工程 python
文章浏览阅读2.6k次。//先排序然后查找void FindNumsAppearOnce1(vector<int> data, int* num1, int *num2) { if (data.size() < 2) return; sort(data.begin(), data.end()); vector<int> res; for (int i = 0; i <..._一个数组中找出出现一次的2个数字
文章浏览阅读1.7k次。FL2440(S3C2440A 芯片) 开发板开发笔记开发板的拨码开关指南:FL2440 改 vnfg飞凌嵌入式 www. witech. com. cn 09. 8. 22 1开发板使用手册 version4. 0FL2440保定飞凌嵌入式技术有限公司网站:http: //www. witech. com. cn论坛:http: //bbs. wi tech. com. cn使用手册V4. 0FL2440 改 vnfg。_windows7l0ader.v2.1.5rar
文章浏览阅读2.4k次。实现效果要实现什么时候开始有运动小圆球的出现:1.在graph添加了内容之后,也就是可以看到图之后,让小圆球流动起来。2.再点击node的时候增加一个圆球。需求 1实现原理是,graph.fromJSON(this.graphData);添加之后,使用getNodes()获取所有节点,可根据节点存入的标识字段,找出默认开始的节点,代码如下:(这里可以看到一个自定义方法的使用graph.on("signal")),其中会利用getTargetCell找到节点的下一个连接点,继续添加动画小球。).._gettargetcell
文章浏览阅读633次。对于类、实例和其它对象而言,存在着一些内建函数,这些内建函数无需定义,可直接调用。本关的任务就是让学习者掌握并能使用这些内建函数。issubclass()是一个布尔函数,这个函数用来判断一个类是否是另外一个类的子类或者子孙类。如果给出的子类确实是给出的父类的子类,则返回True,否则返回False。它的语法如下:issubclass(subclass, parentclass)parentclass也可以是一个包含若干个父类的元组,只要子类属于元组中某一个父类,则返回True,否则返回Fa.._对于类、实例和其它对象而言,存在着一些内建函数,这些内建函数无需定义,可直接调
文章浏览阅读982次。iText中输出中文,有三种方式:1、使用iTextAsian.jar中的字体 BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);2、使用Windows系统字体(TrueType) BaseFont.createFont("C:/WINDOWS/Fonts/_使用资源字体(classpath) java代码
文章浏览阅读3.1k次。一 , 当前mysql的最新版本是5.5.25a。到http://dev.mysql.com/downloads/mysql/下载mysql安装文件 。我们这里下载mysql-5.5.25a-win32.msi就可以了,下载完,直接点击安装。mysql有好几个版本,稍微了解下各个版本之间的区别: MySQL Community Server :社区版本 不提供官方技术支持,是免费的_[root@gaojiao ~]# mysql -uroot error 1045 (28000): access denied for user 'r
文章浏览阅读2.3k次。群发消息接口订阅号:每天一条的群发权限服务号:每月(自然月)4条群发权限实例<?php/** * 群发接口 * PS:群发之前调用“预览接口”进行测试 * PS:通过第三方后台调用微信上传图片素材接口,获取图片url,如:{"url":"http:\/\/mmbiz.qpic.cn\/mmbiz_jpg\/BdxWN2kspVgJOFpRHJojlWmbl0pM..._微信公众号根据标签群发接口支持数组传参吗
文章浏览阅读1.4k次。需要明晰的几个概念: FlightSize:已发送但并未被ack确认的数据量 SMSS: sender MSS ssthresh = max (FlightSize / 2, 2*SMSS) ----公式1 SND.UNA:就是还没有收到ack的地方,也就是重复ACK指定的包 cwnd:拥塞窗口 cwnd congestion window慢启动: 采取的动作:将拥塞窗口(cwnd congestion window)设置为1个MSS,每经过一个rtt时,cwnd=cwnd2 _许多tcp实现中,每收到两个连续的数据片就发送一个ack片,这种做法对慢启动和拥塞避
文章浏览阅读5.5k次,点赞4次,收藏14次。最近在做一个关于openGL的课程项目,需要在openGL中渲染出一个视频,网上找了一下方法,发现都是处理的都是yuv格式和rgb格式视频,而我需要处理mp4,avi等格式。最后想了一下使用openCV+ openGL解决这个问题。配置使用openGL的openCV:先下载openCV,我使用的版本是opencv2.4.13.6Window环境下:安装cmake-gui c..._c# opengl 视频
文章浏览阅读3.1k次,点赞2次,收藏7次。redis获取valueredis一共有五种数据类型,如下数据类型写入方式查询方式string(字符串)set key valueget keyhash(哈希)hmset key value1 value2hgetall keylist(列表)lpush key valuelrange 0 -1set(集合)sadd key valuesmemgers keyzset(有序集合)zadd key 1 valuezrange 0 -1_redis 获取value
文章浏览阅读2.1k次。问题下面的代码,我们使用 Spring JPA 作为数据库访问层,并且用 @Table 和 @Column 定义了表和列名,但是 Hibernate 给出的 SQL 语句并没有使用我们定义的名称:/** * 节点 */@Entity@Table(name = "Node")@Datapublic class Node { @Id @GeneratedValue @Column(name = "ID") private int id; @Column(_springboot3 jpa @column