参考:继承

1 Java 的三大特性

继承、封装、多态。
继承,is a,关系;
封装,隐藏内部实现;(经常我们修改内部实现或逻辑,对外的数据模型却不用调整)
多态,运行时候才知道具体的东西,由实际场景所决定。(override,overload,不同的人认为不同,有的说都是多态的体现,有的只认可override覆盖,overload重载不算。不纠结这个,使用即可)

2 什么是继承

从代码讲,使用了 extends 关键字

  1. class ClassName extends SuperClassName {
  2. // ...
  3. }

从理论上讲,is a 关系时,就是继承。

3 继承能干什么

解决 is a ,代码复用;

3.1 复用对象的子段:

包括字段公用(其实归根到底就是方法的继承使用,可见修辞符的使用——public、protected、default、private),比如开发中分页查询,继承 BasePageQuery 基类;

  1. package com.demo.activiti7.inherit;
  2. import org.junit.Test;
  3. public class DemoTest {
  4. /**
  5. * 参考: https://blog.csdn.net/chenssy/article/details/12786385
  6. */
  7. @Test
  8. public void testInherit() {
  9. A a1 = new A();
  10. A a2 = new B();
  11. B b = new B();
  12. C c = new C();
  13. D d = new D();
  14. // 子类可将父类的 public、protected 对象
  15. c.a = b.a = a1.a = a2.a = d.a;
  16. c.b = b.b = a1.b = a2.b = d.b;
  17. // System.out.println("1--" + a1.show(b));
  18. // System.out.println("2--" + a1.show(c));
  19. // System.out.println("3--" + a1.show(d));
  20. System.out.println("4--" + a2.show(b));
  21. System.out.println("4--" + a2.show(a1));
  22. System.out.println("-----------" + c.show(c));
  23. System.out.println("-----------" + b.show(a2));
  24. // System.out.println("5--" + a2.show(c));
  25. // System.out.println("6--" + a2.show(d));
  26. // System.out.println("7--" + b.show(b));
  27. // System.out.println("8--" + b.show(c));
  28. // System.out.println("9--" + b.show(d));
  29. }
  30. class A {
  31. // 基类中的public、protected被子类继承
  32. public String a = "1";
  33. protected String b = "b";
  34. public String show(D obj) {
  35. return ("A and D");
  36. }
  37. public String show(A obj) {
  38. return ("A and A");
  39. }
  40. public <T extends B> String show(T obj) {
  41. return ("A and A");
  42. }
  43. }
  44. class B extends A {
  45. public String show(B obj){
  46. return ("B and B");
  47. }
  48. @Override
  49. public String show(A obj){
  50. return ("B and A");
  51. }
  52. }
  53. class C extends B {
  54. }
  55. class D extends B {
  56. }
  57. }
  1. package com.hbte.sharp.bo;
  2. import io.swagger.annotations.ApiModel;
  3. import io.swagger.annotations.ApiModelProperty;
  4. /**
  5. * @ClassName PageQuery
  6. * @Description 分页参数
  7. * @Version 1.0.0
  8. * @Author Bruce
  9. * @Date 2020/9/23 10:23
  10. **/
  11. @ApiModel(value = "分页参数", description = "query")
  12. public class PageQuery extends BaseQuery {
  13. @ApiModelProperty(value = "第几页,默认第一页")
  14. private Integer pageNum = 1;
  15. @ApiModelProperty(value = "每页条数,默认10")
  16. private Integer pageSize= 10;
  17. @ApiModelProperty(value = "导出方式 0.导出当前页 1.导出全部 导出所选在前端做 默认为0")
  18. private Integer type = 0;
  19. public Integer getPageNum() {
  20. return pageNum;
  21. }
  22. public void setPageNum(Integer pageNum) {
  23. this.pageNum = pageNum;
  24. }
  25. public Integer getPageSize() {
  26. return pageSize;
  27. }
  28. public void setPageSize(Integer pageSize) {
  29. this.pageSize = pageSize;
  30. }
  31. public Integer getType() {
  32. return type;
  33. }
  34. public void setType(Integer type) {
  35. this.type = type;
  36. }
  37. }
  38. package com.hbte.sharp.bo.flow;
  39. import com.hbte.sharp.bo.PageQuery;
  40. import io.swagger.annotations.ApiModel;
  41. import io.swagger.annotations.ApiModelProperty;
  42. /**
  43. * @author wb
  44. * @date 2020-11-26-18:37
  45. */
  46. @ApiModel(value = "流程基本信息关键字查询", description = "query")
  47. public class FlowBaseInfoKeyWordsQuery extends PageQuery {
  48. @ApiModelProperty(value = "关键字")
  49. private String keyWords;
  50. public String getKeyWords() {
  51. return keyWords;
  52. }
  53. public void setKeyWords(String keyWords) {
  54. this.keyWords = keyWords;
  55. }
  56. }

