Why are Instance variables of a superclass not overidden in Inheritance ?
3 Answers
You can hide a field, but not override it.
Hiding means that a field will have a different value depending from which class it's accessed. The field in the subclass will "hide" the field in the super-class, but both exists.
That's an extremely bad practice to hide field, but works:
public class HideField {
public static class A
{
String name = "a";
public void doIt1() { System.out.println( name ); };
public void doIt2() { System.out.println( name ); };
}
public static class B extends A
{
String name = "b";
public void doIt2() { System.out.println( name ); };
}
public static void main(String[] args)
{
A a = new A();
B b = new B();
a.doIt1(); // print a
b.doIt1(); // print a
a.doIt2(); // print a
b.doIt2(); // print b <-- B.name hides A.name
}
}
Depending on whether the method was overriden, the field in A or B is accessed.
Never do that! That's never the solution to your problem and creates very subtle bugs related to inheritance.
5 Comments
Because inheritance is intended to modify behaviour. Behaviour is exposed through methods, and that's why they can be overridden.
Fields are not behaviour but state. You don't need to modify that, nor the private methods employed by the superclass. They are intended to allow the superclass to do it's job.
Comments
Because:
It may break the
parent classcode. For example consider following code(What would be behavior of lineobB.getInt();in following code if, instance variables overriding is allowed):class A { int aInt; public int getInt() { return aInt; } } class B extends A { int aInt; public int getInt2() { return aInt; } public static void main(String[] args) { B obB = new B(); //What would be behavior in following line if, //instance variables overriding is allowed obB.getInt(); } }It is not logical because
child classshould have/reflect all behaviours ofparent class.
So, you can only hide the inherited methods/variables in child class but can't override.
Following is an extract from Java doc from Oracle specifying what operation you can perform/expect from child class:
You can use the inherited members as is, replace them, hide them, or supplement them with new members:
- The inherited fields can be used directly, just like any other fields.
- You can declare a field in the subclass with the same name as the one in the superclass, thus hiding it (not recommended).