参考:继承
1 Java 的三大特性
继承、封装、多态。
继承,is a,关系;
封装,隐藏内部实现;(经常我们修改内部实现或逻辑,对外的数据模型却不用调整)
多态,运行时候才知道具体的东西,由实际场景所决定。(override,overload,不同的人认为不同,有的说都是多态的体现,有的只认可override覆盖,overload重载不算。不纠结这个,使用即可)
2 什么是继承
从代码讲,使用了 extends 关键字
class ClassName extends SuperClassName {
// ...
}
3 继承能干什么
3.1 复用对象的子段:
包括字段公用(其实归根到底就是方法的继承使用,可见修辞符的使用——public、protected、default、private),比如开发中分页查询,继承 BasePageQuery 基类;
package com.demo.activiti7.inherit;
import org.junit.Test;
public class DemoTest {
/**
* 参考: https://blog.csdn.net/chenssy/article/details/12786385
*/
@Test
public void testInherit() {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
// 子类可将父类的 public、protected 对象
c.a = b.a = a1.a = a2.a = d.a;
c.b = b.b = a1.b = a2.b = d.b;
// System.out.println("1--" + a1.show(b));
// System.out.println("2--" + a1.show(c));
// System.out.println("3--" + a1.show(d));
System.out.println("4--" + a2.show(b));
System.out.println("4--" + a2.show(a1));
System.out.println("-----------" + c.show(c));
System.out.println("-----------" + b.show(a2));
// System.out.println("5--" + a2.show(c));
// System.out.println("6--" + a2.show(d));
// System.out.println("7--" + b.show(b));
// System.out.println("8--" + b.show(c));
// System.out.println("9--" + b.show(d));
}
class A {
// 基类中的public、protected被子类继承
public String a = "1";
protected String b = "b";
public String show(D obj) {
return ("A and D");
}
public String show(A obj) {
return ("A and A");
}
public <T extends B> String show(T obj) {
return ("A and A");
}
}
class B extends A {
public String show(B obj){
return ("B and B");
}
@Override
public String show(A obj){
return ("B and A");
}
}
class C extends B {
}
class D extends B {
}
}
package com.hbte.sharp.bo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* @ClassName PageQuery
* @Description 分页参数
* @Version 1.0.0
* @Author Bruce
* @Date 2020/9/23 10:23
**/
@ApiModel(value = "分页参数", description = "query")
public class PageQuery extends BaseQuery {
@ApiModelProperty(value = "第几页,默认第一页")
private Integer pageNum = 1;
@ApiModelProperty(value = "每页条数,默认10")
private Integer pageSize= 10;
@ApiModelProperty(value = "导出方式 0.导出当前页 1.导出全部 导出所选在前端做 默认为0")
private Integer type = 0;
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
}
package com.hbte.sharp.bo.flow;
import com.hbte.sharp.bo.PageQuery;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* @author wb
* @date 2020-11-26-18:37
*/
@ApiModel(value = "流程基本信息关键字查询", description = "query")
public class FlowBaseInfoKeyWordsQuery extends PageQuery {
@ApiModelProperty(value = "关键字")
private String keyWords;
public String getKeyWords() {
return keyWords;
}
public void setKeyWords(String keyWords) {
this.keyWords = keyWords;
}
}
3.2 复用对象的方法
package com.hbte.sharp.po.data.listener;
import com.alibaba.excel.event.AnalysisEventListener;
import com.hbte.sharp.util.GenericSuperclassUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import java.lang.reflect.Field;
import java.util.Date;
import java.util.List;
/**
* 抽象listener
*
* @author Bruce
* @date 2020/12/2 14:32
*/
public abstract class AbstractDataImportListener<T, R> extends AnalysisEventListener<T> {
private final Logger log = LoggerFactory.getLogger(AbstractDataImportListener.class);
private String userName;
private Long userId;
private Date createTime;
private List<R> resposeList;
public AbstractDataImportListener(String userName, Long userId, Date createTime, List<R> resposeList) {
this.userName = userName;
this.userId = userId;
this.createTime = createTime;
this.resposeList = resposeList;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public List<R> getResposeList() {
return resposeList;
}
public void setResposeList(List<R> resposeList) {
this.resposeList = resposeList;
}
public Class getDataModel(Class<? extends AbstractDataImportListener> listener) {
return GenericSuperclassUtil.getActualTypeArgument(listener, 0);
}
public Class getReturnModel(Class<? extends AbstractDataImportListener> listener) {
return GenericSuperclassUtil.getActualTypeArgument(listener, 1);
}
/**
* 继承该类的,都可以会用该方法来确认失败的数据条数,不需要具体的业务类来实现一套
*/
public int failNum() {
int count = 0;
if (CollectionUtils.isEmpty(resposeList)) {
return count;
}
try {
for (R obj : resposeList) {
Class<?> objClass = obj.getClass();
Field successfulFlag = objClass.getDeclaredField("successfulFlag");
successfulFlag.setAccessible(true);
if ("否".equals(successfulFlag.get(obj).toString())) {
count += 1;
}
}
} catch (NoSuchFieldException e) {
log.error("不存在 successfulFlag 标志字段。", e);
} catch (IllegalAccessException e) {
log.error("successfulFlag 标志字段无法访问。", e);
}
return count;
}
}
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 {
/**
* 参考: https://blog.csdn.net/chenssy/article/details/12786385
*/
@Test
public void testInherit() {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
c.a = b.a = a1.a = a2.a = d.a;
c.b = b.b = a1.b = a2.b = d.b;
System.out.println("1--" + a1.show(b));
System.out.println("2--" + a1.show(c));
System.out.println("3--" + a1.show(d));
System.out.println("4--" + a2.show(b));
System.out.println("5--" + a2.show(c));
System.out.println("6--" + a2.show(d));
System.out.println("7--" + b.show(b));
System.out.println("8--" + b.show(c));
System.out.println("9--" + b.show(d));
}
class A {
public String a = "1";
protected String b = "b";
public String show(D obj) {
return ("A and D");
}
public String show(A obj) {
return ("A and A");
}
public <T extends B> String show(T obj) {
return ("A and A");
}
}
class B extends A {
public String show(B obj) {
return ("B and B");
}
@Override
public String show(A obj) {
return ("B and A");
}
}
class C extends B {
}
class D extends B {
}
}
<a name="dCrfe"></a>
### 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
<a name="CpjiS"></a>
### 5.1.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。
<a name="cwV6Z"></a>
## 5.2 小例子二
<a name="bpyAj"></a>
### 5.2.1 代码
```java
package com.demo.activiti7.inherit;
import org.junit.Test;
public class DemoTest {
/**
* 参考: https://blog.csdn.net/chenssy/article/details/12786385
*/
@Test
public void testInherit() {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
c.a = b.a = a1.a = a2.a = d.a;
c.b = b.b = a1.b = a2.b = d.b;
System.out.println("1--" + a1.show(b));
System.out.println("2--" + a1.show(c));
System.out.println("3--" + a1.show(d));
System.out.println("4--" + a2.show(b));
System.out.println("5--" + a2.show(c));
System.out.println("6--" + a2.show(d));
System.out.println("7--" + b.show(b));
System.out.println("8--" + b.show(c));
System.out.println("9--" + b.show(d));
}
class A {
public String a = "1";
protected String b = "b";
public String show(D obj) {
return ("A and D");
}
public String show(A obj) {
return ("A and A");
}
// public <T extends B> String show(T obj) {
// return ("A and A");
// }
}
class B extends A {
public String show(B obj) {
return ("B and B");
}
@Override
public String show(A obj) {
return ("B and A");
}
}
class C extends B {
}
class D extends B {
}
}
与例子一相比,就只是屏蔽代码:
// public
// return (“A and A”);
// }
5.2.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=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
1--A and A
2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D
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 继承的特性
- 继承是面向对象编程的一种强大的代码复用方式,子类拥有父类非 private 的属性、方法。(
protected
允许子类访问父类的字段和方法;) - 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展,即子类可以用自己的方式实现父类的方法。
- 子类的构造方法可以通过
super()
调用父类的构造方法; - 子类和父类的关系是is,has关系不能用继承。Java 的继承是单继承,所有类最终的根类是
Object
,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。 - 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
- 向上转型:可以安全地向上转型为更抽象的类型;
向下转型:可以强制向下转型,最好借助
instanceof
判断;if (obj instanceOf B) {
B b = (B) obj;
}
注意:
final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:
- 构造器:子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
- 通过 spuer 调用父类的属性,方法。