为什么无法从Student类继承remark变量?Java单变量继承问题咨询
问题核心原因分析
- 继承关系不符合面向对象设计逻辑:Course(课程)和Student(学生)不存在IS-A(是一个)的从属关系,强行用
extends继承本身就是设计错误,课程不属于学生的子类,这种设计会带来大量冗余属性和逻辑问题。 - 父类构造方法调用不匹配:你在Course构造中写的
super(remark),但Student类仅定义了一个需要7个参数(fname、lname、sid、numberOfCourse、isTuitionPaid、course、remark)的构造方法,没有仅接收char[]类型参数的构造,这一步本身就会触发编译报错,程序根本无法正常运行。 - 私有成员无法直接访问:Student类里的remark是
private修饰的,private属于类私有成员,就算子类合法继承了父类,也不能直接访问父类的private成员,只能通过父类对外暴露的public访问方法操作。 - Java不支持选择性继承单个成员:继承机制会全量继承父类所有非静态成员,没有只继承某一个变量的语法支持。
可行实现方案
方案1(推荐):用组合/关联关系替代错误继承
Course和Student本身是关联关系(比如一门课对应多个选课学生、一个学生选多门课),你只需要在Course类里持有对应的Student实例引用,就能调用Student的getRemark()方法拿到备注:
// 修正后的Course类,不再继承Student public class Course { private String[] courseName; private String[] courseNo; private int courseCredit; // 持有关联的Student实例 private Student student; // 构造方法传入需要关联的Student对象 Course(String[] courseNo,String[] courseName,int courseCredit,Student student) { this.courseNo = courseNo; this.courseName = courseName; this.courseCredit = courseCredit; this.student = student; } // 需要用remark的时候直接调用父类的getter public char[] getStudentRemark() { return student.getRemark(); } // 其余原有get/set方法保留即可 }
方案2(不推荐,仅做语法修复):强行修复继承逻辑
如果你非要保留Course继承Student的写法,需要做两处修改:
- 给Student类新增仅接收remark的构造方法,或者在Course的构造里补全父类构造需要的所有7个参数
- 所有操作remark的地方,都调用父类的
getRemark()和setRemark()方法,不能直接访问remark变量
示例代码:
// 先给Student类新增构造方法 public class Student extends Person { // 原有代码不变,新增适配构造 Student(char[] remark) { // 这里需要给Person父类的fname、lname传默认值,也可以根据需求扩展参数 super("默认名","默认姓"); this.remark = remark; } } // Course类操作remark的示例 public class Course extends Student { // 原有属性、构造不变 public void testUseRemark() { // 正确写法,调用父类public getter char[] r = getRemark(); // 错误写法,private变量不能直接访问:char[] r = remark; } }
内容的提问来源于stack exchange,提问作者Pablo Job
相关产品推荐
相关产品推荐

