Java--接口

目录

语法规则

例子

实现多个接口

接口之间的继承

抽象类和接口的区别


在现实生活中,接口的例子比比皆是,比如:电源插座,主机上的USB接口等。这些插口中可以插所有符合规范的设备。通过这个例子我们知道,接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。在java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。

语法规则

通过关键字interface来定义一个接口。在创建接口时,接口的命名一般以大写字母I开头。

接口中的成员默认都是public static final的,接口中的成员方法默认都是public abstract的,所以一般都不写,保持代码简洁性。

interface IShape {
    //public static final int a = 10;
    int a = 0;
    //public abstract void draw();
    void draw();
}

在接口中,不可以有普通成员方法

java8开始,允许在接口当中定义一个default方法,这个方法可以有具体的实现

interface IShape {
    int a = 0;
    void draw();
    default public void test() {
        System.out.println("test()");
    }
}

接口当中的方法,如果是static修饰的方法,那么可以有具体的实现

    public static void test2() {
        System.out.println("static方法");
    }

接口当中不能有构造方法和代码块

接口不可以通过new关键字进行实例化

类和接口之间可以通过关键字implements来实现接口,且类中要重写接口中的抽象方法

class Rect implements IShape {
    @Override
    public void draw() {
        System.out.println("矩形");
    }
}

 当一个类实现接口当中的方法之后,当前类中的方法不能不加public

 接口可以发生向上转型,也可以发生动态绑定

public class Test8_4 {
    public static void drawMap(IShape iShape) {
        iShape.draw();
    }
    public static void main(String[] args) {
        IShape iShape = new Rect();
        drawMap(iShape);
        drawMap(new Flower());
    }
}

输出结果:

一个接口也会产生独立的字节码文件

例子

我们来看一个具体的例子:

新建一个名为IUSB的接口

public interface IUSB {
    void openDevice();//打开服务
    void closeDevice();//关闭服务
}

新建一个类Mouse,通过implements实现IUSB

public class Mouse implements IUSB{
    @Override
    public void openDevice() {
        System.out.println("打开鼠标");
    }
    @Override
    public void closeDevice() {
        System.out.println("关闭鼠标");
    }
    public void click() {
        System.out.println("点击鼠标");
    }
}

新建一个类keyBoard类,通过implements实现IUSB

public class keyBoard implements IUSB{
    @Override
    public void openDevice() {
        System.out.println("打开键盘");
    }
    @Override
    public void closeDevice() {
        System.out.println("关闭键盘");
    }
    public void inPut() {
        System.out.println("输入");
    }
}

新建一个Computer类,类中分别有三个方法,分别是打开电脑、关闭电脑、使用服务

public class Computer {
    public void powerOn() {
        System.out.println("打开笔记本电脑");
    }
    public void powerOff() {
        System.out.println("关闭笔记本电脑");
    }
    public void useDevice(IUSB iusb) {
        //启动服务
        iusb.openDevice();
        if (iusb instanceof Mouse) {
            //如果是鼠标调用 那么将iusb强转成Mouse类并调用click方法
            Mouse mouse = (Mouse) iusb;
            mouse.click();
        } else if (iusb instanceof keyBoard) {
            //如果是键盘调用 那么将iusb强转成keyBoard类并调用inPut方法
            keyBoard keyBoard = (demo4.keyBoard) iusb;
            keyBoard.inPut();
        }
        //关闭服务
        iusb.closeDevice();
    }
}

下面我们来测试一下useDevice方法

public static void main(String[] args) {
        Computer computer = new Computer();
        computer.powerOn();//打开电脑
        
        computer.useDevice(new Mouse());//鼠标
        computer.useDevice(new keyBoard());//键盘

        computer.powerOff();//关闭电脑
    }

你可以自己分析一下程序的输出结果是什么。

这里我直接给出运行结果:

实现多个接口

在java中,类和类之间是单继承的,一个类只能有一个父类,不支持多继承,但是一个类可以实现多个接口。我们认识了很多动物,有会飞的,会跑的,会游的,现在我们写一个代码来实现它。

新建一个IFlying接口

