Java を純粋なオブジェクト指向言語にする Wrapper クラスがある場合、Java で使用できるプリミティブ データ型があるのはなぜですか?
3 に答える
効率のために。プリミティブ型の変数には、値が直接含まれています。非プリミティブ型の変数は参照であり、メモリ内の別の場所に格納されているオブジェクトを参照します。
ラッパー型の値を使用する必要があるたびに、JVM はメモリ内のオブジェクトをルックアップして値を取得する必要があります。値を含むオブジェクトへの参照ではなく、値自体が変数に含まれるため、これはプリミティブ型には必要ありません。
ただし、Java プログラミング言語でプリミティブ型を明示的に可視にする必要がある理由は説明できません。Java 言語と JVM の設計者は、すべてをオブジェクトとして扱うことができるように、言語自体からプリミティブ型を非表示にすることを選択できました。コンパイラは、それを内部でより効率的なプリミティブ型に変換できます。
JVM で実行される一部の新しいプログラミング言語 (Groovy、Scala など) では、まさにそれが可能です。言語自体では、すべてがオブジェクトのように見えます。たとえば、メソッドを呼び出すことができますが、カバーの下では、コンパイラがそれらを次のように変換します。プリミティブ。
Java 言語が開発されたとき (1990 年代前半) には、人々はそのことを考えていなかったと思います。
プリミティブ データ型が存在する主な理由は、オブジェクトの作成、ヒープの割り当てにコストがかかりすぎて、パフォーマンスが低下するためです。ご存じかもしれませんが、int、float などのプリミティブ データ型が最もよく使用されるため、それらをオブジェクトとして作成すると、パフォーマンスが大幅に低下します。そのため、Java 設計者は、非オブジェクトにする方がよいと考えました。はい、パフォーマンスを少し犠牲にする準備ができているが、OOP のより多くの機能が必要な場合に備えて、ラッパーが存在します。その場合、ラッパーを使用できます。この情報がお役に立てば幸いです。
パフォーマンス上の理由から。SmallTalkのような他の一部の言語では、int や char などの型もオブジェクトであり、メソッドを呼び出すことができます。これは理論的にはより正確ですが、現在の実装では実行速度が遅くなります。プリミティブ型は、純度とパフォーマンスの妥協点です。
さらに必要な場合 (null 値が可能であるか、コレクション フレームワークで使用する場合)、Java は java.lang.Integer などのラッパー クラスを提供します。