All of this is specified in JLS . Arrays are dynamically created by Object , which implement Serializable and Cloneable .
The reason you come across is because the object is represented in Class#getName .
Since you can use instanceof with reifiable Object types , and the array is very verifiable (that is, concrete, not general), you can use instanceof with arrays:
System.out.println(arr instanceof int[]); // true System.out.println(arr instanceof String[]); // false
The problem with your arr instance Object is that the <X> instanceof Object not useful, since everything is an Object (except for primitives, but using instanceof with primitives is a compile-time error).
source share