public interface IFlying {
    void fly();
}

新建一个ISwimming接口

public interface ISwimming {
    void swim();
}

新建一个IRunning接口

public interface IRunning {
    void run();
}

新建一个Animal类,这是一个抽象类

public abstract class Animal {
    public String name;
    public int age;
    public abstract void eat();
    //构造方法
    public Animal(String name,int age) {
        this.name = name;
        this.age = age;
    }
}

新建一个Dog类,继承Animal,并重写Animal中的抽象方法

public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println(this.name+"吃狗粮");
    }
    //构造方法
    public Dog(String name,int age) {
        super(name, age);
    }
}

对于狗来说,他会狗刨(游泳),会跑,他的功能不止一个,通过implements实现IRunning和ISwimming,并重写接口中的方法

public class Dog extends Animal implements IRunning,ISwimming{
    @Override
    public void eat() {
        System.out.println(this.name+"吃狗粮");
    }
    //构造方法
    public Dog(String name,int age) {
        super(name, age);
    }

    @Override
    public void run() {
        System.out.println(this.name+"用狗腿跑");
    }

    @Override
    public void swim() {
        System.out.println(this.name+"正在狗刨");
    }
}

【注】一定是先继承,再实现;在java中只能继承一个类,实现多个接口。

新建一个Bird类,继承Animal,实现IRunning,IFlying接口

public class Bird extends Animal implements IFlying,IRunning{
    @Override
    public void eat() {
        System.out.println(this.name+"吃鸟食");
    }
    public Bird(String name,int age) {
        super(name, age);
    }

    @Override
    public void run() {
        System.out.println(this.name+"用鸟腿跑");
    }

    @Override
    public void fly() {
        System.out.println(this.name+"正在飞");
    }
}

新建一个测试类Test10_1

public class Test10_1 {
    public static void test1(Animal animal) {
        animal.eat();
    }
    public static void test2(IRunning iRunning) {
        iRunning.run();
    }
    public static void test3(ISwimming iSwimming) {
        iSwimming.swim();
    }
    public static void test4(IFlying iFlying) {
        iFlying.fly();
    }
    public static void main(String[] args) {
        Dog dog = new Dog("小狗",2);
        Bird bird = new Bird("小鸟",1);
        test1(bird);
        test1(dog);
        System.out.println("==========================");
        //dog和bird都实现了IRunning
        test2(bird);
        test2(dog);
        System.out.println("==========================");
        //只有dog实现了ISwimming
        test3(dog);
        System.out.println("==========================");
        //只有bird实现了IFlying
        test4(bird);
        System.out.println("==========================");
    }
}

你可以自己分析一下输出结果是什么。

这里我直接给出结果:

现在我们再新建一个Robot类,它不属于动物,但有跑的功能

public class Robot implements IRunning{
    @Override
    public void run() {
        System.out.println("机器人在跑");
    }
}
    public static void main(String[] args) {
        test2(new Robot());
    }

输出结果为:

只有具备功能即可,十分灵活。

通过上面这个例子,我们知道,继承表达的是is-a的语义,而接口表达的是具有xxx特性

接口之间的继承

现在我们定义三个接口A、B、C

interface A {
    void testA();
}
interface B {
    void testB();
}
interface C {
    void testC();
}

现有一个接口具备B和C接口的功能,难道要再新建一个接口D,把B、C的功能放进去吗?

interface D {
    void testB();
    void testC();
}

这样写不太合适,不能解决长久的问题,我们可以用关键字extends,此时extends意为拓展

interface D extends B,C{
   //D这个接口具备了B和C的功能,同时D可以也定义属于自己的功能
    void testD();
}

那么当一个类实现D接口时,要重写B、C、D的方法

public class Test10_2 implements D{
    @Override
    public void testB() {
        System.out.println("B");
    }

    @Override
    public void testC() {
        System.out.println("C");
    }

    @Override
    public void testD() {
        System.out.println("D");
    }
}

接口间的继承相当于把多个接口合并在一起。

抽象类和接口的区别

