今天在写接口的时候发现了一个问题,使用@RestController注解下Controller中的方法返回对象(子类CourseInfo)转为JSON数据时会有父类CourseBase中private修饰的字段。此处分析一下Java中父类private字段能否被子类继承的问题。

问题场景

使用postman测试http://localhost:31200/course/coursebase/list/1/2?companyId=1,返回JSON数据如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"success": true,
"code": 10000,
"message": "操作成功!",
"queryResult": {
"list": [
{
"id": "402885816243d2dd016243f24c030002",
"name": "大数据",
"users": null,
"mt": null,
"st": null,
"grade": null,
"studymodel": null,
"teachmode": null,
"description": "111111大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据大数据",
"status": null,
"companyId": null,
"userId": null,
"pic": "group1/M00/00/02/wKhlQFrQfNqAL0d_AALDG1Ia4xE439.png"
}
],
"total": 6
}
}

后端返回的CourseInfo对象转为JSON后,出现了从父类中继承的private修饰的字段

父类中private字段能否被子类继承?

子类可以继承父类中的private字段,但是子类继承过来之后,不能对直接进行引用访问,那是父类中的私有部分,只能对父类中的成员开放。

一般情况下,父类中会有公用接口get、set之类的方法(或者其他public修饰的方法),可以通过这些方法进行访问。

demo

Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController //返回JSON数据
@RequestMapping("/course")
public class CourseController implements CourseControllerApi {
@Autowired
CourseService courseService;

@Override
@GetMapping("/coursebase/list/{page}/{size}") //Get请求参数中的companyId字段将被映射到courseListRequest中,作为数据库查询参数
public QueryResponseResult<CourseInfo> findCourseList(
@PathVariable("page") int page,
@PathVariable("size") int size,
CourseListRequest courseListRequest) {
return courseService.findCourseList(page,size,courseListRequest);
}
}

Service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* @Autor HumgTop
* @Date 2021/5/8 14:03
* @Version 1.0
*/
@Service
public class CourseService {
@Autowired
CourseMapper courseMapper;

//课程列表分页查询
public QueryResponseResult<CourseInfo> findCourseList(int page, int size, CourseListRequest courseListRequest) {
if (courseListRequest == null) {
courseListRequest = new CourseListRequest();
}
if (page < 0) {
page = 0;
}
if (size < 1) {
size = 20;
}
//设置分页参数
PageHelper.startPage(page, size);
//分页查询
Page<CourseInfo> courseListPage = courseMapper.findCourseListPage(courseListRequest);
//结果集
List<CourseInfo> result = courseListPage.getResult();
//总记录数
long total = courseListPage.getTotal();
//封装返回结果
QueryResult<CourseInfo> courseInfoQueryResult = new QueryResult<>();
courseInfoQueryResult.setList(result);
courseInfoQueryResult.setTotal(total);
return new QueryResponseResult<>(CommonCode.SUCCESS, courseInfoQueryResult);
}
}

Dao

1
2
3
4
5
6
7
8
9
/**
* Created by Administrator.
*/
@Mapper //Mybatis注解,可生成动态代理对象注入Service层中进行数据库操作
@Repository
public interface CourseMapper {
//通过courseListRequest中的companyId查询记录,查询结果封装为CourseInfo
Page<CourseInfo> findCourseListPage(CourseListRequest courseListRequest);
}

POJO

CourseInfo

1
2
3
4
5
6
7
8
9
10
11
12
13
@Data
@ToString
public class CourseInfo extends CourseBase {

private String id;
//课程图片
private String pic;
//课程名称
private String name;
//课程描述
private String description;
}

CourseBase

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Data
@ToString
@Entity
@Table(name="course_base")
//@GenericGenerator(name = "jpa-assigned", strategy = "assigned")
@GenericGenerator(name = "jpa-uuid", strategy = "uuid")
public class CourseBase implements Serializable {
private static final long serialVersionUID = -916357110051689486L;
@Id
@GeneratedValue(generator = "jpa-uuid")
@Column(length = 32)
private String id;
private String name;
private String users;
private String mt;
private String st;
private String grade;
private String studymodel;
private String teachmode;
private String description;
private String status;
@Column(name="company_id")
private String companyId;
@Column(name="user_id")
private String userId;
}