这是一个零散的JAVA基础知识点:继承
问题引出:
我写了这么一个类BasePojo
package com.jt.pojo;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import lombok.experimental.Accessors;
//pojo基类,完成2个任务,2个日期,实现序列化
@Data
@Accessors(chain=true)
public class BasePojo implements Serializable{
//@TableField是MP中定义的注解,有了这个注解,还需要再编辑个自动赋值处理器,才能做到,以后在执行数据库操作时,不用手动地再去修改这两个时间了。
//可是配置了MyMetaObjectHandler,想注释掉ItemServiceImpl中的item.setUpdated(new Date()); 还是会报错,updated不能为空
/**创建日期*/
//新增时有效
@TableField(fill = FieldFill.INSERT)
private Date created;
/**修改日期*/
//新增/修改时 有效
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updated;
}
我又写了这么一个类Item
package com.jt.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.experimental.Accessors;
@JsonIgnoreProperties(ignoreUnknown=true) //表示JSON转化时忽略未知属性
@TableName("tb_item")
@Data
@Accessors(chain=true)
public class Item extends BasePojo{
@TableId(type=IdType.AUTO)
private Long id; //商品id
private String title; //商品标题
private String sellPoint; //商品卖点信息
private Long price; //商品价格 Long > double 算算数时Long算得更快,并且double存在精度问题(算得不准)
//如果一个商品的价格是9.58元,它在存储到数据库中时会*100。数据库在将数据返回时,会再÷100。
private Integer num; //商品数量
private String barcode; //条形码
private String image; //商品图片信息 1.jpg,2.jpg,3.jpg
private Long cid; //表示商品的分类id
private Integer status; //1正常,2下架
//为了满足页面调用需求,添加get方法
public String[] getImages(){
return image.split(",");
}
}
可见,Item类继承了BasePojo类,也就是说BasePojo是Item的爸爸。
由此,我就可以直接用Item对象调用BasePojo中的.setCreated()方法
那么问题来了:
Item为啥能调用.setCreated()方法呢?
分析:
父类BasePojo中的created和updated两个属性 都被private修饰,即这两个属性是父类私有的。
但父类中这两个属性所对应的get和set方法 可是被public修饰的,是公有的。
所以子类Item继承了父类中的get和set方法。
而子类Item在调用.setCreated()方法时,
item.setCreated();
得到的结果,还要赋给一个属性,一般这个属性还是叫created。
但注意:
这个created是在子类的内存空间中新new出来的。和父类BasePojo中的created没关系,只是名字恰好相同罢了。
所以子类Item中的这个created属性 是啥值,完全不受父类BasePojo的影响。
据说这个叫“乾坤大挪移”机制。
而我觉得这个更应该叫“克隆人”机制。