| If a class has a field of the same name as any field visible to it on any of its | |
| superclasses or superinterfaces, the subclass' field is said to | |
| "[hide](https://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html)" | |
| the superclass' field. | |
| When this circumstance occurs, users of the class declaring the hiding field | |
| can't interact with the fields from the superclass. | |
| Let's take a look at how field hiding might cause problems: | |
| ```java | |
| class Super { | |
| public String foo = "bar"; | |
| } | |
| class Sub extends Super { | |
| private int foo = 0; // the same name, so this hides `Super`'s `foo` | |
| } | |
| class Main { | |
| void stringFn(String s) { /*...*/ } | |
| public static void main(String... args) { | |
| // Looking at the API of `Super`, I should be able to access a string `foo` | |
| // on any object of type `Super` or its subclasses, right? | |
| stringFn(new Sub().foo); // Oops! `foo` is not visible, and the wrong type! | |
| } | |
| } | |
| ``` |