继承的问题

我们知道Java的三大特性:封装,继承,多态。Java 继承有很多优点,是减少重复代码的可靠手段。
但是继承同时存在一些缺点:

  1. 类的耦合性增加了。比如父类更改之后子类也同时需要更改
  2. 降低代码灵活性。因为继承时,父类会对子类有约束性
    我们使用里氏替换原则,可以减少继承带来的问题。

OO中的继承性的思考和说明

  1. 集成包含这样的一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然他不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实现的方法任意修改,就会对整个集成体系造成破坏。
  2. 集成在给程序带来便利的同时,也带来了弊端。比如使用集成会给程序带来侵入性,程序的可移植性降低,增加对象间的耦合性,如果一个类被其他的类所集成,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能产生障碍。
  3. 问题提出:在编程中,如何正确使用集成?=》里氏替换原则

里氏替换原则的定义

1、里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。
2、里氏代换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。
3、里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

里氏替换原则包含的含义

1、子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法
在我们做系统设计时,经常会设计接口或抽象类,然后由子类来实现抽象方法,这里使用的其实就是里氏替换原则。子类可以实现父类的抽象方法很好理解,事实上,子类也必须完全实现父类的抽象方法,哪怕写一个空方法,否则会编译报错。
里氏替换原则的关键点在于不能覆盖父类的非抽象方法。父类中凡是已经实现好的方法,实际上是在设定一系列的规范和契约,虽然它不强制要求所有的子类必须遵从这些规范,但是如果子类对这些非抽象方法任意修改,就会对整个继承体系造成破坏。而里氏替换原则就是表达了这一层含义。
2、子类中可以增加自己特有的方法
在继承父类属性和方法的同时,每个子类也都可以有自己的个性,在父类的基础上扩展自己的功能。前面其实已经提到,当功能扩展时,子类尽量不要重写父类的方法,而是另写一个方法
3、当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松
4、当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。否则会调用到父类的方法。

最佳实践

我们最好将父类定义为抽象类,并定义抽象方法,让子类重新定义这些方法,当父类是抽象类时候,父类不能实例化

一个程序引出的问题与思考

  1. public class Application {
  2. public static void main(String[] args) {
  3. A a = new A();
  4. System.out.println("11 - 3 = "+ a.funcl(11,3));
  5. System.out.println("1 - 8 = "+ a.funcl(1,8));
  6. System.out.println("-----------------------");
  7. B b = new B();
  8. System.out.println("11 - 3 = "+ b.func2(11,3));
  9. System.out.println("1 - 8 = "+ b.func2(1,8));
  10. }
  11. }
  12. class A {
  13. //返回两个数的差
  14. public int funcl(int num1,int num2){
  15. return num1 -num2;
  16. }
  17. }
  18. //B集成A 增加一个新功能 完成两个数相加,然后和9求和
  19. class B extends A {
  20. //这里重写了父类A的方法,可能是无意识的
  21. public int funcl(int num1,int num2){
  22. return num1 + num2;
  23. }
  24. public int func2(int num1,int num2){
  25. return funcl(num1,num2)+9;
  26. }
  27. }