3.2 复用对象的方法

  1. package com.hbte.sharp.po.data.listener;
  2. import com.alibaba.excel.event.AnalysisEventListener;
  3. import com.hbte.sharp.util.GenericSuperclassUtil;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.util.CollectionUtils;
  7. import java.lang.reflect.Field;
  8. import java.util.Date;
  9. import java.util.List;
  10. /**
  11. * 抽象listener
  12. *
  13. * @author Bruce
  14. * @date 2020/12/2 14:32
  15. */
  16. public abstract class AbstractDataImportListener<T, R> extends AnalysisEventListener<T> {
  17. private final Logger log = LoggerFactory.getLogger(AbstractDataImportListener.class);
  18. private String userName;
  19. private Long userId;
  20. private Date createTime;
  21. private List<R> resposeList;
  22. public AbstractDataImportListener(String userName, Long userId, Date createTime, List<R> resposeList) {
  23. this.userName = userName;
  24. this.userId = userId;
  25. this.createTime = createTime;
  26. this.resposeList = resposeList;
  27. }
  28. public String getUserName() {
  29. return userName;
  30. }
  31. public void setUserName(String userName) {
  32. this.userName = userName;
  33. }
  34. public Long getUserId() {
  35. return userId;
  36. }
  37. public void setUserId(Long userId) {
  38. this.userId = userId;
  39. }
  40. public Date getCreateTime() {
  41. return createTime;
  42. }
  43. public void setCreateTime(Date createTime) {
  44. this.createTime = createTime;
  45. }
  46. public List<R> getResposeList() {
  47. return resposeList;
  48. }
  49. public void setResposeList(List<R> resposeList) {
  50. this.resposeList = resposeList;
  51. }
  52. public Class getDataModel(Class<? extends AbstractDataImportListener> listener) {
  53. return GenericSuperclassUtil.getActualTypeArgument(listener, 0);
  54. }
  55. public Class getReturnModel(Class<? extends AbstractDataImportListener> listener) {
  56. return GenericSuperclassUtil.getActualTypeArgument(listener, 1);
  57. }
  58. /**
  59. * 继承该类的,都可以会用该方法来确认失败的数据条数,不需要具体的业务类来实现一套
  60. */
  61. public int failNum() {
  62. int count = 0;
  63. if (CollectionUtils.isEmpty(resposeList)) {
  64. return count;
  65. }
  66. try {
  67. for (R obj : resposeList) {
  68. Class<?> objClass = obj.getClass();
  69. Field successfulFlag = objClass.getDeclaredField("successfulFlag");
  70. successfulFlag.setAccessible(true);
  71. if ("否".equals(successfulFlag.get(obj).toString())) {
  72. count += 1;
  73. }
  74. }
  75. } catch (NoSuchFieldException e) {
  76. log.error("不存在 successfulFlag 标志字段。", e);
  77. } catch (IllegalAccessException e) {
  78. log.error("successfulFlag 标志字段无法访问。", e);
  79. }
  80. return count;
  81. }
  82. }

3.3 小结

直观体现,就是减少重复代码,使得代码看起来更为清爽。另外的作用就是Java 的多态,继承是多态实现的根本前提(只为人 override 覆盖才是多态的人员,这么认为)。

4 如何使用继承

需要将对象抽象为 is a 关系时候,或者说具有相同的属性和行为的时候。

注意:Java 继承是单继承,推荐使用组合,而非继承。组合是指 has a 包含关系,继承是 is a 关系。各有各自的优缺点: java 组合VS继承 可以看看

5 扩展

