父类坑

简介: 父类坑

我要让全世界都记住我的温柔。——曼德拉

今天在项目中遇到一个小坑可把我吓坏了,记录一下,以免再犯

首先还原下场景吧,我们写个类

package com.ruben.pojo;
import lombok.Data;
/**
 * @ClassName: BaseEntity
 * @Description: 我还没有写描述
 * @Date: 2021/1/21 0021 21:01
 * *
 * @author: <achao1441470436@gmail.com>
 * @version: 1.0
 * @since: JDK 1.8
 */
@Data
public class BaseEntity {
    protected Integer id;
    public BaseEntity() {
    }
    public BaseEntity(Integer id) {
        this();
        this.id = id;
    }
}

很简单一个类,我们再写一个类继承一下它,这个类我们用作和数据库映射

package com.ruben.pojo.dataObject;/**
 * @ClassName: UserDataObject
 * @Date: 2020/11/21 0021 15:55
 * @Description:
 */
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruben.pojo.BaseEntity;
import com.ruben.pojo.UserInfo;
import lombok.*;
import java.io.Serializable;
/**
 * @ClassName: UserPO
 * @Description: 我还没有写描述
 * @Date: 2020/11/21 0021 15:55
 * *
 * @author: <achao1441470436@gmail.com>
 * @version: 1.0
 * @since: JDK 1.8
 */
@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
@TableName("user")
public class UserPO extends BaseEntity implements Serializable {
    private static final long serialVersionUID = -1891465370283313432L;
    private Integer id;
    private String username;
    private String password;
    @TableField(exist = false)
    private UserInfo userInfo;
    public UserPO(Integer id) {
        super(id);
    }
}

然后我们使用父类的构造方法去创建这个对象,并赋值id

UserPO userPO = new UserPO(888);

最后我们发现userPO.getId()出来的结果为null

是因为我们调用的父类的构造函数,是给父类的id赋值了

而我们getId()又被子类重写,导致获取不到我们想要的结果888

当时在项目中我使用了mybatis-plus,然后是这么写的

mpUserMapper.delete(Wrappers.lambdaQuery(new UserPO(888)));

最后执行出来的sql就很恐怖了。。。直接把整张表删了!!!

还好测试时发现了,不然就要跑路了-_-!之后的开发中应该多多避免类似的粗心。。。


相关文章
|
10月前
|
C#
C# 继承类中(父类与子类)构造函数的调用顺序
C# 继承类中(父类与子类)构造函数的调用顺序
|
12月前
|
C#
C#方法重写
C#方法重写
45 0
|
8月前
super关键字
super关键字用来访问父类内容,而this关键字用来访问本类内容。用法也有三种 1.在本类的成员方法中,访问本类的成员变量。 2.在本类的成员方法中,访问本类的另一个成员方法。 3.在本类的构造方法中,访问本类的另一个构造方法。 在第三种用法当中要注意: A.this(...)调用也必须是构造方法的第一个语句,唯一一个。 B.super和this两种构造调用,不能同时使用。
29 0
|
12月前
|
程序员
为什么子类会调用父类无参的构造函数
为什么子类会调用父类无参的构造函数
|
编译器
Super关键字详解
Super关键字详解
57 0
|
编译器 定位技术
在父类的构造函数中调用虚函数为什么不能实现多态
在父类的构造函数中调用虚函数为什么不能实现多态
84 0
|
开发者 Python
子类重写父类方法|学习笔记
快速学习子类重写父类方法,先来介绍子类重写父类方法。多态其实就是一种子类重写父类的方法。
163 0
子类到底能不能继承父类的私有属性?
继承就像是我们现实生活中的父子关系,儿子可以遗传父亲的一些特性,在面向对象语言中,就是一个类可以继承另一个类的一些特性,从而可以代码重用,其实继承体现的是is-a关系,父类同子类在本质上还是一类实体;子类通过继承父类的属性的行为,我们称之为继承。Java只支持单继承,不支持多继承。因为多继承容易带来安全隐患:当多个父类定义相同的功能,当功能内容不同的时候,子类对象不确定要运行哪一个,在Java中用另一种形式体现出来,就是接口的多实现。