FAQ: Inheritance and Polymorphism - Parent Class Aspect Modifiers

This community-built FAQ covers the “Parent Class Aspect Modifiers” exercise from the lesson “Inheritance and Polymorphism”.

Paths and Courses
This exercise can be found in the following Codecademy content:

Learn Java

FAQs on the exercise Parent Class Aspect Modifiers

There are currently no frequently asked questions associated with this exercise – that’s where you come in! You can contribute to this section by offering your own questions, answers, or clarifications on this exercise. Ask or answer a question by clicking reply (reply) below.

If you’ve had an “aha” moment about the concepts, formatting, syntax, or anything else with this exercise, consider sharing those insights! Teaching others and answering their questions is one of the best ways to learn and stay sharp.

Join the Discussion. Help a fellow learner on their journey.

Ask or answer a question about this exercise by clicking reply (reply) below!
You can also find further discussion and get answers to your questions over in #get-help.

Agree with a comment or answer? Like (like) to up-vote the contribution!

Need broader help or resources? Head to #get-help and #community:tips-and-resources. If you are wanting feedback or inspiration for a project, check out #project.

Looking for motivation to keep learning? Join our wider discussions in #community

Learn more about how to use this guide.

Found a bug? Report it online, or post in #community:Codecademy-Bug-Reporting

Have a question about your account or billing? Reach out to our customer support team!

None of the above? Find out where to ask other questions here!

The automatic tutor doesn’t recognize “public final” but only “final public”. Both are valid.

9 Likes

Not only are both valid, public final is “more” correct by typical convention. See this post on Stack Overflow: https://stackoverflow.com/questions/10299067/modifier-keyword-order-in-java

2 Likes

The description states that no modifier and private cannot keep a parent class member accessible to its child classes, only public and protected can. However, in the code, I did not put any modifier in front of the instance variables, but it worked fine. I could access the parent class and child class together. So is the description wrong?

Inside the chart of the properties of the modifiers it should be mentioned that the Child class column is also from another package. As so the no modifier(default) modifier gives access as long as the child class is a part of the same package. (package privacy if you will)

image

As far as my beginner knowledge goes, below is how I define class, child class, and public.
Please correct me if I wrong.
Class: the whole codes inside one text editor
Child class: other ClassName.java that ‘extends’ a class.
public: any other ClassName.java

Any other description or example to better know what a package means?

Velverie

I’m relatively new to Java but have been coding in IntelliJ IDEA. The way the classes work there, are they are all connected because they sit in the same “package”. I believe that is what the chart is referring to. So you would have various .java files but they are all located inside the same package folder.

Although private instance variables are not accessible inside the child classes, are they accessible through the super constructor? In the Ramen example, the Super() constructor passed the “ingredients” into the Noodles constructor and did not return an error saying that the field was private. Is it fair to say then, that the private instance variables ARE accesible through the Super() constructor, but not accessible after it is constructed?

2 Likes

I too noticed this and wondering if why this is so. It worked regardless of “protected” of “private”.

That is because Ramen constructor() and super() method plays a role of Noodle constructor and also they never call the instance variable directly in the Noodle class and super() only passing the value of the instance variables by using the Noodle constructor parameters (like the code below)…Idk…whether am right or wrong its just my understanding if i am wrong please correct me. If you look and compare the below code closely you will get the solution i think :

Noodle (double lenInCent,   double wthInCent,   String shp,   String ingr)
super  (30.0,               0.3,                “flat”,       “wheat flour”);

Correct. super(30.0, 0.3, "flat", "wheat flour") in Ramen is behaving as Noodle(30.0, 0.3, "flat", "wheat flour"). The Super call to parent Noodle is shouldering the responsibility of value assignment at initialization for child Ramen. It’s also allowing the child Ramen to construct without arguments, which Noodle requires.

If you rewrite a Ramen constructor with neither args nor a super() call to the parent class and instead assign values via this.ingredients = "wheat flour" etc., then you will get private access errors, appropriately so.

Removing private or replacing them with protected in the parent Noodle will fix that but you would also need to make sure you have a version of a Noodle constructor that reflects your new Ramen constructor’s signature (ie one with no args required).

public class Noodle {
  
  protected double lengthInCentimeters;
  protected double widthInCentimeters;
  protected String shape;
  protected String ingredients;
  private String texture = "brittle";
  
  Noodle(double lenInCent, double wthInCent, String shp, String ingr) {
    
    this.lengthInCentimeters = lenInCent;
    this.widthInCentimeters = wthInCent;
    this.shape = shp;
    this.ingredients = ingr;
    
  }

  Noodle() {
    System.out.println("Constructor called with no args");
  }
  
}

public class Ramen extends Noodle {
  
  Ramen() {
    // super(30.0, 0.3, "flat", "wheat flour");
    this.lengthInCentimeters = 30.0;
    this.widthInCentimeters = 0.3;
    this.shape = "flat";
    this.ingredients = "wheat flour";
    
  }
  
}
1 Like

Thank you for the more detailed explanation with code example. Thank you…