How Does Java Handle Aliasing?
Aliasing means there are multiple aliases to a location that can be updated, and these aliases have different types.
In the following example, a and b are two variable names that have two different types A and B. B extends A.
B[] b = new B[10]; A[] a = b; a[0] = new A(); b[0].methodParent();
In memory, they both refer to the same location.

The pointed memory location are pointed by both a and b. During run-time, the actual object stored determines which method to call.
How does Java handle aliasing problem?
If you copy this code to your eclipse, there will be no compilation errors.
class A {
public void methodParent() {
System.out.println("method in Parent");
}
}
class B extends A {
public void methodParent() {
System.out.println("override method in Child");
}
public void methodChild() {
System.out.println("method in Child");
}
}
public class Main {
public static void main(String[] args) {
B[] b = new B[10];
A[] a = b;
a[0] = new A();
b[0].methodParent();
}
}
But if you run the code, the output would be as follows:
Exception in thread “main” java.lang.ArrayStoreException: aliasingtest.A at aliasingtest.Main.main(Main.java:26)
The reason is that Java handles aliasing during run-time. During run-time, it knows that the first element should be a B object, instead of A.
Therefore, it only runs correctly if it is changed to:
B[] b = new B[10]; A[] a = b; a[0] = new B(); b[0].methodParent();
and the output is:
override method in Child

