Why are Instance variables of a superclass not overidden i开发者_JS百科n Inheritance ?
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.
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.
Because:
It may break the
parent class
code. 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 class
should 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).
精彩评论