如何返回超级变量的值?

时间:2016-11-22 20:11:02

标签: java super

我正在编写演示继承使用的程序,我使用super()关键字创建了一个变量。我现在试图将该变量的值放入一个调用它的新方法中,以便我可以在main方法中调用该方法以在其他类中使用它的值。

以下是相关代码:

食品类(超级类)

public class Food {

    //field that stores the name of the food
    public String name; 
    //constructor that takes the name of the food as an argument
    public Food(String name){
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

肉类(具有超级关键字的子类)

public class Meat extends Food 
{
public Meat() {
    super("Meat");
}
    public String getName() {
        return //get super() value??;
    }
}

主要课程

public class Main {

public static void main(String[] args) 
{
     Wolf wolfExample = new Wolf();
     Meat meatExample = new Meat();  
     System.out.println("************Wolf\"************");
     System.out.println("Wolves eat " + meatExample.getName());
    }
 }

感谢任何帮助,谢谢。

5 个答案:

答案 0 :(得分:4)

你可以做到

public String getName() {
   return super.getName();
}

虽然您甚至不需要首先覆盖该方法,因为您将super类中的字段 name 声明为public,这意味着它可以可以从任何地方访问。

答案 1 :(得分:1)

简单地写一下:

    public String getName() {
        return name;
    }

这是因为在搜索名为name的变量时,Java按此顺序继续:

  1. 局部变量(无)
  2. 当前班级的字段(无)
  3. 超级类别的字段(找到)
  4. 超级超级领域(等)
  5. 但是,您并不需要首先覆盖子类中的getName()。如果你没有定义它,那么它将继承超类的实现,它完全对应于你想要的行为。因此,你做了额外的工作,没有收获。

答案 2 :(得分:1)

请勿覆盖public String getName()课程中的Meat。 继承允许在Food的所有子类中继承Food的公共和受保护方法,因此在Meat中。

因此Meat Food定义了这种行为:

 public String getName() {
        return name;
    }

返回父类中存储的name字段。

覆盖子类中的方法以编写与父方法完全相同的代码是没用的,不应该这样做,因为它具有误导性。读取代码的人会想:为什么在子类中覆盖该方法,如果它与父类相同?

修改

此外,如果要从子类访问超类中声明的字段,则应该:

  • 如果字段是私有的,则在超类中提供公共getter。在这里:

    public String getName() { return name; }

  • 如果字段具有受保护的修饰符,则直接使用子类中的字段。

作为一般规则,您应该避免使用修饰符public来声明实例字段,因为默认情况下应该保护对象的属性,并且您应该提供仅在需要时修改字段的方法。

因此,宣布您的Meat类似乎更合适:

public class Food {

    //field that stores the name of the food
    private String name; 
    //constructor that takes the name of the food as an argument
    public Food(String name){
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

在你的Meat类中,想象你想在getName()返回的字符串中添加一个附加信息,你可以覆盖它,为什么不使用超类中的字段:

public class Meat extends Food {
   public Meat() {
     super("Meat");
   }

    @Override
    public String getName() {
      return super.getName + "(but don't abuse it)";
   }
}

这里覆盖该方法很有帮助,因为子类中方法的行为与超类中的哪个行为不同。

答案 3 :(得分:0)

其他答案告诉你如何做你想做的事。

但你不应该这样做(在现实生活中的项目中)!

面向对象编程中最重要的原则是封装(又名信息隐藏)。这意味着一个类的内部结构不应该是外部可见或可访问的 因此,所有成员变量都应该是私有的。

此外,您应该避免使用setter / getter方法,因为它们只是重定向访问。 (除了这个类是没有任何逻辑的DTO)。

答案 4 :(得分:-1)

由于food类的方法getName声明为public do

public String getName() {
    return super.getName();
}