java中接口(interface)详解_java interface-程序员宅基地

技术标签: JAVA学习  java  interface  

接口(interface)

有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,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换汤不换药我这里就不赘述了(绝对不是因为太懒!)。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sun_shine56/article/details/86621481

智能推荐

基于Python的逆向工程:ELF文件_逆向工程 python-程序员宅基地

文章浏览阅读6.4k次。当解决复杂的逆向问题时,我们常使用radare2或IDA等成熟工具进行反汇编和调试。但有时也需要深入挖掘并了解它们是如何运作的。编写一些反汇编脚本对于自动化某些流程非常有用,并且可以形成自己的逆向工具链。至少,这是我现在正在尝试的事情。配置环境如标题所说的那样,你需要先安装Python 3。如果你无法确定是否安装了Python 3,可以运行如下命令:其中capstone是..._逆向工程 python

四种方法实现:找出数组中两个只出现一次的数字_一个数组中找出出现一次的2个数字-程序员宅基地

文章浏览阅读2.6k次。//先排序然后查找void FindNumsAppearOnce1(vector&lt;int&gt; data, int* num1, int *num2) { if (data.size() &lt; 2) return; sort(data.begin(), data.end()); vector&lt;int&gt; res; for (int i = 0; i &lt;..._一个数组中找出出现一次的2个数字

FL2440(S3C2440A 芯片) 开发板开发笔记_windows7l0ader.v2.1.5rar-程序员宅基地

文章浏览阅读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

antv x6沿边运动的动画_gettargetcell-程序员宅基地

文章浏览阅读2.4k次。实现效果要实现什么时候开始有运动小圆球的出现:1.在graph添加了内容之后,也就是可以看到图之后,让小圆球流动起来。2.再点击node的时候增加一个圆球。需求 1实现原理是,graph.fromJSON(this.graphData);添加之后,使用getNodes()获取所有节点,可根据节点存入的标识字段,找出默认开始的节点,代码如下:(这里可以看到一个自定义方法的使用graph.on("signal")),其中会利用getTargetCell找到节点的下一个连接点,继续添加动画小球。).._gettargetcell

Python 类的内建函数_对于类、实例和其它对象而言,存在着一些内建函数,这些内建函数无需定义,可直接调-程序员宅基地

文章浏览阅读633次。对于类、实例和其它对象而言,存在着一些内建函数,这些内建函数无需定义,可直接调用。本关的任务就是让学习者掌握并能使用这些内建函数。issubclass()是一个布尔函数,这个函数用来判断一个类是否是另外一个类的子类或者子孙类。如果给出的子类确实是给出的父类的子类,则返回True,否则返回False。它的语法如下:issubclass(subclass, parentclass)parentclass也可以是一个包含若干个父类的元组,只要子类属于元组中某一个父类,则返回True,否则返回Fa.._对于类、实例和其它对象而言,存在着一些内建函数,这些内建函数无需定义,可直接调

iText中输出 中文_使用资源字体(classpath) java代码-程序员宅基地

文章浏览阅读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代码

随便推点

win7下mysql的安装_[root@gaojiao ~]# mysql -uroot error 1045 (28000):-程序员宅基地

文章浏览阅读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

PHP微信公众平台开发高级篇--群发接口_微信公众号根据标签群发接口支持数组传参吗-程序员宅基地

文章浏览阅读2.3k次。群发消息接口订阅号:每天一条的群发权限服务号:每月(自然月)4条群发权限实例&lt;?php/** * 群发接口 * PS:群发之前调用“预览接口”进行测试 * PS:通过第三方后台调用微信上传图片素材接口,获取图片url,如:{"url":"http:\/\/mmbiz.qpic.cn\/mmbiz_jpg\/BdxWN2kspVgJOFpRHJojlWmbl0pM..._微信公众号根据标签群发接口支持数组传参吗

TCP拥塞控制:慢启动,拥塞避免,快重传/快恢复_许多tcp实现中,每收到两个连续的数据片就发送一个ack片,这种做法对慢启动和拥塞避-程序员宅基地

文章浏览阅读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片,这种做法对慢启动和拥塞避

使用openGL播放任意格式视频_c# opengl 视频-程序员宅基地

文章浏览阅读5.5k次,点赞4次,收藏14次。最近在做一个关于openGL的课程项目,需要在openGL中渲染出一个视频,网上找了一下方法,发现都是处理的都是yuv格式和rgb格式视频,而我需要处理mp4,avi等格式。最后想了一下使用openCV+ openGL解决这个问题。配置使用openGL的openCV:先下载openCV,我使用的版本是opencv2.4.13.6Window环境下:安装cmake-gui c..._c# opengl 视频

redis一键获取value_redis 获取value-程序员宅基地

文章浏览阅读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

如何解决 Spring JPA @Table 和 @Column 失效的问题_springboot3 jpa @column-程序员宅基地

文章浏览阅读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