运行结果

  1. E:\Java\jdk\jdk1.8.0_191\bin\java.exe "-javaagent:E:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\lib\idea_rt.jar=52981:E:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\bin" -Dfile.encoding=UTF-8 -classpath "E:\Java\jdk\jdk1.8.0_191\jre\lib\charsets.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\deploy.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\cldrdata.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\dnsns.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\jaccess.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\jfxrt.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\localedata.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\nashorn.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunec.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunmscapi.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\zipfs.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\javaws.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jce.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jfr.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jfxswt.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jsse.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\management-agent.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\plugin.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\resources.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\rt.jar;E:\study\jvm_study\chapter_01\target\classes;E:\Program Files\Maven\repository\org\redisson\redisson-spring-boot-starter\3.13.6\redisson-spring-boot-starter-3.13.6.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-actuator\2.4.1\spring-boot-starter-actuator-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-actuator-autoconfigure\2.4.1\spring-boot-actuator-autoconfigure-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-actuator\2.4.1\spring-boot-actuator-2.4.1.jar;E:\Program Files\Maven\repository\io\micrometer\micrometer-core\1.6.2\micrometer-core-1.6.2.jar;E:\Program Files\Maven\repository\org\hdrhistogram\HdrHistogram\2.1.12\HdrHistogram-2.1.12.jar;E:\Program Files\Maven\repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-data-redis\2.4.1\spring-boot-starter-data-redis-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\data\spring-data-redis\2.4.2\spring-data-redis-2.4.2.jar;E:\Program Files\Maven\repository\org\springframework\data\spring-data-keyvalue\2.4.2\spring-data-keyvalue-2.4.2.jar;E:\Program Files\Maven\repository\org\springframework\data\spring-data-commons\2.4.2\spring-data-commons-2.4.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-tx\5.3.2\spring-tx-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-oxm\5.3.2\spring-oxm-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-context-support\5.3.2\spring-context-support-5.3.2.jar;E:\Program Files\Maven\repository\org\redisson\redisson\3.13.6\redisson-3.13.6.jar;E:\Program Files\Maven\repository\io\netty\netty-common\4.1.55.Final\netty-common-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-codec\4.1.55.Final\netty-codec-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-buffer\4.1.55.Final\netty-buffer-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-transport\4.1.55.Final\netty-transport-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-resolver\4.1.55.Final\netty-resolver-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-resolver-dns\4.1.55.Final\netty-resolver-dns-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-codec-dns\4.1.55.Final\netty-codec-dns-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-handler\4.1.55.Final\netty-handler-4.1.55.Final.jar;E:\Program Files\Maven\repository\javax\cache\cache-api\1.1.1\cache-api-1.1.1.jar;E:\Program Files\Maven\repository\io\projectreactor\reactor-core\3.4.1\reactor-core-3.4.1.jar;E:\Program Files\Maven\repository\org\reactivestreams\reactive-streams\1.0.3\reactive-streams-1.0.3.jar;E:\Program Files\Maven\repository\io\reactivex\rxjava2\rxjava\2.2.20\rxjava-2.2.20.jar;E:\Program Files\Maven\repository\org\jboss\marshalling\jboss-marshalling-river\2.0.10.Final\jboss-marshalling-river-2.0.10.Final.jar;E:\Program Files\Maven\repository\org\jboss\marshalling\jboss-marshalling\2.0.10.Final\jboss-marshalling-2.0.10.Final.jar;E:\Program Files\Maven\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;E:\Program Files\Maven\repository\org\yaml\snakeyaml\1.27\snakeyaml-1.27.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.11.3\jackson-dataformat-yaml-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\core\jackson-core\2.11.3\jackson-core-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\core\jackson-databind\2.11.3\jackson-databind-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\core\jackson-annotations\2.11.3\jackson-annotations-2.11.3.jar;E:\Program Files\Maven\repository\net\bytebuddy\byte-buddy\1.10.18\byte-buddy-1.10.18.jar;E:\Program Files\Maven\repository\org\jodd\jodd-bean\5.1.6\jodd-bean-5.1.6.jar;E:\Program Files\Maven\repository\org\jodd\jodd-core\5.1.6\jodd-core-5.1.6.jar;E:\Program Files\Maven\repository\org\redisson\redisson-spring-data-23\3.13.6\redisson-spring-data-23-3.13.6.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-web\2.4.1\spring-boot-starter-web-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter\2.4.1\spring-boot-starter-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot\2.4.1\spring-boot-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-autoconfigure\2.4.1\spring-boot-autoconfigure-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-logging\2.4.1\spring-boot-starter-logging-2.4.1.jar;E:\Program Files\Maven\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;E:\Program Files\Maven\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;E:\Program Files\Maven\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;E:\Program Files\Maven\repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;E:\Program Files\Maven\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;E:\Program Files\Maven\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-json\2.4.1\spring-boot-starter-json-2.4.1.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.3\jackson-datatype-jdk8-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.3\jackson-datatype-jsr310-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.3\jackson-module-parameter-names-2.11.3.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-tomcat\2.4.1\spring-boot-starter-tomcat-2.4.1.jar;E:\Program Files\Maven\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.41\tomcat-embed-core-9.0.41.jar;E:\Program Files\Maven\repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;E:\Program Files\Maven\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.41\tomcat-embed-websocket-9.0.41.jar;E:\Program Files\Maven\repository\org\springframework\spring-web\5.3.2\spring-web-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-beans\5.3.2\spring-beans-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-webmvc\5.3.2\spring-webmvc-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-aop\5.3.2\spring-aop-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-context\5.3.2\spring-context-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-expression\5.3.2\spring-expression-5.3.2.jar;E:\Program Files\Maven\repository\org\projectlombok\lombok\1.18.16\lombok-1.18.16.jar;E:\Program Files\Maven\repository\org\springframework\spring-core\5.3.2\spring-core-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-jcl\5.3.2\spring-jcl-5.3.2.jar" design.Application
  2. 11 - 3 = 8
  3. 1 - 8 = -7
  4. -----------------------
  5. 11 - 3 = 23
  6. 1 - 8 = 18
  7. Process finished with exit code 0

