接口(Java)

接口(Java),第1张

1、引言

1、Java中不支持类的多重继承,有了接口,就可以达到实现多重继承的效果,因为接口可以多继承

2、有时侯,我们需要抽取一些具有共同行为特性的事物,但是它们又没有“is a”的关系,如:手机、电脑、电视机、相机、打印机、摄像头等,它们都支持USB链接。我们想将它们实现USB功能,如果用类继承类去造的话显然就不合适。然而这些电子设备它不是简简单单的USB,这时候我们就可以通过造一个USB接口,将它分装起来,再通过造具体实现类去实现相应接口的功能

3、接口和类 Java中,我们可以说是并列的结构,有时候我们也形象的叫接口为接口类

2、接口的好处

1、Java类可以实现多个接口>>>><<<<而类继承类只能实现单个继承,接口就弥补了Java中单继承的局限性

2、接口与接口之间可以继承,而且还可以多继承

interface Jiekou{
    void run();
    public abstract void walk();
​
    static void StaticMethod() {
        System.out.println("定义静态方法");
    }
    default void DefaultMethod() {
        System.out.println("定义默认方法");
    }
}
interface Jiekou2 extends Jiekou{  //子接口继承父接口
    void go();
    
    @Override //还可以重写父接口的方法
    default void DefaultMethod() {
        Jiekou.super.DefaultMethod();
    }
}
​
interface Jiekou1{
    static void StaticMethod() {
        System.out.println("定义静态方法");
    }
    default void DefaultMethod() {
        System.out.println("定义默认方法");
    }
}
interface Jiekou2 {
    void go();
}
interface Jiekou3 extends Jiekou,Jiekou2{//接口多继承
}
3、接口的定义

1、接口使用interface关键字来定义

2、java中,接口和类是并列的两个结构

3、定义接口,就是定义接口中的成员

interface Jiekou{   //定义接口
    int i1= 10;  
    public static final int i2=100;
    //两个全局常量的定义,一个省略了前缀“public static final”,一个没有,都一样,不影响
    void run();
    public abstract void walk();
    //两个抽象方法的定义,一个省略了前缀“public abstract”,一个没有,都一样,不影响
}
拓展

1、JDK7及以前,接口中只能定义全局常量和抽象方法

全局常量:public static final ... 但是书写时可以省略不写

抽象方法:public abstract... 也可以省略

这里解释一下为什么可以省略不写,因为接口机制已经明确了只能定义“全局”常量,所以如果你定义了常量(不加public static final修饰),它会默认为是全局常量 ,也就是系统它会默认在你的代码前面加一个public static final。抽象方法同理

2、JDK8及之后,除了定义全局常量和抽象方法之外,还可以定义静态(static)方法、默认(default)方法>>>后面会解释

4、静态(static)方法、默认(default)方法(插入解释)

1、静态方法只能通过接口名调用,不可以通过实现类或者实现类的对象调用

2、默认方法只能通过接口实现类的对象来调用

3、我们是不能重写静态方法的,重写只对非静态方法有用,但是静态方法可以被继承

4、实现接口后,因为默认方法不是抽象方法,所以可以不重写,但是如果开发需要,也可以重写(看5)

5、如果接口中的默认方法不能满足某个实现类的需要,那么实现类可以覆盖默认方法,也就是重写相应默认方法

6、由于java中一个类支持实现多个接口,如果多个接口存在同样的static和default方法会发生什么?(7、8解释)(

7、如果两个接口中的静态方法一模一样,并且一个实现类同时实现了这两个接口,此时不会产生错误,因为JDK8及以后只能通过接口类来调用接口中的静态方法,所以对于编译器来说是可以区分的(

8、如果两个接口中的默认方法定义的一模一样,并且一个实现类同时实现了这两个接口,那么必须在实现类中重写默认方法,否则编译失败(

interface Jiekou{
    int i1= 10;  
    public static final int i2=100;
    void run();
    public abstract void walk();
​
    static void StaticMethod() {  //定义静态方法
        System.out.println("定义静态方法");
    }
    default void DefaultMethod() {  //定义默认方法
        System.out.println("定义默认方法");
    }
}

我遇到的问题(可以直接看第四点):

1、我知道接口中静态方法不能被重写的情况下,我去验证了一下,我在一个子类里面重写了该静态方法,程序没有报错,然后我运行时,它是直接运行的我子类重写的方法

2、我用接口名去调用接口中的方法,输出的是接口中的方法;我用对象名去调用类中所谓“重写”的方法,输出的是类中的方法

3、到现在我的描述你可能有点懵,没事,你不用太懂

4、就是我发现我实现类中所谓“重写”的静态方法可以和接口中的静态方法重名

5、定义接口的注意事项

1、接口中不能定义构造器,意味着接口不能实例化对象

2、Java开发中,接口通过造“实现类”的方式来实现(implements)及使用,如果实现类实现(注:覆盖、重写都是不严谨的叫法,原则是implements)了接口中的所有方法,则该实现类就可以实例化如果实现类没有实现接口中的所有方法,则此实现类仍是一个抽象类(这一点有点类似抽象类继承的知识),编码时,就要在前面加上abstract关键字修饰才不会报错

6、类继承接口的格式

class A extends B implements CC,DD,EE(A是子类,B是父类,CC、DD、EE都是不同的接口)

class ClassSuper{   //定义父类
    void show() {
        System.out.println("你好呀");
    }
}
​
interface Jiekou{   //定义接口
    void run();
    public abstract void walk();
}
​
class ClassSub extends ClassSuper implements Jiekou{   //定义子类,并继承父类以及实现接口
    void eat() {
        System.out.println("好想干饭");
    }
​
    @Override  //重写接口方法
    public void run() {
        System.out.println("我想跑步");
    }
​
    @Override   //重写接口方法
    public void walk() {
        System.out.println("我想走路");
    }
}
7、接口具体的使用

1、请看我下一篇博客

2、内容:简单工厂模式,抽象工厂模式,代理工厂模式的实际应用

8、接口具体使用的意义

1、体现了多态性

2、接口实际上可以看成是一种规范,接口的主要用途就是被实现类实现

3、项目的具体需求是多变的,我们要以不变应万变才能从容开发,此处的“不变”就是规范,因此,我们开发项目往往都是面向接口编程

4、类继承接口并不是 “是不是”的关系,而是“能不能”的关系,它是继承并实现接口的功能

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/923912.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存