Q: Using a "char" when creating a new array: int[] a = new int['a'] While creating an array, we can pass short, char, byte, int. So, [why] is int[] a = new int['a'] valid? It doesn't throw a compile time error.
What does an array declaration in this form mean?

A: From JLS Sec 15.10.1:

The type of each dimension expression within a DimExpr must be a type that is convertible (§5.1.8) to an integral type, or a compile-time error occurs.
Each dimension expression undergoes unary numeric promotion (§5.6.1). The promoted type must be int, or a compile-time error occurs.

And from JLS Sec 5.6.1:

If the operand is of compile-time type Byte, Short, Character, or Integer, it is subjected to unboxing conversion (§5.1.8). The result is then promoted to a value of type int by a widening primitive conversion (§5.1.2) or an identity conversion (§5.1.1).

and

Otherwise, if the operand is of compile-time type byte, short, or char, it is promoted to a value of type int by a widening primitive conversion (§5.1.2).

So, any of Byte, Short, Character, Integer, byte, short, char or int are acceptable.
Hence 'a', a char literal, is allowed, and is promoted to the int value 97.

A: Like most times with this kind of questions, the answer lies in the Java Language Specification:

§ 5.1.2. Widening Primitive Conversion
19 specific conversions on primitive types are called the widening primitive conversions:

*

*byte to short, int, long, float, or double

*short to int, long, float, or double

*char to int, long, float, or double

*int to long, float, or double

*long to float or double

*float to double

(Emphasis mine)
It may or may not be intuitive, but a char is actually an integral type, and the Java rules specify that primitive integral types may be converted to an integral type with a lower or higher-capacity. In this case, it's called a widening primitive conversion.

Andy's answer provides more references to the Java Language Specification, and explicitly states that an expression as in your question is valid.

A: According to the JLS §15.10.1 Array Creation Expressions,

The type of each dimension expression within a DimExpr must be a type
that is convertible (§5.1.8) to an integral type, or a compile-time
error occurs.
Each dimension expression undergoes unary numeric
promotion (§5.6.1). The promoted type must be int, or a compile-time
error occurs.

Here, unary numeric promotion occurs. Here is an excerpt from §5.6.1:

...if the operand is of compile-time type byte, short, or char, it is promoted to a value of type int by a widening primitive conversion (§5.1.2).

Therefore, new int['a'] is valid.
If you are wondering how exactly is a char converted to an int, here is the relevant bits from §5.1.2:

A widening conversion of a char to an integral type T zero-extends the representation of the char value to fill the wider format.

Also note that characters are all encoded as integers.

A: In java char is integer type (hello C++). This code do same int[] a = new int[97];

A: a is a char type and it is implicitly casted to an integer with value 97 (ASCII representation, see details here). Therefore you are creating an array of length 97.
