Java子类访问父类私有变量遇构造器错误,请求帮助
解决Java子类构造器错误及类设计问题
嘿,我来帮你搞定这个Java问题!首先咱们先拆解你遇到的错误,再一步步解决。
错误原因解析
你看到的错误提示:
Implicit super constructor HelloWorld.Author() is undefined. Must explicitly invoke another constructor.
意思是:Java编译器默认会在子类构造器的第一行自动插入super(),用来调用父类的无参构造器。但你的Author类只定义了一个带参的构造器(public Author(String name,String email,char gender)),Java在这种情况下不会自动生成无参构造器,所以编译器找不到对应的super(),就抛出了这个错误。
另外要提一句:你代码里尝试通过a.getName()获取作者名字的做法是对的——父类的私有变量确实只能通过getter方法访问,这部分没问题,错误根源不在这哦。
推荐解决方案:修正类之间的关系
这里要纠正一个面向对象设计的小问题:Book(书)和Author(作者)是关联关系(书「拥有」一个作者),而不是继承关系(书「是」一个作者),所以Book根本不应该继承Author。这种设计既符合逻辑,也能直接解决构造器的问题。
修改后的代码如下:
public class Author { private String name; private String email; private char gender; public Author(String name, String email, char gender) { this.name = name; this.email = email; this.gender = gender; } // 把getter改成public更合理,因为外部需要获取作者信息 public String getName() { return name; } // 可以根据需求添加其他getter/setter,比如获取邮箱、性别 public String getEmail() { return email; } public char getGender() { return gender; } } public class Book { private String bookName; // 变量名改成bookName避免和作者name混淆 private Author author; // 直接持有Author对象,体现"拥有"关系 private double price; private int qtyInStock; public Book(String bookName, Author author, double price, int qtyInStock) { this.bookName = bookName; this.author = author; // 直接保存传入的作者对象 this.price = price; this.qtyInStock = qtyInStock; } // 如果需要获取作者名字,通过author的getter方法 public String getAuthorName() { return author.getName(); } }
不推荐的方案(仅作知识补充)
如果你非要坚持让Book继承Author(非常不建议,因为不符合"is-a"的继承原则),那必须在Book构造器的第一行显式调用父类的带参构造器,因为父类没有无参构造器:
public class Book extends Author { private String bookName; private double price; private int qtyInStock; public Book(String bookName, Author a, double price, int qtyInStock) { // 第一行必须调用父类的带参构造器,传入所需的name、email、gender super(a.getName(), a.getEmail(), a.getGender()); this.bookName = bookName; this.price = price; this.qtyInStock = qtyInStock; } }
再次强调:这种设计不符合面向对象的逻辑,实际开发中别这么用哦!
内容的提问来源于stack exchange,提问作者Latheeshwar Raj
相关产品推荐
相关产品推荐

