如何在不使用访问器的情况下访问超类中的私有变量?

时间:2015-03-29 01:54:24

标签: java inheritance

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尝试了一些东西,但没有成功。对不起这个问题:我知道之前已经回答了,但我从过去的答案中看到的任何内容都没有解决我的基本问题。

2 个答案:

答案 0 :(得分:2)

PricedApt.toString()只应引用priceRentalApt.toString()

您走在正确的轨道上,只需从rented移除tenantPricedApt.toString()

答案 1 :(得分:1)

如果超类没有为私有字段提供访问器方法,则强烈表明您不应该尝试在子类中访问它。

如果这些都是您可以更改的类,那么正确的解决方案可能是向超类添加一个访问器方法。如果您不希望该字段在公共API中公开,请将其设为protected或将其打包为私有。

或者更改子类,使其不需要来访问子类的超类private字段。 (对于toString方法,您通常可以嵌入超类toString的结果。这取决于您对格式化的要求等。)

但是如果你想忽略这个建议,就可以使用反射来访问它。有关详细信息,请参阅链接的问答。