オブジェクトの変数に対して「入る」って感覚は捨てるべし。
"aaaa" という記述をすると、メモリ上に String 型のオブジェクトができる。
そして s="aaaa" とするとそのオブジェクトの参照が s に入る。

readLine() は一行読んだ結果をメモリ上にオブジェクトとして作成し、その参照を返す関数。
だから、 str に参照が入る。
new を使わなくてもオブジェクトは作れる。ファクトリとかいうデザインパターンを調べるといいかも。

「変数はものを入れる箱」とかいう概念はプリミティヴ型にしか通用しない。