2016-11-15 77 views
1

我有一个类如何访问子方法内的子类中的父类变量?

public class A { 
    private String name; 

    public void setName(String name){ 
     this.name = name; 
    } 

    public string getName(){return name;} 

    public String toString() { 
     StringBuilder builder = new StringBuilder(); 
     builder.append(name).append(", "); 
     return builder.toString(); 
    } 
} 

我有延伸的一个子类B和我不得不从在toString方法访问名字B.我写了下面的代码,但不知道这是否一个好的做法?

public class B extends A { 
    private String gender; 

    public void setGender(String gender){ 
     this.gender = gender; 
    } 

    public string getGender(){return gender;} 

    @Override 
    public String toString() { 
     c = new A(); 
     StringBuilder builder = new StringBuilder(); 
     builder.append(c.getName()).append(", "); 
     builder.append(gender).append(", "); 
     return builder.toString(); 
    } 
} 

编辑: 如果我不能在B类访问私人字符串名称,我用super.setName(name)@Override setName()?在那种情况下,如果我不想使用A的任何对象,那么它与使用类B不同的地方有什么不同?

我刚开始使用JAVA来修改服务。

+0

您可以使用'super'关键字来使用模式类方法或实例变量。 like'super.name' – seal

+0

不,这不是很好的做法。首先,'c'变量中的'name'值从来没有被设置为任何东西,所以它总是默认的。您可以从派生类中访问基类的getter和setter,为什么不使用这些呢? – David

回答

4

当你继承一个类时,你也继承所有来自继承的公共和保护的方法和变量。所以,你可以做

@Override 
public String toString() { 
    StringBuilder builder = new StringBuilder(); 
    builder.append(this.getName()).append(", "); 
    builder.append(this.getGender()).append(", "); 
    return builder.toString(); 
} 
3

简单地通过调用你的toString方法getName()super.getName()

,如:

@Override 
public String toString() { 
    StringBuilder builder = new StringBuilder(); 
    builder.append(getName()).append(", "); 
    builder.append(gender).append(", "); 
    return builder.toString(); 
} 
2

永远不要忘记一句老话:你没有继承你父母的私处。

如果你想B有机会获得A.name,你有两个选择:

  • 变化name是要么publicA(坏)或protected(更好)。
  • 访问nameA的设置者和吸气剂,例如, this.getName()
  • 使用reflection

什么你做目前刚刚返回的A.name默认值,而不是实际属于你的B实例名称的值。

+0

我无法更改父类,它正在几个不同的项目中使用。而且我忘了提及A类属于不同的包装。 – spod

+1

@spod它所在的包与“public”或“protected”级别无关。无论如何,你最好的选择是只使用提供的setters/getters或者在需要时使用反射。 –