在子类构造函数上设置变量的最佳实践

时间:2015-10-23 18:36:33

标签: java

超类

public class food {
    private String name;
    public food( String name){
        this.name = name;
    }
    public void foodName() {
        System.out.println("This is "+name);
    }
}

子类

public class Bacon extends food {
    private String name;
    public Bacon (String name) {
        super(name);
        this.name=name;
    }
    public void foodName() {
        System.out.println("This is a food named " +name);
    }
}

对于子类培根的变量 name 在overriden方法中工作,这是最佳实践还是有更好的方法来做到这一点?

public Bacon(String name){
    super(name);
    this.name=name;
}

3 个答案:

答案 0 :(得分:1)

在类Bacon中,name的声明隐藏了Food类中的名称声明,而Bacon类中对name的所有引用都引用了Bacon.name not { {1}}。

请再次查看Inheritance chapter

Food.name中不再需要name声明。删除声明,因为它正在扩展Food类,它将具有name属性。 要访问子类中的名称,请将名称属性的访问说明符添加为受保护的

Bacon class

同时修改构造函数

protected String name; //inherited classes can have access to this property

答案 1 :(得分:0)

在这种情况下,更合乎逻辑的是将name变量标记为受保护,它将允许子类和包成员访问它。

超类

public class food {
    protected String name;
    public food( String name){
        this.name = name;
    }
    public void foodName() {
        System.out.println("This is "+name);
    }
}

删除子类中的重复name变量,只使用构造函数if superclass

public class Bacon extends food {
    public Bacon (String name) {
        super(name);
    }
    public void foodName() {
        System.out.println("This is a food named " +name);
    }
}

答案 2 :(得分:0)

Java中没有覆盖变量,并且通常不能从子类中的超类访问私有变量;所以你拥有的是两个独立的变量name

如果您希望子类有权访问该变量,请在超类中对其进行保护:

public class food {
   protected String name;
   //...
}

如果你真的想限制访问,而子类只需要使用变量(不要修改它),那么你应该使用一个getter方法。

public class food {
   private String name;
   protected String getName() {
      return name;
   }
   //...
}

您的子类可以调用getName()而不是name