区别抽象类(abstract)接口(interface)
结构组成普通类+抽象方法抽象方法+全局常量
权限各种权限public
子类使用使用extends关键字继承抽象类使用implements关键字实现接口
关系一个抽象类可以实现若干接口接口不能继承抽象类,但是接口可以使用extends关键字继承多个父接口
子类权限一个子类只能继承一个抽象类一个子类可以实现多个接口

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: weixin-java-mp是一个基于Java开发的微信公众平台开发工具包。它提供了丰富的接口和功能,方便开发者与微信公众号进行交互和开发。 weixin-java-mp支持公众号的基本操作,例如消息的接收和发送、用户管理、素材管理等。开发者可以使用weixin-java-mp来构建自己的公众号,并通过自定义的逻辑来处理微信用户的操作和请求。 weixin-java-mp还提供了丰富的API接口,允许开发者根据自己的需求进行接口的调用和业务逻辑的实现。开发者可以通过调用weixin-java-mp提供的API接口,实现用户信息的获取、发送模板消息、创建自定义菜单等功能。 除了基本的功能和接口,weixin-java-mp还支持微信支付的功能。开发者可以通过weixin-java-mp来实现微信支付的相关逻辑,例如生成支付二维码、处理支付回调等。 总的来说,weixin-java-mp是一个强大的工具包,提供了丰富的功能和接口,方便开发者进行微信公众号的开发和管理。无论是开发新的公众号应用还是对已有公众号进行升级和优化,使用weixin-java-mp都能够提高开发效率,减少开发工作量。 ### 回答2: weixin-java-mp是一个基于Java的微信公众号开发框架。它提供了一系列的接口和工具,方便开发者与微信公众号进行交互和开发。 首先,weixin-java-mp可以帮助开发者实现与微信公众号的接入和消息事件的处理。它提供了接口来验证开发者的服务器配置信息,并能够接收、解析和处理微信公众号发送的消息和事件,比如文本消息、图片消息、菜单点击事件等。 其次,weixin-java-mp还封装了微信公众号的各种功能接口开发者可以利用这些接口实现自定义的功能。例如,发送回复消息、获取用户信息、创建自定义菜单、上传下载媒体文件等等。开发者可以根据自己的需求选择合适的接口来实现对微信公众号的操作。 此外,weixin-java-mp还提供了一些常用的工具类,例如消息加解密工具、支付签名工具等,方便开发者进行相关功能的开发和调试。 总的来说,weixin-java-mp是一个功能丰富、易于使用的微信公众号开发框架,可以帮助开发者快速搭建和开发微信公众号的各种功能,使开发工作变得更加高效和便捷。 ### 回答3: weixin-java-mp是一个Java开发的微信公众号开发框架,它提供了一系列方便的功能和API,方便开发者进行微信公众号的开发和管理。 weixin-java-mp可以帮助开发者快速搭建微信公众号应用,提供了与微信服务器进行交互的工具类和方法。开发者可以使用weixin-java-mp来处理接收到的微信消息、回复消息、获取用户信息、创建自定义菜单等功能。同时,weixin-java-mp还支持微信支付、素材管理、用户管理、模板消息等高级功能的开发和调用。 weixin-java-mp使用了面向对象的设计模式,提供了丰富的API接口,让开发者能够方便地与微信服务器进行通信。它使用了一种简单且灵活的方式来定义和处理微信消息,可以根据不同的消息类型进行相应的处理,比如文本消息、图片消息、语音消息等。通过weixin-java-mp,开发者可以轻松地处理和响应用户发送的不同类型的消息。 此外,weixin-java-mp还支持多种微信支付方式的开发和调用,包括统一下单、订单查询、退款等功能,方便开发者进行商业化的微信公众号应用开发开发者可以使用weixin-java-mp来方便地调用这些支付接口,实现微信支付的功能。 总之,weixin-java-mp是一个功能强大且易于使用的微信公众号开发框架,它提供了丰富的API和工具类,方便开发者进行微信公众号应用的开发和管理。无论是开发者初学者还是有经验的开发者,都可以使用weixin-java-mp来快速搭建微信公众号应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值