public class RentalApt extends Apartment{
private String tenant;
private boolean rented;
public RentalApt(String owner, int size, boolean rented, String who){
super(owner,size);
tenant = who;
this.rented = rented;
}
public boolean getRented(){
return rented;
}
public String getTenant(){
return tenant;
}
public void setRented(boolean isRented){
rented = isRented;
}
public void setTenant(String who){
tenant= who;
}
public String toString(){
String s = super.toString();
return (s + " occupied? " + rented + " tenant: " + tenant);
}
}
假设您创建了一个派生自RentalApt类的新PricedApt类(因此它派生自派生类)。它增加了一个新的双重属性,价格,它告诉公寓的月租金是多少。这是对类的构造函数调用:
PricedApt p = new PricedApt("jill", 900, true, "jack", 1050.00);
使用super适当的,为类写一个toString方法,除了告诉jill作为所有者和jack作为租户之外,还在toString输出中添加短语“price:”+ price。 (注意:在PricedApt中对toString的超级调用将使用其基类RentalApt中的toString方法。
public class PricedApt extends RentalApt {
private double price;
public String toString() {
//code
所以我知道我需要在RentalApt中回收toString()方法,但是我收到了租借和租户的错误,因为它们是私有的。我已经尝试了我所知道的一切,但我没有设法克服这个错误。这是我到目前为止所做的:
public String toString() {
String s = super.toString();
return (s + " occupied? " + rented + " tenant: " + tenant+ " price: " + price);
}
我用关键字super尝试了一些东西,但没有成功。对不起这个问题:我知道之前已经回答了,但我从过去的答案中看到的任何内容都没有解决我的基本问题。
答案 0 :(得分:2)
PricedApt.toString()
只应引用price
和RentalApt.toString()
。
您走在正确的轨道上,只需从rented
移除tenant
和PricedApt.toString()
答案 1 :(得分:1)
如果超类没有为私有字段提供访问器方法,则强烈表明您不应该尝试在子类中访问它。
如果这些都是您可以更改的类,那么正确的解决方案可能是向超类添加一个访问器方法。如果您不希望该字段在公共API中公开,请将其设为protected
或将其打包为私有。
或者更改子类,使其不需要来访问子类的超类private
字段。 (对于toString
方法,您通常可以嵌入超类toString
的结果。这取决于您对格式化的要求等。)
但是如果你想忽略这个建议,就可以使用反射来访问它。有关详细信息,请参阅链接的问答。