欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > Java进阶学习|Day2.面向接口

Java进阶学习|Day2.面向接口

2024/10/24 11:15:18 来源:https://blog.csdn.net/weixin_60364343/article/details/139992357  浏览:    关键词:Java进阶学习|Day2.面向接口

文章目录

  • 面向接口
    • 接口
    • 抽象类
    • 接口与抽象类的关系
      • 异同点
      • 使用
    • 实际应用

面向接口

面向接口编程(Interface Oriented Programming:OIP)是一种编程思想,接口作为实体抽象出来的一种表现形式,用于抽离内部实现进行外部沟通,最终实现内部变动而不影响外部与其他实现交互,可以理解成按照这种思想来设计编程的方式就可以称为面向接口编程。

它并不是比面向对象编程更先进的一种独立的编程思想,可以说属于面向对象思想体系的一部分或者说它是面向对象编程体系中的思想精髓之一。

首先要明确两个定义

接口

定义

接口,是java语言中的一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(jdk7及以前),默认方法和静态方法(jdk8)和私有方法(jdk9)。

接口的使用:它不能创建对象,但是可以被实现(implements,类似与被继承)。一个实现接口的类(可以看做是接口的子类),需要实现接口中的所有的抽象方法,创建该类对象,就可以调用方法了,否则它必须是一个抽象类。

具体用法

  1. 包含抽象方法
public interface InterFaceName {public abstract void method();
}
  1. 含有默认方法和静态方法(JDK1.8)
public interface InterFaceName {public default void method() {// 执行语句}public static void method2() {// 执行语句}
}
  1. 含有私有方法和私有静态方法 (JDK 9)
public interface InterFaceName {private void method() {// 执行语句}
}
  1. 作为成员变量

也就是作为匿名内部类的使用方法。

  1. 作为方法参数和返回值类型。

    1. 定义方法
    public static List<Integer> getEvenNum(List<Integer> list)(List<Integer> evenList = new ArrayList<>();for( Integer i : list ){if(i % 2 == 0){evenList.add(i);}}return evenList;
    }
    
    1. 调用方法
    public static void main(String[] args) {// 创建ArrayList集合,并添加数字ArrayList<Integer> srcList = new ArrayList<>();for (int i = 0; i < 10; i++) {srcList.add(i);}/*获取偶数集合因为getEvenNum方法的参数是List,而ArrayList是List的子类,所以srcList可以传递*/List list = getEvenNum(srcList);System.out.println(list);
    }
    

当接口作为参数时,传递它的子类对象。

当接口作为返回值类型时,返回它的子类对象。

一般开发情况下常见于service层(具体业务逻辑)的开发。
在这里插入图片描述
然后在controller层进行调用
在这里插入图片描述

特点

  1. 接口中,无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰,可省略不写,但不推荐省略。
  2. 接口中,没有构造方法,不能创建对象。
  3. 接口中,没有静态代码块。

抽象类

定义

我们将没有方法主体的方法称为抽象方法。java语法规定,包含抽象方法的类就是抽象类。

abstract关键字

使用 abstract 关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。

  1. 抽象方法
public abstract void run();
  1. 抽象类
public abstract class Animal {public abstract void run();
}

特点

  1. 抽象类不能创建对象,如果创建,遍历无法通过而报错,只能创建其非抽象子类的对象。
  2. 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
  3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
  4. 抽象类的子类,必须重写抽象父类中的抽象方法,否则,编译无法通过而报错,除非该子类也是抽象类。

接口与抽象类的关系

异同点

相同点

都是不断向上抽取而来的。

不同点

  1. 抽象类需要被继承,而且只能单继承。接口需要被实现,而且可以多实现。
  2. 抽象类中可以定义非抽象方法,子类继承后可以直接非抽象方法。接口只能定义抽象方法,必须要由子类去实现,

使用

抽象类设计出来的目的是为了抽取出某一个种类的一些共有特性或者默认行为,以达到代码复用的目的。而接口则是为了规定某一种标准而设计出来,它强调的是规范,在面向对象语言中体现就是多态性的使用。 所以,如果出现该设计为抽象类还是接口纠结的场景,建议可以从设计的动机方面进行考虑,应该能得到一个比较好的结果。

实际应用

为什么现在很多项目从controller、service到dao层都是使用: 接口 + 实现类的方式、但是只有一个实现类,这种方式是否有必要?

  1. 如果使用Spring框架作为项目开发,推荐使用这种方式,这样可以最大化发挥SpringIOC的用途,方便使用和减少内存使用。
  2. 利于维护和扩展,虽然现在是只有一个实现类,但是随着业务的复杂变化,后面就可能出现多个实现类,使用该方式如果有新的业务变动,直接添加新的实现类就可以,无需改动原来的代码。
  3. 利利于团队合作,不同的人可能负责不同模块的开发如Controller、Service、Dao,只要定义好接口,负责各个模块的人即可去负责对应的开发。
  4. 控制暴露给外部的内容,保证安全性的问题。接口只会暴露定义公开的部分,但是直接使用对象则可以看到私有部分,这些私有部分可能会有安全性问题。
  5. 这个属于编程规范要求,封装实现细节,暴露对外接口,这也是“高内聚,低耦合”的思想。
  6. 符合开闭原则,降低变动带来的风险,便于理解,因为很多源码也是使用这种方式。
  7. 利用多态性,同一个接口可以存在多个实现类,可以配合反射和配置文件的使用,实现代码的解耦,需要增强功能时,只需要添加新的类和修改配置文件即可达到目的。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com