Java子类无法访问父类属性求助:super关键字使用与属性赋值
解决子类无法访问父类属性的问题
哥们,我瞅了你的代码,问题核心是父类的属性压根没被正确初始化,而且你对super关键字的用法有点跑偏,咱们一步步捋明白:
问题根源
- 父类
Member的name和email是private修饰的,子类Teacher根本没法直接碰这些属性; - 父类既没提供带参数的构造器,也没写
setter方法,导致子类完全没机会给父类的属性赋值; - 你在
Teacher构造器里调用super.getName()和super.getEmail()只是读属性值(这时候属性还是null),根本没做赋值操作,打印出来自然是空的。
解决方案
咱们给父类加个带参数的构造器,然后在子类构造器里用super()调用父类构造器来初始化父类属性,这样子类就能通过父类的get方法拿到正确的值了。
修改后的父类Member代码
public class Member { private String email; private String name; // 新增带参数构造器,专门用来初始化name和email public Member(String name, String email) { this.name = name; this.email = email; } public String getEmail() { return email; } public String getName() { return name; } }
修改后的子类Teacher代码
class Teacher extends Member { private String qualifications; // 子类构造器第一行必须调用父类构造器,完成父类属性初始化 public Teacher(String name, String email, String qualifications) { super(name, email); // 这行是关键:把传入的name和email交给父类初始化 this.qualifications = qualifications; } public String getQualifications() { return qualifications; } public String toString() { StringBuffer details = new StringBuffer(); details.append(super.getName()); details.append(' '); if (qualifications != null && qualifications.trim().length() > 0) { details.append("(" + qualifications + ")"); details.append(' '); } details.append(super.getEmail()); return details.toString(); } }
关键知识点唠两句
super的正确打开方式:要调用父类构造器的话,super(参数)必须放在子类构造器的第一行,这样才能在子类自己初始化前,先把父类的属性搞定;- 私有属性的规矩:
private修饰的属性只能被自己类操作,子类必须通过父类提供的构造器、setter方法或者公共getter来打交道; - 要是你不想给父类加带参构造器,也可以给
Member加setName()和setEmail()方法,然后在Teacher构造器里调用super.setName(name)和super.setEmail(email)来赋值,但用构造器初始化是更规范的做法。
现在跑代码,就能正确打印出name、qualifications和email的内容啦!
内容的提问来源于stack exchange,提问作者Bob Hope
相关产品推荐
相关产品推荐