解决办法

  1. 我们发现原来运行正常的相减功能发生了错误。原因是类B无意中重写了父类A的方法,造成原有功能出现错误。在实际编程中,我们常常会通过重写父类的方法完成新的功能,这样写起来虽然简单,但整个集成体系的复用性较差,特别是运行多态比较频繁的时候
  2. 通用的做法是:原来的父类和子类都集成一个更通俗的基类,原有的集成关系去掉,采用依赖聚合组合 等关系替代
  3. 改进方案image.png
  4. 代码实现 ```bash public class Application { public static void main(String[] args) {
    1. A a = new A();
    2. System.out.println("11 - 3 = "+ a.funcl(11,3));
    3. System.out.println("1 - 8 = "+ a.funcl(1,8));
    4. System.out.println("-----------------------");
    5. B b = new B();
    6. System.out.println("11 - 3 + 9= "+ b.func3(11,3));
    7. System.out.println("1 - 8 + 9= "+ b.func3(1,8));
    } } class Base {

} class A extends Base{ //返回两个数的差 public int funcl(int num1,int num2){ return num1 -num2; } } //B集成A 增加一个新功能 完成两个数相加,然后和9求和 class B extends Base { private A a = new A();//这里可以采用setter 构造函数 接口/父类注入 //这里重写了父类A的方法,可能是无意识的 public int funcl(int num1,int num2){ return num1 + num2; } public int func2(int num1,int num2){ return funcl(num1,num2)+9; } //若仍想用A类的方法 public int func3(int num1,int num2){ return a.funcl(num1,num2)+9; } }

  1. 运行结果
  2. ```bash
  3. E:\Java\jdk\jdk1.8.0_191\bin\java.exe "-javaagent:E:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\lib\idea_rt.jar=53262:E:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\bin" -Dfile.encoding=UTF-8 -classpath "E:\Java\jdk\jdk1.8.0_191\jre\lib\charsets.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\deploy.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\cldrdata.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\dnsns.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\jaccess.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\jfxrt.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\localedata.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\nashorn.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunec.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunmscapi.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\ext\zipfs.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\javaws.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jce.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jfr.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jfxswt.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\jsse.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\management-agent.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\plugin.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\resources.jar;E:\Java\jdk\jdk1.8.0_191\jre\lib\rt.jar;E:\study\jvm_study\chapter_01\target\classes;E:\Program Files\Maven\repository\org\redisson\redisson-spring-boot-starter\3.13.6\redisson-spring-boot-starter-3.13.6.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-actuator\2.4.1\spring-boot-starter-actuator-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-actuator-autoconfigure\2.4.1\spring-boot-actuator-autoconfigure-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-actuator\2.4.1\spring-boot-actuator-2.4.1.jar;E:\Program Files\Maven\repository\io\micrometer\micrometer-core\1.6.2\micrometer-core-1.6.2.jar;E:\Program Files\Maven\repository\org\hdrhistogram\HdrHistogram\2.1.12\HdrHistogram-2.1.12.jar;E:\Program Files\Maven\repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-data-redis\2.4.1\spring-boot-starter-data-redis-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\data\spring-data-redis\2.4.2\spring-data-redis-2.4.2.jar;E:\Program Files\Maven\repository\org\springframework\data\spring-data-keyvalue\2.4.2\spring-data-keyvalue-2.4.2.jar;E:\Program Files\Maven\repository\org\springframework\data\spring-data-commons\2.4.2\spring-data-commons-2.4.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-tx\5.3.2\spring-tx-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-oxm\5.3.2\spring-oxm-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-context-support\5.3.2\spring-context-support-5.3.2.jar;E:\Program Files\Maven\repository\org\redisson\redisson\3.13.6\redisson-3.13.6.jar;E:\Program Files\Maven\repository\io\netty\netty-common\4.1.55.Final\netty-common-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-codec\4.1.55.Final\netty-codec-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-buffer\4.1.55.Final\netty-buffer-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-transport\4.1.55.Final\netty-transport-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-resolver\4.1.55.Final\netty-resolver-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-resolver-dns\4.1.55.Final\netty-resolver-dns-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-codec-dns\4.1.55.Final\netty-codec-dns-4.1.55.Final.jar;E:\Program Files\Maven\repository\io\netty\netty-handler\4.1.55.Final\netty-handler-4.1.55.Final.jar;E:\Program Files\Maven\repository\javax\cache\cache-api\1.1.1\cache-api-1.1.1.jar;E:\Program Files\Maven\repository\io\projectreactor\reactor-core\3.4.1\reactor-core-3.4.1.jar;E:\Program Files\Maven\repository\org\reactivestreams\reactive-streams\1.0.3\reactive-streams-1.0.3.jar;E:\Program Files\Maven\repository\io\reactivex\rxjava2\rxjava\2.2.20\rxjava-2.2.20.jar;E:\Program Files\Maven\repository\org\jboss\marshalling\jboss-marshalling-river\2.0.10.Final\jboss-marshalling-river-2.0.10.Final.jar;E:\Program Files\Maven\repository\org\jboss\marshalling\jboss-marshalling\2.0.10.Final\jboss-marshalling-2.0.10.Final.jar;E:\Program Files\Maven\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;E:\Program Files\Maven\repository\org\yaml\snakeyaml\1.27\snakeyaml-1.27.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.11.3\jackson-dataformat-yaml-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\core\jackson-core\2.11.3\jackson-core-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\core\jackson-databind\2.11.3\jackson-databind-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\core\jackson-annotations\2.11.3\jackson-annotations-2.11.3.jar;E:\Program Files\Maven\repository\net\bytebuddy\byte-buddy\1.10.18\byte-buddy-1.10.18.jar;E:\Program Files\Maven\repository\org\jodd\jodd-bean\5.1.6\jodd-bean-5.1.6.jar;E:\Program Files\Maven\repository\org\jodd\jodd-core\5.1.6\jodd-core-5.1.6.jar;E:\Program Files\Maven\repository\org\redisson\redisson-spring-data-23\3.13.6\redisson-spring-data-23-3.13.6.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-web\2.4.1\spring-boot-starter-web-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter\2.4.1\spring-boot-starter-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot\2.4.1\spring-boot-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-autoconfigure\2.4.1\spring-boot-autoconfigure-2.4.1.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-logging\2.4.1\spring-boot-starter-logging-2.4.1.jar;E:\Program Files\Maven\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;E:\Program Files\Maven\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;E:\Program Files\Maven\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;E:\Program Files\Maven\repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;E:\Program Files\Maven\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;E:\Program Files\Maven\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-json\2.4.1\spring-boot-starter-json-2.4.1.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.3\jackson-datatype-jdk8-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.3\jackson-datatype-jsr310-2.11.3.jar;E:\Program Files\Maven\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.3\jackson-module-parameter-names-2.11.3.jar;E:\Program Files\Maven\repository\org\springframework\boot\spring-boot-starter-tomcat\2.4.1\spring-boot-starter-tomcat-2.4.1.jar;E:\Program Files\Maven\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.41\tomcat-embed-core-9.0.41.jar;E:\Program Files\Maven\repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;E:\Program Files\Maven\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.41\tomcat-embed-websocket-9.0.41.jar;E:\Program Files\Maven\repository\org\springframework\spring-web\5.3.2\spring-web-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-beans\5.3.2\spring-beans-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-webmvc\5.3.2\spring-webmvc-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-aop\5.3.2\spring-aop-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-context\5.3.2\spring-context-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-expression\5.3.2\spring-expression-5.3.2.jar;E:\Program Files\Maven\repository\org\projectlombok\lombok\1.18.16\lombok-1.18.16.jar;E:\Program Files\Maven\repository\org\springframework\spring-core\5.3.2\spring-core-5.3.2.jar;E:\Program Files\Maven\repository\org\springframework\spring-jcl\5.3.2\spring-jcl-5.3.2.jar" design.Application
  4. 11 - 3 = 8
  5. 1 - 8 = -7
  6. -----------------------
  7. 11 - 3 + 9= 17
  8. 1 - 8 + 9= 2
  9. Process finished with exit code 0