继承中,多态调用
Java 多态机制,继承链中对象方法的调用存在一个优先级:
this.method(O) -> super.method(O) -> this.method((super)O) -> super.method((super)O)

  • 当超类对象引用变量引用子类对象时,首先这个被调用的方法必须在超类中定义过 = 根据上面继承链对象方法调用优先级可以在超类中找到这个方法

  • 被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法 = 判断子类是否重写了该方法,如果重写了直接调用子类的方法

    5.1 小例子一

    5.1.1 代码

    ```java package com.demo.activiti7.inherit;

import org.junit.Test;

public class DemoTest {

  1. /**
  2. * 参考: https://blog.csdn.net/chenssy/article/details/12786385
  3. */
  4. @Test
  5. public void testInherit() {
  6. A a1 = new A();
  7. A a2 = new B();
  8. B b = new B();
  9. C c = new C();
  10. D d = new D();
  11. c.a = b.a = a1.a = a2.a = d.a;
  12. c.b = b.b = a1.b = a2.b = d.b;
  13. System.out.println("1--" + a1.show(b));
  14. System.out.println("2--" + a1.show(c));
  15. System.out.println("3--" + a1.show(d));
  16. System.out.println("4--" + a2.show(b));
  17. System.out.println("5--" + a2.show(c));
  18. System.out.println("6--" + a2.show(d));
  19. System.out.println("7--" + b.show(b));
  20. System.out.println("8--" + b.show(c));
  21. System.out.println("9--" + b.show(d));
  22. }
  23. class A {
  24. public String a = "1";
  25. protected String b = "b";
  26. public String show(D obj) {
  27. return ("A and D");
  28. }
  29. public String show(A obj) {
  30. return ("A and A");
  31. }
  32. public <T extends B> String show(T obj) {
  33. return ("A and A");
  34. }
  35. }
  36. class B extends A {
  37. public String show(B obj) {
  38. return ("B and B");
  39. }
  40. @Override
  41. public String show(A obj) {
  42. return ("B and A");
  43. }
  44. }
  45. class C extends B {
  46. }
  47. class D extends B {
  48. }

}

  1. <a name="dCrfe"></a>
  2. ### 5.1.2 运行结果

D:\devTools\java\jdk1.8.0_261\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:D:\devTools\ideaIU-2019.1.4.win\lib\idea_rt.jar=63824:D:\devTools\ideaIU-2019.1.4.win\bin -Dfile.encoding=UTF-8 -classpath D:\devTools\ideaIU-2019.1.4.win\lib\idea_rt.jar;D:\devTools\ideaIU-2019.1.4.win\plugins\junit\lib\junit-rt.jar;D:\devTools\ideaIU-2019.1.4.win\plugins\junit\lib\junit5-rt.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\charsets.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\deploy.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\access-bridge-64.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\cldrdata.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\dnsns.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\jaccess.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\jfxrt.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\localedata.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\nashorn.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\sunec.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\sunjce_provider.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\sunmscapi.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\sunpkcs11.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\zipfs.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\javaws.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\jce.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\jfr.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\jfxswt.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\jsse.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\management-agent.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\plugin.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\resources.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\rt.jar;D:\work\task\my-activiti-demo\mybatis-activiti7-single\target\test-classes;D:\work\task\my-activiti-demo\mybatis-activiti7-single\target\classes;D:\devServer\mvnRep\org\springframework\boot\spring-boot-starter-actuator\2.1.12.RELEASE\spring-boot-starter-actuator-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-starter\2.1.12.RELEASE\spring-boot-starter-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-autoconfigure\2.1.12.RELEASE\spring-boot-autoconfigure-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-starter-logging\2.1.12.RELEASE\spring-boot-starter-logging-2.1.12.RELEASE.jar;D:\devServer\mvnRep\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\devServer\mvnRep\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\devServer\mvnRep\org\apache\logging\log4j\log4j-to-slf4j\2.11.2\log4j-to-slf4j-2.11.2.jar;D:\devServer\mvnRep\org\apache\logging\log4j\log4j-api\2.11.2\log4j-api-2.11.2.jar;D:\devServer\mvnRep\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;D:\devServer\mvnRep\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;D:\devServer\mvnRep\org\yaml\snakeyaml\1.23\snakeyaml-1.23.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-actuator-autoconfigure\2.1.12.RELEASE\spring-boot-actuator-autoconfigure-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-actuator\2.1.12.RELEASE\spring-boot-actuator-2.1.12.RELEASE.jar;D:\devServer\mvnRep\com\fasterxml\jackson\core\jackson-databind\2.9.10.2\jackson-databind-2.9.10.2.jar;D:\devServer\mvnRep\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.10\jackson-datatype-jsr310-2.9.10.jar;D:\devServer\mvnRep\io\micrometer\micrometer-core\1.1.9\micrometer-core-1.1.9.jar;D:\devServer\mvnRep\org\hdrhistogram\HdrHistogram\2.1.9\HdrHistogram-2.1.9.jar;D:\devServer\mvnRep\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-starter-web\2.1.12.RELEASE\spring-boot-starter-web-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-starter-json\2.1.12.RELEASE\spring-boot-starter-json-2.1.12.RELEASE.jar;D:\devServer\mvnRep\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.10\jackson-datatype-jdk8-2.9.10.jar;D:\devServer\mvnRep\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.10\jackson-module-parameter-names-2.9.10.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-starter-tomcat\2.1.12.RELEASE\spring-boot-starter-tomcat-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\apache\tomcat\embed\tomcat-embed-core\9.0.30\tomcat-embed-core-9.0.30.jar;D:\devServer\mvnRep\org\apache\tomcat\embed\tomcat-embed-el\9.0.30\tomcat-embed-el-9.0.30.jar;D:\devServer\mvnRep\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.30\tomcat-embed-websocket-9.0.30.jar;D:\devServer\mvnRep\org\hibernate\validator\hibernate-validator\6.0.18.Final\hibernate-validator-6.0.18.Final.jar;D:\devServer\mvnRep\org\jboss\logging\jboss-logging\3.3.3.Final\jboss-logging-3.3.3.Final.jar;D:\devServer\mvnRep\org\springframework\spring-web\5.1.13.RELEASE\spring-web-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\spring-webmvc\5.1.13.RELEASE\spring-webmvc-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\spring-aop\5.1.13.RELEASE\spring-aop-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\spring-expression\5.1.13.RELEASE\spring-expression-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-starter-test\2.1.12.RELEASE\spring-boot-starter-test-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-test\2.1.12.RELEASE\spring-boot-test-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-test-autoconfigure\2.1.12.RELEASE\spring-boot-test-autoconfigure-2.1.12.RELEASE.jar;D:\devServer\mvnRep\com\jayway\jsonpath\json-path\2.4.0\json-path-2.4.0.jar;D:\devServer\mvnRep\net\minidev\json-smart\2.3\json-smart-2.3.jar;D:\devServer\mvnRep\net\minidev\accessors-smart\1.2\accessors-smart-1.2.jar;D:\devServer\mvnRep\junit\junit\4.12\junit-4.12.jar;D:\devServer\mvnRep\org\assertj\assertj-core\3.11.1\assertj-core-3.11.1.jar;D:\devServer\mvnRep\org\mockito\mockito-core\2.23.4\mockito-core-2.23.4.jar;D:\devServer\mvnRep\net\bytebuddy\byte-buddy\1.9.16\byte-buddy-1.9.16.jar;D:\devServer\mvnRep\net\bytebuddy\byte-buddy-agent\1.9.16\byte-buddy-agent-1.9.16.jar;D:\devServer\mvnRep\org\objenesis\objenesis\2.6\objenesis-2.6.jar;D:\devServer\mvnRep\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\devServer\mvnRep\org\hamcrest\hamcrest-library\1.3\hamcrest-library-1.3.jar;D:\devServer\mvnRep\org\skyscreamer\jsonassert\1.5.0\jsonassert-1.5.0.jar;D:\devServer\mvnRep\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;D:\devServer\mvnRep\org\springframework\spring-core\5.1.13.RELEASE\spring-core-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\spring-jcl\5.1.13.RELEASE\spring-jcl-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\spring-test\5.1.13.RELEASE\spring-test-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\xmlunit\xmlunit-core\2.6.3\xmlunit-core-2.6.3.jar;D:\devServer\mvnRep\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;D:\devServer\mvnRep\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;D:\devServer\mvnRep\org\activiti\activiti-spring-boot-starter\7.1.0.M6\activiti-spring-boot-starter-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-spring-app-process\7.1.0.M6\activiti-spring-app-process-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-spring-application\7.1.0.M6\activiti-spring-application-7.1.0.M6.jar;D:\devServer\mvnRep\commons-io\commons-io\2.6\commons-io-2.6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-spring-identity\7.1.0.M6\activiti-spring-identity-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-spring-security\7.1.0.M6\activiti-spring-security-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\api\activiti-api-process-model\7.1.0.M6\activiti-api-process-model-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\api\activiti-api-process-runtime\7.1.0.M6\activiti-api-process-runtime-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\api\activiti-api-model-shared\7.1.0.M6\activiti-api-model-shared-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\api\activiti-api-runtime-shared\7.1.0.M6\activiti-api-runtime-shared-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-spring\7.1.0.M6\activiti-spring-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-bpmn-converter\7.1.0.M6\activiti-bpmn-converter-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-process-validation\7.1.0.M6\activiti-process-validation-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-spring-project\7.1.0.M6\activiti-spring-project-7.1.0.M6.jar;D:\devServer\mvnRep\org\springframework\spring-jdbc\5.1.13.RELEASE\spring-jdbc-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\spring-orm\5.1.13.RELEASE\spring-orm-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\apache\commons\commons-lang3\3.8.1\commons-lang3-3.8.1.jar;D:\devServer\mvnRep\javax\el\el-api\2.2\el-api-2.2.jar;D:\devServer\mvnRep\org\slf4j\jcl-over-slf4j\1.7.30\jcl-over-slf4j-1.7.30.jar;D:\devServer\mvnRep\org\activiti\activiti-engine\7.1.0.M6\activiti-engine-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-project-model\7.1.0.M6\activiti-project-model-7.1.0.M6.jar;D:\devServer\mvnRep\org\apache\commons\commons-email\1.5\commons-email-1.5.jar;D:\devServer\mvnRep\com\sun\mail\javax.mail\1.6.2\javax.mail-1.6.2.jar;D:\devServer\mvnRep\javax\activation\activation\1.1\activation-1.1.jar;D:\devServer\mvnRep\de\odysseus\juel\juel-api\2.2.7\juel-api-2.2.7.jar;D:\devServer\mvnRep\de\odysseus\juel\juel-impl\2.2.7\juel-impl-2.2.7.jar;D:\devServer\mvnRep\de\odysseus\juel\juel-spi\2.2.7\juel-spi-2.2.7.jar;D:\devServer\mvnRep\com\fasterxml\jackson\core\jackson-core\2.9.10\jackson-core-2.9.10.jar;D:\devServer\mvnRep\joda-time\joda-time\2.10.5\joda-time-2.10.5.jar;D:\devServer\mvnRep\org\activiti\activiti-bpmn-model\7.1.0.M6\activiti-bpmn-model-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-api-process-runtime-impl\7.1.0.M6\activiti-api-process-runtime-impl-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-connector-model\7.1.0.M6\activiti-connector-model-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-spring-connector\7.1.0.M6\activiti-spring-connector-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-api-model-shared-impl\7.1.0.M6\activiti-api-model-shared-impl-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-api-runtime-shared-impl\7.1.0.M6\activiti-api-runtime-shared-impl-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-spring-security-policies\7.1.0.M6\activiti-spring-security-policies-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-api-task-runtime-impl\7.1.0.M6\activiti-api-task-runtime-impl-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\api\activiti-api-task-model\7.1.0.M6\activiti-api-task-model-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\api\activiti-api-task-runtime\7.1.0.M6\activiti-api-task-runtime-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-api-task-model-impl\7.1.0.M6\activiti-api-task-model-impl-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-common-util\7.1.0.M6\activiti-common-util-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-api-process-model-impl\7.1.0.M6\activiti-api-process-model-impl-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-spring-process-extensions\7.1.0.M6\activiti-spring-process-extensions-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-spring-resource-loader\7.1.0.M6\activiti-spring-resource-loader-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-spring-resource-finder\7.1.0.M6\activiti-spring-resource-finder-7.1.0.M6.jar;D:\devServer\mvnRep\org\springframework\spring-context\5.1.13.RELEASE\spring-context-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\spring-tx\5.1.13.RELEASE\spring-tx-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\spring-beans\5.1.13.RELEASE\spring-beans-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot\2.1.12.RELEASE\spring-boot-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\springframework\security\spring-security-core\5.1.7.RELEASE\spring-security-core-5.1.7.RELEASE.jar;D:\devServer\mvnRep\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;D:\devServer\mvnRep\com\fasterxml\uuid\java-uuid-generator\3.1.4\java-uuid-generator-3.1.4.jar;D:\devServer\mvnRep\com\fasterxml\jackson\core\jackson-annotations\2.9.10\jackson-annotations-2.9.10.jar;D:\devServer\mvnRep\org\mybatis\spring\boot\mybatis-spring-boot-starter\2.1.4\mybatis-spring-boot-starter-2.1.4.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-starter-jdbc\2.1.12.RELEASE\spring-boot-starter-jdbc-2.1.12.RELEASE.jar;D:\devServer\mvnRep\com\zaxxer\HikariCP\3.2.0\HikariCP-3.2.0.jar;D:\devServer\mvnRep\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\2.1.4\mybatis-spring-boot-autoconfigure-2.1.4.jar;D:\devServer\mvnRep\org\mybatis\mybatis-spring\2.0.6\mybatis-spring-2.0.6.jar;D:\devServer\mvnRep\org\mybatis\mybatis\3.5.6\mybatis-3.5.6.jar;D:\devServer\mvnRep\mysql\mysql-connector-java\8.0.15\mysql-connector-java-8.0.15.jar;D:\devServer\mvnRep\org\activiti\activiti-image-generator\7.1.0.M6\activiti-image-generator-7.1.0.M6.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-awt-util\1.10\batik-awt-util-1.10.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-util\1.10\batik-util-1.10.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-constants\1.10\batik-constants-1.10.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-i18n\1.10\batik-i18n-1.10.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\xmlgraphics-commons\2.2\xmlgraphics-commons-2.2.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-dom\1.10\batik-dom-1.10.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-css\1.10\batik-css-1.10.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-ext\1.10\batik-ext-1.10.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-xml\1.10\batik-xml-1.10.jar;D:\devServer\mvnRep\xalan\xalan\2.7.2\xalan-2.7.2.jar;D:\devServer\mvnRep\xalan\serializer\2.7.2\serializer-2.7.2.jar;D:\devServer\mvnRep\xml-apis\xml-apis\1.4.01\xml-apis-1.4.01.jar;D:\devServer\mvnRep\xml-apis\xml-apis-ext\1.3.04\xml-apis-ext-1.3.04.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-svggen\1.10\batik-svggen-1.10.jar;D:\devServer\mvnRep\com\alibaba\fastjson\1.2.47\fastjson-1.2.47.jar;D:\devServer\mvnRep\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;D:\devServer\mvnRep\org\projectlombok\lombok\1.16.20\lombok-1.16.20.jar;D:\devServer\mvnRep\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;D:\devServer\mvnRep\io\swagger\swagger-annotations\1.5.16\swagger-annotations-1.5.16.jar;D:\devServer\mvnRep\io\springfox\springfox-swagger2\2.7.0\springfox-swagger2-2.7.0.jar;D:\devServer\mvnRep\io\swagger\swagger-models\1.5.13\swagger-models-1.5.13.jar;D:\devServer\mvnRep\io\springfox\springfox-spi\2.7.0\springfox-spi-2.7.0.jar;D:\devServer\mvnRep\io\springfox\springfox-core\2.7.0\springfox-core-2.7.0.jar;D:\devServer\mvnRep\io\springfox\springfox-schema\2.7.0\springfox-schema-2.7.0.jar;D:\devServer\mvnRep\io\springfox\springfox-swagger-common\2.7.0\springfox-swagger-common-2.7.0.jar;D:\devServer\mvnRep\io\springfox\springfox-spring-web\2.7.0\springfox-spring-web-2.7.0.jar;D:\devServer\mvnRep\org\reflections\reflections\0.9.11\reflections-0.9.11.jar;D:\devServer\mvnRep\org\javassist\javassist\3.21.0-GA\javassist-3.21.0-GA.jar;D:\devServer\mvnRep\com\google\guava\guava\18.0\guava-18.0.jar;D:\devServer\mvnRep\com\fasterxml\classmate\1.4.0\classmate-1.4.0.jar;D:\devServer\mvnRep\org\springframework\plugin\spring-plugin-core\1.2.0.RELEASE\spring-plugin-core-1.2.0.RELEASE.jar;D:\devServer\mvnRep\org\springframework\plugin\spring-plugin-metadata\1.2.0.RELEASE\spring-plugin-metadata-1.2.0.RELEASE.jar;D:\devServer\mvnRep\org\mapstruct\mapstruct\1.1.0.Final\mapstruct-1.1.0.Final.jar;D:\devServer\mvnRep\io\springfox\springfox-swagger-ui\2.7.0\springfox-swagger-ui-2.7.0.jar;D:\devServer\mvnRep\com\alibaba\easyexcel\2.2.6\easyexcel-2.2.6.jar;D:\devServer\mvnRep\org\apache\poi\poi\3.17\poi-3.17.jar;D:\devServer\mvnRep\commons-codec\commons-codec\1.11\commons-codec-1.11.jar;D:\devServer\mvnRep\org\apache\commons\commons-collections4\4.1\commons-collections4-4.1.jar;D:\devServer\mvnRep\org\apache\poi\poi-ooxml\3.17\poi-ooxml-3.17.jar;D:\devServer\mvnRep\com\github\virtuald\curvesapi\1.04\curvesapi-1.04.jar;D:\devServer\mvnRep\org\apache\poi\poi-ooxml-schemas\3.17\poi-ooxml-schemas-3.17.jar;D:\devServer\mvnRep\org\apache\xmlbeans\xmlbeans\2.6.0\xmlbeans-2.6.0.jar;D:\devServer\mvnRep\stax\stax-api\1.0.1\stax-api-1.0.1.jar;D:\devServer\mvnRep\cglib\cglib\3.1\cglib-3.1.jar;D:\devServer\mvnRep\org\ow2\asm\asm\4.2\asm-4.2.jar;D:\devServer\mvnRep\org\ehcache\ehcache\3.6.3\ehcache-3.6.3.jar com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.demo.activiti7.inherit.DemoTest,testInherit 1—A and A 2—A and A 3—A and D 4—B and B 5—B and B 6—A and D 7—B and B 8—B and B 9—A and D

Process finished with exit code 0

  1. <a name="CpjiS"></a>
  2. ### 5.1.3 分析
  3. 此处只对 4--B and B 分析。<br />A a2 = new B();<br />B b = new B();<br />System.out.println("4--" + a2.show(b));<br />a2 为 B 的父类,所以show的方法,A中得有,a2 才可调用;调用时,是由 B 为实际的类,发现当前存在show(B) 的方法,直接运行该方法,输出 4--B and B。
  4. <a name="cwV6Z"></a>
  5. ## 5.2 小例子二
  6. <a name="bpyAj"></a>
  7. ### 5.2.1 代码
  8. ```java
  9. package com.demo.activiti7.inherit;
  10. import org.junit.Test;
  11. public class DemoTest {
  12. /**
  13. * 参考: https://blog.csdn.net/chenssy/article/details/12786385
  14. */
  15. @Test
  16. public void testInherit() {
  17. A a1 = new A();
  18. A a2 = new B();
  19. B b = new B();
  20. C c = new C();
  21. D d = new D();
  22. c.a = b.a = a1.a = a2.a = d.a;
  23. c.b = b.b = a1.b = a2.b = d.b;
  24. System.out.println("1--" + a1.show(b));
  25. System.out.println("2--" + a1.show(c));
  26. System.out.println("3--" + a1.show(d));
  27. System.out.println("4--" + a2.show(b));
  28. System.out.println("5--" + a2.show(c));
  29. System.out.println("6--" + a2.show(d));
  30. System.out.println("7--" + b.show(b));
  31. System.out.println("8--" + b.show(c));
  32. System.out.println("9--" + b.show(d));
  33. }
  34. class A {
  35. public String a = "1";
  36. protected String b = "b";
  37. public String show(D obj) {
  38. return ("A and D");
  39. }
  40. public String show(A obj) {
  41. return ("A and A");
  42. }
  43. // public <T extends B> String show(T obj) {
  44. // return ("A and A");
  45. // }
  46. }
  47. class B extends A {
  48. public String show(B obj) {
  49. return ("B and B");
  50. }
  51. @Override
  52. public String show(A obj) {
  53. return ("B and A");
  54. }
  55. }
  56. class C extends B {
  57. }
  58. class D extends B {
  59. }
  60. }

