Adam3920 Adam3920 - 17 days ago 7
Java Question

How to return the value of a super variable?

I'm writing program that demonstrates the use of inheritance and I have created a variable using the super() keyword. I am now trying to place the value of that variable into a new method that calls it so that I can call that method in my main method to use its value within other classes.

Here is the relevant code:

Food class (super class)

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;
}
}


Meat class (sub class with super keyword)

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


Main class

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());
}
}


Any help is appreciated, thanks.

Answer

Don't override public String getName() in Meat class. The inheritance allows to inherit public and protected methods of Food in all subclasses of Food, therefore in Meat.

So Meat which IS a Food has by definition this behavior :

 public String getName() {
        return name;
    }

which returns the name field stored in the parent class.

Overriding a method in subclass to write exactly the same code than in the parent method is useless and should not be done because it is misleading. A person which reads the code will wonder : why having overrided the method in the child class if it does the same thing than the parent class ?


Edit

Besides, if you want to access a field declared in a super class from a subclass, you should :

  • use a public getter if the field is private. Here :

    public String getName() { return name; }

  • use directly the field if the field has the protected modifier.

As a general rule, you should avoid declaring instance fields with the modifier public because by default properties of a object should be protected and you should provide methods to modify the field only if needed.

So, declaring your Meat class like that seems more suitable :

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;
    }
}

In your Meat class, imagine you would like to add an additional information in the string returned by getName(), you could override it and why not using the field from the super class :

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

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

Here overriding the method is helpful because the behavior of the method in the child class differs from which one in the super class.