Cばっかやってるっていってるんだから、C++じゃなくてCで説明したほうが
よかないか。

・Object objは、HogeRec *hogeRecみたいなもん。
・Object[] objs は、HogeRec *hogeRecsみたいなもん。つまり上と変わらん。
・obj = new Object() は hogeRec = malloc( sizeof( HogeRec)) みたいなもん。
・objs = new Object[5]は、hogeRecs = malloc( sizeof( HogeRec) * 5)みたいなもん。

だからString[] s = new String[10] は stringArray = malloc( sizeof( String) * 10) のようなものに過ぎん。
そりゃCでもstringArray[0]とか参照したら、「なにいってんの?」すら言ってくれずにバスエラーだろ。
「文字列10個つくっちゃったぞー」ではなくて、「文字列10個分のメモリ確保したぞー」なわけだから。

おれは上記のような理解でいったので、そこでは躓かなかったなあ。

誤解を恐れずに言えば、JavaにはCのような意味での「配列」という型はないんだな。
あるのは「Arrayクラス」だけ。でStringが言語仕様に組み込まれているのと同じように、Arrayも
言語仕様に組み込まれている.....というよりも特別扱いされてて、なんとなくCっぽく使えるようになって
るけど、基本的にはやっぱりオブジェクトであることに変わりはない。