与例子一相比,就只是屏蔽代码:
// public String show(T obj) {
// return (“A and A”);
// }

5.2.2 运行结果

  1. D:\devTools\java\jdk1.8.0_261\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:D:\devTools\ideaIU-2019.1.4.win\lib\idea_rt.jar=64284:D:\devTools\ideaIU-2019.1.4.win\bin -Dfile.encoding=UTF-8 -classpath D:\devTools\ideaIU-2019.1.4.win\lib\idea_rt.jar;D:\devTools\ideaIU-2019.1.4.win\plugins\junit\lib\junit-rt.jar;D:\devTools\ideaIU-2019.1.4.win\plugins\junit\lib\junit5-rt.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\charsets.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\deploy.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\access-bridge-64.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\cldrdata.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\dnsns.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\jaccess.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\jfxrt.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\localedata.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\nashorn.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\sunec.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\sunjce_provider.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\sunmscapi.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\sunpkcs11.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\ext\zipfs.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\javaws.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\jce.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\jfr.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\jfxswt.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\jsse.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\management-agent.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\plugin.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\resources.jar;D:\devTools\java\jdk1.8.0_261\jre\lib\rt.jar;D:\work\task\my-activiti-demo\mybatis-activiti7-single\target\test-classes;D:\work\task\my-activiti-demo\mybatis-activiti7-single\target\classes;D:\devServer\mvnRep\org\springframework\boot\spring-boot-starter-actuator\2.1.12.RELEASE\spring-boot-starter-actuator-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-starter\2.1.12.RELEASE\spring-boot-starter-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-autoconfigure\2.1.12.RELEASE\spring-boot-autoconfigure-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-starter-logging\2.1.12.RELEASE\spring-boot-starter-logging-2.1.12.RELEASE.jar;D:\devServer\mvnRep\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\devServer\mvnRep\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\devServer\mvnRep\org\apache\logging\log4j\log4j-to-slf4j\2.11.2\log4j-to-slf4j-2.11.2.jar;D:\devServer\mvnRep\org\apache\logging\log4j\log4j-api\2.11.2\log4j-api-2.11.2.jar;D:\devServer\mvnRep\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;D:\devServer\mvnRep\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;D:\devServer\mvnRep\org\yaml\snakeyaml\1.23\snakeyaml-1.23.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-actuator-autoconfigure\2.1.12.RELEASE\spring-boot-actuator-autoconfigure-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-actuator\2.1.12.RELEASE\spring-boot-actuator-2.1.12.RELEASE.jar;D:\devServer\mvnRep\com\fasterxml\jackson\core\jackson-databind\2.9.10.2\jackson-databind-2.9.10.2.jar;D:\devServer\mvnRep\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.10\jackson-datatype-jsr310-2.9.10.jar;D:\devServer\mvnRep\io\micrometer\micrometer-core\1.1.9\micrometer-core-1.1.9.jar;D:\devServer\mvnRep\org\hdrhistogram\HdrHistogram\2.1.9\HdrHistogram-2.1.9.jar;D:\devServer\mvnRep\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-starter-web\2.1.12.RELEASE\spring-boot-starter-web-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-starter-json\2.1.12.RELEASE\spring-boot-starter-json-2.1.12.RELEASE.jar;D:\devServer\mvnRep\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.10\jackson-datatype-jdk8-2.9.10.jar;D:\devServer\mvnRep\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.10\jackson-module-parameter-names-2.9.10.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-starter-tomcat\2.1.12.RELEASE\spring-boot-starter-tomcat-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\apache\tomcat\embed\tomcat-embed-core\9.0.30\tomcat-embed-core-9.0.30.jar;D:\devServer\mvnRep\org\apache\tomcat\embed\tomcat-embed-el\9.0.30\tomcat-embed-el-9.0.30.jar;D:\devServer\mvnRep\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.30\tomcat-embed-websocket-9.0.30.jar;D:\devServer\mvnRep\org\hibernate\validator\hibernate-validator\6.0.18.Final\hibernate-validator-6.0.18.Final.jar;D:\devServer\mvnRep\org\jboss\logging\jboss-logging\3.3.3.Final\jboss-logging-3.3.3.Final.jar;D:\devServer\mvnRep\org\springframework\spring-web\5.1.13.RELEASE\spring-web-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\spring-webmvc\5.1.13.RELEASE\spring-webmvc-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\spring-aop\5.1.13.RELEASE\spring-aop-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\spring-expression\5.1.13.RELEASE\spring-expression-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-starter-test\2.1.12.RELEASE\spring-boot-starter-test-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-test\2.1.12.RELEASE\spring-boot-test-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-test-autoconfigure\2.1.12.RELEASE\spring-boot-test-autoconfigure-2.1.12.RELEASE.jar;D:\devServer\mvnRep\com\jayway\jsonpath\json-path\2.4.0\json-path-2.4.0.jar;D:\devServer\mvnRep\net\minidev\json-smart\2.3\json-smart-2.3.jar;D:\devServer\mvnRep\net\minidev\accessors-smart\1.2\accessors-smart-1.2.jar;D:\devServer\mvnRep\junit\junit\4.12\junit-4.12.jar;D:\devServer\mvnRep\org\assertj\assertj-core\3.11.1\assertj-core-3.11.1.jar;D:\devServer\mvnRep\org\mockito\mockito-core\2.23.4\mockito-core-2.23.4.jar;D:\devServer\mvnRep\net\bytebuddy\byte-buddy\1.9.16\byte-buddy-1.9.16.jar;D:\devServer\mvnRep\net\bytebuddy\byte-buddy-agent\1.9.16\byte-buddy-agent-1.9.16.jar;D:\devServer\mvnRep\org\objenesis\objenesis\2.6\objenesis-2.6.jar;D:\devServer\mvnRep\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\devServer\mvnRep\org\hamcrest\hamcrest-library\1.3\hamcrest-library-1.3.jar;D:\devServer\mvnRep\org\skyscreamer\jsonassert\1.5.0\jsonassert-1.5.0.jar;D:\devServer\mvnRep\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;D:\devServer\mvnRep\org\springframework\spring-core\5.1.13.RELEASE\spring-core-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\spring-jcl\5.1.13.RELEASE\spring-jcl-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\spring-test\5.1.13.RELEASE\spring-test-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\xmlunit\xmlunit-core\2.6.3\xmlunit-core-2.6.3.jar;D:\devServer\mvnRep\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;D:\devServer\mvnRep\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;D:\devServer\mvnRep\org\activiti\activiti-spring-boot-starter\7.1.0.M6\activiti-spring-boot-starter-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-spring-app-process\7.1.0.M6\activiti-spring-app-process-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-spring-application\7.1.0.M6\activiti-spring-application-7.1.0.M6.jar;D:\devServer\mvnRep\commons-io\commons-io\2.6\commons-io-2.6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-spring-identity\7.1.0.M6\activiti-spring-identity-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-spring-security\7.1.0.M6\activiti-spring-security-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\api\activiti-api-process-model\7.1.0.M6\activiti-api-process-model-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\api\activiti-api-process-runtime\7.1.0.M6\activiti-api-process-runtime-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\api\activiti-api-model-shared\7.1.0.M6\activiti-api-model-shared-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\api\activiti-api-runtime-shared\7.1.0.M6\activiti-api-runtime-shared-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-spring\7.1.0.M6\activiti-spring-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-bpmn-converter\7.1.0.M6\activiti-bpmn-converter-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-process-validation\7.1.0.M6\activiti-process-validation-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-spring-project\7.1.0.M6\activiti-spring-project-7.1.0.M6.jar;D:\devServer\mvnRep\org\springframework\spring-jdbc\5.1.13.RELEASE\spring-jdbc-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\spring-orm\5.1.13.RELEASE\spring-orm-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\apache\commons\commons-lang3\3.8.1\commons-lang3-3.8.1.jar;D:\devServer\mvnRep\javax\el\el-api\2.2\el-api-2.2.jar;D:\devServer\mvnRep\org\slf4j\jcl-over-slf4j\1.7.30\jcl-over-slf4j-1.7.30.jar;D:\devServer\mvnRep\org\activiti\activiti-engine\7.1.0.M6\activiti-engine-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-project-model\7.1.0.M6\activiti-project-model-7.1.0.M6.jar;D:\devServer\mvnRep\org\apache\commons\commons-email\1.5\commons-email-1.5.jar;D:\devServer\mvnRep\com\sun\mail\javax.mail\1.6.2\javax.mail-1.6.2.jar;D:\devServer\mvnRep\javax\activation\activation\1.1\activation-1.1.jar;D:\devServer\mvnRep\de\odysseus\juel\juel-api\2.2.7\juel-api-2.2.7.jar;D:\devServer\mvnRep\de\odysseus\juel\juel-impl\2.2.7\juel-impl-2.2.7.jar;D:\devServer\mvnRep\de\odysseus\juel\juel-spi\2.2.7\juel-spi-2.2.7.jar;D:\devServer\mvnRep\com\fasterxml\jackson\core\jackson-core\2.9.10\jackson-core-2.9.10.jar;D:\devServer\mvnRep\joda-time\joda-time\2.10.5\joda-time-2.10.5.jar;D:\devServer\mvnRep\org\activiti\activiti-bpmn-model\7.1.0.M6\activiti-bpmn-model-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-api-process-runtime-impl\7.1.0.M6\activiti-api-process-runtime-impl-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-connector-model\7.1.0.M6\activiti-connector-model-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-spring-connector\7.1.0.M6\activiti-spring-connector-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-api-model-shared-impl\7.1.0.M6\activiti-api-model-shared-impl-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-api-runtime-shared-impl\7.1.0.M6\activiti-api-runtime-shared-impl-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-spring-security-policies\7.1.0.M6\activiti-spring-security-policies-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-api-task-runtime-impl\7.1.0.M6\activiti-api-task-runtime-impl-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\api\activiti-api-task-model\7.1.0.M6\activiti-api-task-model-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\api\activiti-api-task-runtime\7.1.0.M6\activiti-api-task-runtime-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-api-task-model-impl\7.1.0.M6\activiti-api-task-model-impl-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-common-util\7.1.0.M6\activiti-common-util-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-api-process-model-impl\7.1.0.M6\activiti-api-process-model-impl-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-spring-process-extensions\7.1.0.M6\activiti-spring-process-extensions-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\activiti-spring-resource-loader\7.1.0.M6\activiti-spring-resource-loader-7.1.0.M6.jar;D:\devServer\mvnRep\org\activiti\core\common\activiti-spring-resource-finder\7.1.0.M6\activiti-spring-resource-finder-7.1.0.M6.jar;D:\devServer\mvnRep\org\springframework\spring-context\5.1.13.RELEASE\spring-context-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\spring-tx\5.1.13.RELEASE\spring-tx-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\spring-beans\5.1.13.RELEASE\spring-beans-5.1.13.RELEASE.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot\2.1.12.RELEASE\spring-boot-2.1.12.RELEASE.jar;D:\devServer\mvnRep\org\springframework\security\spring-security-core\5.1.7.RELEASE\spring-security-core-5.1.7.RELEASE.jar;D:\devServer\mvnRep\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;D:\devServer\mvnRep\com\fasterxml\uuid\java-uuid-generator\3.1.4\java-uuid-generator-3.1.4.jar;D:\devServer\mvnRep\com\fasterxml\jackson\core\jackson-annotations\2.9.10\jackson-annotations-2.9.10.jar;D:\devServer\mvnRep\org\mybatis\spring\boot\mybatis-spring-boot-starter\2.1.4\mybatis-spring-boot-starter-2.1.4.jar;D:\devServer\mvnRep\org\springframework\boot\spring-boot-starter-jdbc\2.1.12.RELEASE\spring-boot-starter-jdbc-2.1.12.RELEASE.jar;D:\devServer\mvnRep\com\zaxxer\HikariCP\3.2.0\HikariCP-3.2.0.jar;D:\devServer\mvnRep\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\2.1.4\mybatis-spring-boot-autoconfigure-2.1.4.jar;D:\devServer\mvnRep\org\mybatis\mybatis-spring\2.0.6\mybatis-spring-2.0.6.jar;D:\devServer\mvnRep\org\mybatis\mybatis\3.5.6\mybatis-3.5.6.jar;D:\devServer\mvnRep\mysql\mysql-connector-java\8.0.15\mysql-connector-java-8.0.15.jar;D:\devServer\mvnRep\org\activiti\activiti-image-generator\7.1.0.M6\activiti-image-generator-7.1.0.M6.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-awt-util\1.10\batik-awt-util-1.10.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-util\1.10\batik-util-1.10.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-constants\1.10\batik-constants-1.10.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-i18n\1.10\batik-i18n-1.10.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\xmlgraphics-commons\2.2\xmlgraphics-commons-2.2.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-dom\1.10\batik-dom-1.10.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-css\1.10\batik-css-1.10.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-ext\1.10\batik-ext-1.10.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-xml\1.10\batik-xml-1.10.jar;D:\devServer\mvnRep\xalan\xalan\2.7.2\xalan-2.7.2.jar;D:\devServer\mvnRep\xalan\serializer\2.7.2\serializer-2.7.2.jar;D:\devServer\mvnRep\xml-apis\xml-apis\1.4.01\xml-apis-1.4.01.jar;D:\devServer\mvnRep\xml-apis\xml-apis-ext\1.3.04\xml-apis-ext-1.3.04.jar;D:\devServer\mvnRep\org\apache\xmlgraphics\batik-svggen\1.10\batik-svggen-1.10.jar;D:\devServer\mvnRep\com\alibaba\fastjson\1.2.47\fastjson-1.2.47.jar;D:\devServer\mvnRep\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;D:\devServer\mvnRep\org\projectlombok\lombok\1.16.20\lombok-1.16.20.jar;D:\devServer\mvnRep\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;D:\devServer\mvnRep\io\swagger\swagger-annotations\1.5.16\swagger-annotations-1.5.16.jar;D:\devServer\mvnRep\io\springfox\springfox-swagger2\2.7.0\springfox-swagger2-2.7.0.jar;D:\devServer\mvnRep\io\swagger\swagger-models\1.5.13\swagger-models-1.5.13.jar;D:\devServer\mvnRep\io\springfox\springfox-spi\2.7.0\springfox-spi-2.7.0.jar;D:\devServer\mvnRep\io\springfox\springfox-core\2.7.0\springfox-core-2.7.0.jar;D:\devServer\mvnRep\io\springfox\springfox-schema\2.7.0\springfox-schema-2.7.0.jar;D:\devServer\mvnRep\io\springfox\springfox-swagger-common\2.7.0\springfox-swagger-common-2.7.0.jar;D:\devServer\mvnRep\io\springfox\springfox-spring-web\2.7.0\springfox-spring-web-2.7.0.jar;D:\devServer\mvnRep\org\reflections\reflections\0.9.11\reflections-0.9.11.jar;D:\devServer\mvnRep\org\javassist\javassist\3.21.0-GA\javassist-3.21.0-GA.jar;D:\devServer\mvnRep\com\google\guava\guava\18.0\guava-18.0.jar;D:\devServer\mvnRep\com\fasterxml\classmate\1.4.0\classmate-1.4.0.jar;D:\devServer\mvnRep\org\springframework\plugin\spring-plugin-core\1.2.0.RELEASE\spring-plugin-core-1.2.0.RELEASE.jar;D:\devServer\mvnRep\org\springframework\plugin\spring-plugin-metadata\1.2.0.RELEASE\spring-plugin-metadata-1.2.0.RELEASE.jar;D:\devServer\mvnRep\org\mapstruct\mapstruct\1.1.0.Final\mapstruct-1.1.0.Final.jar;D:\devServer\mvnRep\io\springfox\springfox-swagger-ui\2.7.0\springfox-swagger-ui-2.7.0.jar;D:\devServer\mvnRep\com\alibaba\easyexcel\2.2.6\easyexcel-2.2.6.jar;D:\devServer\mvnRep\org\apache\poi\poi\3.17\poi-3.17.jar;D:\devServer\mvnRep\commons-codec\commons-codec\1.11\commons-codec-1.11.jar;D:\devServer\mvnRep\org\apache\commons\commons-collections4\4.1\commons-collections4-4.1.jar;D:\devServer\mvnRep\org\apache\poi\poi-ooxml\3.17\poi-ooxml-3.17.jar;D:\devServer\mvnRep\com\github\virtuald\curvesapi\1.04\curvesapi-1.04.jar;D:\devServer\mvnRep\org\apache\poi\poi-ooxml-schemas\3.17\poi-ooxml-schemas-3.17.jar;D:\devServer\mvnRep\org\apache\xmlbeans\xmlbeans\2.6.0\xmlbeans-2.6.0.jar;D:\devServer\mvnRep\stax\stax-api\1.0.1\stax-api-1.0.1.jar;D:\devServer\mvnRep\cglib\cglib\3.1\cglib-3.1.jar;D:\devServer\mvnRep\org\ow2\asm\asm\4.2\asm-4.2.jar;D:\devServer\mvnRep\org\ehcache\ehcache\3.6.3\ehcache-3.6.3.jar com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.demo.activiti7.inherit.DemoTest,testInherit
  2. 1--A and A
  3. 2--A and A
  4. 3--A and D
  5. 4--B and A
  6. 5--B and A
  7. 6--A and D
  8. 7--B and B
  9. 8--B and B
  10. 9--A and D
  11. Process finished with exit code 0

5.2.3 分析

还是分析结果“4—B and A”
a2.show(b), 父类接收子类,B 中不存在 show(B),找父类 show(B),没有找本类的show(super(B)),找到 show(A)。

6 小结

6.1 继承的特性

image.png

  • 继承是面向对象编程的一种强大的代码复用方式,子类拥有父类非 private 的属性、方法。(protected允许子类访问父类的字段和方法;)
  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展,即子类可以用自己的方式实现父类的方法。
  • 子类的构造方法可以通过super()调用父类的构造方法;
  • 子类和父类的关系是is,has关系不能用继承。Java 的继承是单继承,所有类最终的根类是Object,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
  • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
  • 向上转型:可以安全地向上转型为更抽象的类型;
  • 向下转型:可以强制向下转型,最好借助instanceof判断;

    1. if (obj instanceOf B) {
    2. B b = (B) obj;
    3. }

    注意:

  • final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:

  • 构造器:子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
  • 通过 spuer 调用父类的属性,方法。